Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/neutrinolabs/libpainter.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJay Sorg <jay.sorg@gmail.com>2015-08-01 22:29:21 +0300
committerJay Sorg <jay.sorg@gmail.com>2015-08-01 22:29:21 +0300
commit8e43175ebd018a6c53d7a5798d15237ebf04167f (patch)
tree2ac63370ac4fdc2a03ee357e509db3c767ae1c74
parent991e489627c413eb32c28a651d0009938050bb3a (diff)
work on painter
-rw-r--r--src/painter.c12
-rw-r--r--src/painter_utils.c56
-rw-r--r--src/painter_utils.h24
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;