From 289e862695a6194ade9f7782cab63a7cbc19c066 Mon Sep 17 00:00:00 2001 From: Marcin Bukat Date: Wed, 29 Sep 2010 20:38:08 +0000 Subject: [PATCH] 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 --- apps/plugins/lib/bmp_smooth_scale.c | 7 +++++++ apps/plugins/lib/pluginlib_bmp.c | 29 +++++++++++++++++++++-------- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/apps/plugins/lib/bmp_smooth_scale.c b/apps/plugins/lib/bmp_smooth_scale.c index 4d5eab00a0..e99ff33d71 100644 --- a/apps/plugins/lib/bmp_smooth_scale.c +++ b/apps/plugins/lib/bmp_smooth_scale.c @@ -78,10 +78,17 @@ void smooth_resize_bitmap(struct bitmap *src_bmp, struct bitmap *dest_bmp) fb_data *sptr, *dptr; int x, y, end; 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 sh = src_bmp->height; const int dw = dest_bmp->width; const int dh = dest_bmp->height; +#endif const int inc_x = (sw << 16) / dw; const int inc_y = (sh << 16) / dh; const int Cp_x = ((dw << 14) / sw) + 1; diff --git a/apps/plugins/lib/pluginlib_bmp.c b/apps/plugins/lib/pluginlib_bmp.c index 148aa8e1de..708abfa4a4 100644 --- a/apps/plugins/lib/pluginlib_bmp.c +++ b/apps/plugins/lib/pluginlib_bmp.c @@ -86,31 +86,45 @@ int save_bmp_file( char* filename, struct bitmap *bm ) rb->close( fh ); return 1; } -#endif +#endif /* HAVE_LCD_COLOR */ /** Very simple image scale from src to dst (nearest neighbour). 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) { +#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 srch = src->height; const int dstw = dst->width; const int dsth = dst->height; - const fb_data *srcd = (fb_data*)(src->data); - const fb_data *dstd = (fb_data*)(dst->data); - +#endif + 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 yrstep = ((srch-1) << 8) / (dsth-1); - fb_data *src_row, *dst_row; + FB_DATA *src_row, *dst_row; long xr, yr = 0; int src_x, src_y, dst_x, dst_y; for (dst_y=0; dst_y < dsth; dst_y++) { src_y = (yr >> 8); - src_row = (fb_data*)&srcd[src_y * srcw]; - dst_row = (fb_data*)&dstd[dst_y * dstw]; + src_row = (FB_DATA *)&srcd[src_y * srcw]; + dst_row = (FB_DATA *)&dstd[dst_y * dstw]; for (xr=0,dst_x=0; dst_x < dstw; dst_x++) { src_x = (xr >> 8); @@ -120,7 +134,6 @@ void simple_resize_bitmap(struct bitmap *src, struct bitmap *dst) yr += yrstep; } } - #endif /* LCD_DEPTH > 1 */ #include "wrappers.h"