diff options
author | Thomas Martitz <kugel@rockbox.org> | 2011-03-05 20:09:41 +0000 |
---|---|---|
committer | Thomas Martitz <kugel@rockbox.org> | 2011-03-05 20:09:41 +0000 |
commit | edea12b21e986a2439bcb8fe786e6ff992a22ca7 (patch) | |
tree | e3252cedf2e98077407d5f0774a01d233a1d5f9e | |
parent | 222e1ad84591f3aac29dac297924b16eb390f3e7 (diff) | |
download | rockbox-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.c | 37 | ||||
-rw-r--r-- | firmware/drivers/lcd-16bit.c | 32 |
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; |