diff options
author | Jay Sorg <jay.sorg@gmail.com> | 2015-08-01 22:29:21 +0300 |
---|---|---|
committer | Jay Sorg <jay.sorg@gmail.com> | 2015-08-01 22:29:21 +0300 |
commit | 8e43175ebd018a6c53d7a5798d15237ebf04167f (patch) | |
tree | 2ac63370ac4fdc2a03ee357e509db3c767ae1c74 | |
parent | 991e489627c413eb32c28a651d0009938050bb3a (diff) |
work on painter
-rw-r--r-- | src/painter.c | 12 | ||||
-rw-r--r-- | src/painter_utils.c | 56 | ||||
-rw-r--r-- | src/painter_utils.h | 24 |
3 files changed, 87 insertions, 5 deletions
diff --git a/src/painter.c b/src/painter.c index ad8413e..21486a1 100644 --- a/src/painter.c +++ b/src/painter.c @@ -145,6 +145,18 @@ int painter_fill_rect(void *handle, struct painter_bitmap *dst, int x, int y, int cx, int cy) { + int index; + int jndex; + struct painter *pt; + + pt = (struct painter *) handle; + for (jndex = 0; jndex < cy; jndex++) + { + for (index = 0; index < cx; index++) + { + painter_set_pixel(pt, dst, x, y, pt->fgcolor, dst->format); + } + } return PT_ERROR_NONE; } diff --git a/src/painter_utils.c b/src/painter_utils.c index 67644fa..60d31b3 100644 --- a/src/painter_utils.c +++ b/src/painter_utils.c @@ -72,15 +72,52 @@ bitmap_get_ptr(struct painter_bitmap *bitmap, int x, int y) /*****************************************************************************/ static int -bitmap_get_pixel(struct painter_bitmap *dst, int x, int y) +bitmap_get_pixel(struct painter_bitmap *bitmap, int x, int y) { + char *ptr; + + ptr = bitmap_get_ptr(bitmap, x, y); + switch (bitmap->format) + { + case PT_FORMAT_a8b8g8r8: + return *((unsigned int *) ptr); + case PT_FORMAT_a8r8g8b8: + return *((unsigned int *) ptr); + case PT_FORMAT_r5g6b5: + return *((unsigned short *) ptr); + case PT_FORMAT_a1r5g5b5: + return *((unsigned short *) ptr); + case PT_FORMAT_r3g3b2: + return *((unsigned char *) ptr); + } return 0; } /*****************************************************************************/ static int -bitmap_set_pixel(struct painter_bitmap *dst, int x, int y, int pixel) +bitmap_set_pixel(struct painter_bitmap *bitmap, int x, int y, int pixel) { + char *ptr; + + ptr = bitmap_get_ptr(bitmap, x, y); + switch (bitmap->format) + { + case PT_FORMAT_a8b8g8r8: + *((unsigned int *) ptr) = pixel; + break; + case PT_FORMAT_a8r8g8b8: + *((unsigned int *) ptr) = pixel; + break; + case PT_FORMAT_r5g6b5: + *((unsigned short *) ptr) = pixel; + break; + case PT_FORMAT_a1r5g5b5: + *((unsigned short *) ptr) = pixel; + break; + case PT_FORMAT_r3g3b2: + *((unsigned char *) ptr) = pixel; + break; + } return 0; } @@ -100,12 +137,21 @@ pixel_convert(int pixel, int src_format, int dst_format, int *palette) } switch (src_format) { + case PT_FORMAT_a8b8g8r8: + SPLIT_a8b8g8r8(pixel, a, r, g, b); + break; + case PT_FORMAT_a8r8g8b8: + SPLIT_a8r8g8b8(pixel, a, r, g, b); + break; case PT_FORMAT_a1r5g5b5: SPLIT_a1r5g5b5(pixel, a, r, g, b); break; case PT_FORMAT_r5g6b5: SPLIT_r5g6b5(pixel, a, r, g, b); break; + case PT_FORMAT_r3g3b2: + SPLIT_r3g3b2(pixel, a, r, g, b); + break; } rv = 0; switch (dst_format) @@ -122,9 +168,9 @@ int painter_set_pixel(struct painter *painter, struct painter_bitmap *dst, int x, int y, int pixel, int pixel_format) { - if (painter->clip_valid == 0 || - (x >= painter->clip.x1 && x < painter->clip.x2 && - y >= painter->clip.y1 && y < painter->clip.y2)) + if ((painter->clip_valid == 0) || + ((x >= painter->clip.x1) && (x < painter->clip.x2) && + (y >= painter->clip.y1) && (y < painter->clip.y2))) { if ((x >= 0) && (x < dst->width) && (y >= 0) && (y < dst->height)) diff --git a/src/painter_utils.h b/src/painter_utils.h index 87a7f5a..aefc9e2 100644 --- a/src/painter_utils.h +++ b/src/painter_utils.h @@ -19,6 +19,22 @@ #if !defined(__PAINTER_UTILS_H) #define __PAINTER_UTILS_H +#define SPLIT_a8r8g8b8(c, a, r, g, b) \ +do { \ + a = (c & 0xff000000) >> 24; \ + r = (c & 0x00ff0000) >> 16; \ + g = (c & 0x0000ff00) >> 8; \ + b = (c & 0x000000ff) >> 0; \ +} while (0) + +#define SPLIT_a8b8g8r8(c, a, r, g, b) \ +do { \ + a = (c & 0xff000000) >> 24; \ + b = (c & 0x00ff0000) >> 16; \ + g = (c & 0x0000ff00) >> 8; \ + r = (c & 0x000000ff) >> 0; \ +} while (0) + #define SPLIT_a1r5g5b5(c, a, r, g, b) \ do { \ a = (c & 0x8000) ? 0xff : 0; \ @@ -35,6 +51,14 @@ do { \ b = ((c << 3) & 0xf8) | ((c >> 2) & 0x7); \ } while (0) +#define SPLIT_r3g3b2(c, a, r, g, b) \ +do { \ + a = 0xff; \ + r = 0; \ + g = 0; \ + b = 0; \ +} while (0) + struct painter_rect { short x1; |