/** * gif的转换,gif有1-8bits,所以独立出来 * @param map 调色板 * @param depth 色深 * @param row_buffer row buffer * @param width 图片宽度 * @param dest rgb565目标缓存区 */ void gif_convert_irgb_to_rgb565(Image *image,UINT16 depth,UINT8* row_buffer,UINT32 current_height,UINT8* data_source) { UINT32 i,index; UINT8* dest; UINT32 width=image->width,found_index; RGBMap * map = &image->rgb; for(i=0;i<image->new_height;i++){ if(current_height == height_index[i]){ //找到则这行是有用的 found_index = i; break; } } if(i==image->new_height) return; // 这行在新行中没被映射到 dest = rgb_row_buffer; //转换成rgb row buffer if(depth>=1 && depth<=8){ for(i=0;i<width;i++){ index = row_buffer[i]; *(UINT16*)dest = RGB_TO_565(map->red[index],map->green[index],map->blue[index]); dest += 2; } } __resize_image(image,current_height,found_index,rgb_row_buffer,data_source); return; }
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "BaseView.h" #include "defines.h" /** * Base class for a display view */ const uint16_t LINE_GRAY = RGB_TO_565(150, 150, 150); //! Constructor BaseView::BaseView() : m_active(false) { } //! Destructor BaseView::~BaseView() { } //! This view is now enabled and displayed void BaseView::activate() { m_active = true;
static void __convert_irgb_to_rgb565(Image *image,UINT16 depth,UINT8* row_buffer,UINT8 *output_row_buffer) { INT32 i, j, index, width; UINT8 r,g,b,tmp; RGBMap *map = &image->rgb; UINT8 * dest = output_row_buffer; width = image->width; switch(depth){ case 1: { int c,d; d = width / 8; c = width % 8; for(i=0;i<d;i++){ tmp = row_buffer[i]; for(j=0;j<8;j++){ index = (tmp & 0x80)>>7; tmp = tmp<<1; *(UINT16*)(dest+j*2) = RGB_TO_565(map->red[index],map->green[index],map->blue[index]); } dest += 16; } if(c){ tmp = row_buffer[i]; for(j=0;j<c;j++){ index = (tmp & 0x80)>>7; tmp = tmp<<1; *(UINT16*)(dest+j*2) = RGB_TO_565(map->red[index],map->green[index],map->blue[index]); } dest += 2*c; } break; } case 4: { int c,d; d = width / 2; c = width % 2; for(i=0;i<d;i++){ tmp = row_buffer[i]; index = tmp >> 4; r = map->red[index]>>3; g = map->green[index]>>2; b = map->blue[index]>>3; *(UINT16*)dest = (g<<5)+(r<<11)+b; dest += 2; index = tmp & 0xF; *(UINT16*)dest = RGB_TO_565(map->red[index],map->green[index],map->blue[index]); dest += 2; } if(c){ tmp = row_buffer[i]; index = tmp >> 4; *(UINT16*)dest = RGB_TO_565(map->red[index],map->green[index],map->blue[index]); dest += 2; } break; } case 5: // 4 bit rle,由于读取时编码不同,所以采用5来单独处理这个case for(i=0;i<width;i++){ index = row_buffer[i]&0xf; *(UINT16*)dest = RGB_TO_565(map->red[index],map->green[index],map->blue[index]); dest += 2; } break; case 8: for(i=0;i<width;i++){ index = row_buffer[i]; *(UINT16*)dest = RGB_TO_565(map->red[index],map->green[index],map->blue[index]); dest += 2; } break; case 16: for(i=0;i<width;i++){ index = 2*i; *dest = *(row_buffer+2*i); *(dest+1) = *(row_buffer+2*i+1); dest +=2; } break; case 24: for(i=0;i<width;i++){ index = 3*i; *(UINT16*)dest = RGB_TO_565(row_buffer[index+2],row_buffer[index+1],row_buffer[index]); dest += 2; } break; default: return; } }
/** * jpg的转换,jpeg只有8bit和24bit两种,因为24bit是RGB ,而BMP是BGR所以要分开。 * @param map 调色板 * @param depth 色深 * @param row_buffer row buffer * @param width 图片宽度 * @param dest rgb565目标缓存区 */ void jpg_convert_irgb_to_rgb565(Image *image, UINT16 depth, UINT8* row_buffer, UINT32 current_height, UINT8* data_source, BOOL smooth) { UINT32 i,index; UINT8* dest; UINT32 width = image->width,found_index; RGBMap * map = &image->rgb; if(depth == 24 && smooth == TRUE){ if(need_next_line == 0){ for(i = 0;i < image->new_height;i++){ if(current_height == height_index[i]){ //找到则这行是有用的 found_index = i; if((i < image->new_height - 1) && (height_index[i+1] > current_height+1)){ __jpeg_resize_image(image,row_buffer,rgb_row_buffer2,smooth); need_next_line = 1; last_found_index = i; return; } break; } } if(i == image->new_height) return; // 这行在新行中没被映射到 } __jpeg_resize_image(image, row_buffer, rgb_row_buffer, smooth); if(need_next_line) dest = data_source + image->new_width * 2 * last_found_index; else dest = data_source + image->new_width * 2 * found_index; for(i = 0;i < image->new_width;i++){ index = 3 * i; if(need_next_line){ *(UINT16*)dest = RGB_TO_565((rgb_row_buffer2[index]/2 + rgb_row_buffer[index]/2), (rgb_row_buffer2[index+1]/2 + rgb_row_buffer[index+1]/2), (rgb_row_buffer2[index+2]/2 + rgb_row_buffer[index+2]/2)); } else{ *(UINT16*)dest = RGB_TO_565(rgb_row_buffer[index], rgb_row_buffer[index + 1], rgb_row_buffer[index + 2]); } dest += 2; } if(need_next_line) need_next_line=0; return; } else if(depth == 24 && smooth == FALSE){ for(i = 0;i < image->new_height; i++){ if(current_height == height_index[i]){ //找到则这行是有用的 found_index = i; break; } } if(i==image->new_height) return; // 这行在新行中没被映射到 __jpeg_resize_image(image,row_buffer,rgb_row_buffer,smooth); // memcpy(rgb_row_buffer, row_buffer, image->new_width * 2); dest = data_source + image->new_width * 2 * found_index; for(i = 0;i < image->new_width;i++){ index = 3 * i; *(UINT16*)dest = RGB_TO_565(rgb_row_buffer[index],rgb_row_buffer[index+1],rgb_row_buffer[index+2]); dest += 2; } return; } else if(depth == 8){ for(i=0;i<image->new_height;i++){ if(current_height == height_index[i]){ //找到则这行是有用的 found_index = i; break; } } if(i==image->new_height) return; // 这行在新行中没被映射到 dest = rgb_row_buffer; //转换成rgb row buffer for(i=0;i<width;i++){ index = row_buffer[i]; *(UINT16*)dest = RGB_TO_565(map->red[index],map->green[index],map->blue[index]); dest += 2; } __resize_image(image,current_height,found_index,rgb_row_buffer,data_source); return; } }