summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Martitz <kugel@rockbox.org>2011-03-05 20:09:41 +0000
committerThomas Martitz <kugel@rockbox.org>2011-03-05 20:09:41 +0000
commitedea12b21e986a2439bcb8fe786e6ff992a22ca7 (patch)
treee3252cedf2e98077407d5f0774a01d233a1d5f9e
parent222e1ad84591f3aac29dac297924b16eb390f3e7 (diff)
downloadrockbox-edea12b21e986a2439bcb8fe786e6ff992a22ca7.tar.gz
rockbox-edea12b21e986a2439bcb8fe786e6ff992a22ca7.zip
Add viewport clipping to lcd_alpha_bitmap_part as lcd_mono_bitmap_part also has.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29526 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/drivers/lcd-16bit-vert.c37
-rw-r--r--firmware/drivers/lcd-16bit.c32
2 files changed, 65 insertions, 4 deletions
diff --git a/firmware/drivers/lcd-16bit-vert.c b/firmware/drivers/lcd-16bit-vert.c
index 87a49e1249..552d80c5aa 100644
--- a/firmware/drivers/lcd-16bit-vert.c
+++ b/firmware/drivers/lcd-16bit-vert.c
@@ -998,6 +998,7 @@ void ICODE_ATTR lcd_alpha_bitmap_part(const unsigned char *src, int src_x,
998 if (y + height > current_vp->height) 998 if (y + height > current_vp->height)
999 height = current_vp->height - y; 999 height = current_vp->height - y;
1000 1000
1001
1001 if (drmode & DRMODE_INVERSEVID) 1002 if (drmode & DRMODE_INVERSEVID)
1002 { 1003 {
1003 dmask = 0xffffffff; 1004 dmask = 0xffffffff;
@@ -1008,7 +1009,37 @@ void ICODE_ATTR lcd_alpha_bitmap_part(const unsigned char *src, int src_x,
1008 dmask = ~dmask; 1009 dmask = ~dmask;
1009 } 1010 }
1010 1011
1011 dst_row = dst = LCDADDR(current_vp->x + x, current_vp->y + y); 1012 /* adjust for viewport */
1013 x += current_vp->x;
1014 y += current_vp->y;
1015
1016#if defined(HAVE_VIEWPORT_CLIP)
1017 /********************* Viewport on screen clipping ********************/
1018 /* nothing to draw? */
1019 if ((x >= LCD_WIDTH) || (y >= LCD_HEIGHT)
1020 || (x + width <= 0) || (y + height <= 0))
1021 return;
1022
1023 /* clip image in viewport in screen */
1024 if (x < 0)
1025 {
1026 width += x;
1027 src_x -= x;
1028 x = 0;
1029 }
1030 if (y < 0)
1031 {
1032 height += y;
1033 src_y -= y;
1034 y = 0;
1035 }
1036 if (x + width > LCD_WIDTH)
1037 width = LCD_WIDTH - x;
1038 if (y + height > LCD_HEIGHT)
1039 height = LCD_HEIGHT - y;
1040#endif
1041
1042 dst_row = dst = LCDADDR(x, y);
1012 1043
1013 1044
1014 int col, row = height; 1045 int col, row = height;
@@ -1035,8 +1066,8 @@ void ICODE_ATTR lcd_alpha_bitmap_part(const unsigned char *src, int src_x,
1035 do 1066 do
1036 { 1067 {
1037 col = width; 1068 col = width;
1038 dst = dst_row; 1069 dst = dst_row++;
1039 dst_row++; 1070
1040#ifdef ALPHA_BITMAP_READ_WORDS 1071#ifdef ALPHA_BITMAP_READ_WORDS
1041#define UPDATE_SRC_ALPHA do { \ 1072#define UPDATE_SRC_ALPHA do { \
1042 if (--pixels) \ 1073 if (--pixels) \
diff --git a/firmware/drivers/lcd-16bit.c b/firmware/drivers/lcd-16bit.c
index a2eb3e630c..2017a7e5ab 100644
--- a/firmware/drivers/lcd-16bit.c
+++ b/firmware/drivers/lcd-16bit.c
@@ -989,6 +989,36 @@ void ICODE_ATTR lcd_alpha_bitmap_part(const unsigned char *src, int src_x,
989 if (y + height > current_vp->height) 989 if (y + height > current_vp->height)
990 height = current_vp->height - y; 990 height = current_vp->height - y;
991 991
992 /* adjust for viewport */
993 x += current_vp->x;
994 y += current_vp->y;
995
996#if defined(HAVE_VIEWPORT_CLIP)
997 /********************* Viewport on screen clipping ********************/
998 /* nothing to draw? */
999 if ((x >= LCD_WIDTH) || (y >= LCD_HEIGHT)
1000 || (x + width <= 0) || (y + height <= 0))
1001 return;
1002
1003 /* clip image in viewport in screen */
1004 if (x < 0)
1005 {
1006 width += x;
1007 src_x -= x;
1008 x = 0;
1009 }
1010 if (y < 0)
1011 {
1012 height += y;
1013 src_y -= y;
1014 y = 0;
1015 }
1016 if (x + width > LCD_WIDTH)
1017 width = LCD_WIDTH - x;
1018 if (y + height > LCD_HEIGHT)
1019 height = LCD_HEIGHT - y;
1020#endif
1021
992 if (drmode & DRMODE_INVERSEVID) 1022 if (drmode & DRMODE_INVERSEVID)
993 { 1023 {
994 dmask = 0xffffffff; 1024 dmask = 0xffffffff;
@@ -999,7 +1029,7 @@ void ICODE_ATTR lcd_alpha_bitmap_part(const unsigned char *src, int src_x,
999 dmask = ~dmask; 1029 dmask = ~dmask;
1000 } 1030 }
1001 1031
1002 dst = LCDADDR(current_vp->x + x, current_vp->y + y); 1032 dst = LCDADDR(x, y);
1003 1033
1004 int col, row = height; 1034 int col, row = height;
1005 unsigned data, pixels; 1035 unsigned data, pixels;