1
0
Fork 0
forked from len0rd/rockbox

fix bitmap scallers smooth_resize_bitmap() and simple_resize_bitmap() to properly handle LCD_STRIDEFORMAT == VERTICAL_STRIDE case

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28185 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Marcin Bukat 2010-09-29 20:38:08 +00:00
parent 717f0bd982
commit 289e862695
2 changed files with 28 additions and 8 deletions

View file

@ -78,10 +78,17 @@ void smooth_resize_bitmap(struct bitmap *src_bmp, struct bitmap *dest_bmp)
fb_data *sptr, *dptr; fb_data *sptr, *dptr;
int x, y, end; int x, y, end;
int val_y = 0, val_x; int val_y = 0, val_x;
#if defined(LCD_STRIDEFORMAT) && LCD_STRIDEFORMAT == VERTICAL_STRIDE
const int sw = src_bmp->height;
const int sh = src_bmp->width;
const int dw = dest_bmp->height;
const int dh = dest_bmp->width;
#else
const int sw = src_bmp->width; const int sw = src_bmp->width;
const int sh = src_bmp->height; const int sh = src_bmp->height;
const int dw = dest_bmp->width; const int dw = dest_bmp->width;
const int dh = dest_bmp->height; const int dh = dest_bmp->height;
#endif
const int inc_x = (sw << 16) / dw; const int inc_x = (sw << 16) / dw;
const int inc_y = (sh << 16) / dh; const int inc_y = (sh << 16) / dh;
const int Cp_x = ((dw << 14) / sw) + 1; const int Cp_x = ((dw << 14) / sw) + 1;

View file

@ -86,31 +86,45 @@ int save_bmp_file( char* filename, struct bitmap *bm )
rb->close( fh ); rb->close( fh );
return 1; return 1;
} }
#endif #endif /* HAVE_LCD_COLOR */
/** /**
Very simple image scale from src to dst (nearest neighbour). Very simple image scale from src to dst (nearest neighbour).
Source and destination dimensions are read from the struct bitmap. Source and destination dimensions are read from the struct bitmap.
FB_DATA define is to properly scale with greylib
*/ */
#if LCD_DEPTH > 8
#define FB_DATA fb_data
#else
#define FB_DATA unsigned char
#endif
void simple_resize_bitmap(struct bitmap *src, struct bitmap *dst) void simple_resize_bitmap(struct bitmap *src, struct bitmap *dst)
{ {
#if defined(LCD_STRIDEFORMAT) && \
(LCD_STRIDEFORMAT == VERTICAL_STRIDE)
const int srcw = src->height;
const int srch = src->width;
const int dstw = dst->height;
const int dsth = dst->width;
#else
const int srcw = src->width; const int srcw = src->width;
const int srch = src->height; const int srch = src->height;
const int dstw = dst->width; const int dstw = dst->width;
const int dsth = dst->height; const int dsth = dst->height;
const fb_data *srcd = (fb_data*)(src->data); #endif
const fb_data *dstd = (fb_data*)(dst->data); const FB_DATA *srcd = (FB_DATA *)(src->data);
const FB_DATA *dstd = (FB_DATA *)(dst->data);
const long xrstep = ((srcw-1) << 8) / (dstw-1); const long xrstep = ((srcw-1) << 8) / (dstw-1);
const long yrstep = ((srch-1) << 8) / (dsth-1); const long yrstep = ((srch-1) << 8) / (dsth-1);
fb_data *src_row, *dst_row; FB_DATA *src_row, *dst_row;
long xr, yr = 0; long xr, yr = 0;
int src_x, src_y, dst_x, dst_y; int src_x, src_y, dst_x, dst_y;
for (dst_y=0; dst_y < dsth; dst_y++) for (dst_y=0; dst_y < dsth; dst_y++)
{ {
src_y = (yr >> 8); src_y = (yr >> 8);
src_row = (fb_data*)&srcd[src_y * srcw]; src_row = (FB_DATA *)&srcd[src_y * srcw];
dst_row = (fb_data*)&dstd[dst_y * dstw]; dst_row = (FB_DATA *)&dstd[dst_y * dstw];
for (xr=0,dst_x=0; dst_x < dstw; dst_x++) for (xr=0,dst_x=0; dst_x < dstw; dst_x++)
{ {
src_x = (xr >> 8); src_x = (xr >> 8);
@ -120,7 +134,6 @@ void simple_resize_bitmap(struct bitmap *src, struct bitmap *dst)
yr += yrstep; yr += yrstep;
} }
} }
#endif /* LCD_DEPTH > 1 */ #endif /* LCD_DEPTH > 1 */
#include "wrappers.h" #include "wrappers.h"