From c0568cd7ef9542540b11068c002bb6a8d35f3d84 Mon Sep 17 00:00:00 2001 From: Derek Foreman Date: Wed, 26 Mar 2003 05:38:13 +0000 Subject: [PATCH] rgba icon rendering --- render/image.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++ render/image.h | 9 +++++++ 2 files changed, 73 insertions(+) create mode 100644 render/image.c create mode 100644 render/image.h diff --git a/render/image.c b/render/image.c new file mode 100644 index 00000000..5bd3285b --- /dev/null +++ b/render/image.c @@ -0,0 +1,64 @@ +#include +#include "../kernel/geom.h" +#include "image.h" + +void image_draw(pixel32 *target, TextureRGBA *rgba, Rect *position) +{ + unsigned long *draw = rgba->data; + int c, sfw, sfh; + unsigned int i, e, bgi; + sfw = position->width; + sfh = position->height; + + g_assert(rgba->data != NULL); + + if ((rgba->width != sfw || rgba->height != sfh) && + (rgba->width != rgba->cwidth || rgba->height != rgba->cheight)) { + double dx = rgba->width / (double)sfw; + double dy = rgba->height / (double)sfh; + double px = 0.0; + double py = 0.0; + int iy = 0; + + /* scale it and cache it */ + if (rgba->cache != NULL) + g_free(rgba->cache); + rgba->cache = g_new(unsigned long, sfw * sfh); + rgba->cwidth = sfw; + rgba->cheight = sfh; + for (i = 0, c = 0, e = sfw*sfh; i < e; ++i) { + rgba->cache[i] = rgba->data[(int)px + iy]; + if (++c >= sfw) { + c = 0; + px = 0; + py += dy; + iy = (int)py * rgba->width; + } else + px += dx; + } + +/* do we use the cache we may have just created, or the original? */ + if (rgba->width != sfw || rgba->height != sfh) + draw = rgba->cache; + + /* apply the alpha channel */ + for (i = 0, c = 0, e = sfw*sfh; i < e; ++i, ++bgi) { + unsigned char alpha = draw[i] >> 24; + unsigned char r = draw[i] >> 16; + unsigned char g = draw[i] >> 8; + unsigned char b = draw[i]; + + /* background color */ + unsigned char bgr = target[i] >> default_red_shift; + unsigned char bgg = target[i] >> default_green_shift; + unsigned char bgb = target[i] >> default_blue_shift; + + r = bgr + (((r - bgr) * alpha) >> 8); + g = bgg + (((g - bgg) * alpha) >> 8); + b = bgb + (((b - bgb) * alpha) >> 8); + + target[i] = (r << default_red_shift) | (g << default_green_shift) | + (b << default_blue_shift); + } + } +} diff --git a/render/image.h b/render/image.h new file mode 100644 index 00000000..b29a7304 --- /dev/null +++ b/render/image.h @@ -0,0 +1,9 @@ +#ifndef __image_h +#define __image_h + +#include "render.h" +#include "../kernel/geom.h" + +void image_draw(pixel32 *target, TextureRGBA *rgba, Rect *position); + +#endif -- 2.39.2