Exemple #1
0
/** 
 * 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;
Exemple #3
0
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;
     }
}
Exemple #4
0
/** 
 * 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;
     }
}