- Implement text foreground color
- Be consistent about reading and writing pixel values to avoid casting/offset madness - clean up function names for clarity/consistency - Fix fence post errors preventing get/set pixels from operating on first row/column - Enforce mutual exclusivity for pixel layout macros
This commit is contained in:
parent
bbc8c925dc
commit
6d24023d98
@ -35,7 +35,7 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#define RAWFB_RGBX_8888
|
#define RAWFB_XRGB_8888
|
||||||
#define NK_INCLUDE_FIXED_TYPES
|
#define NK_INCLUDE_FIXED_TYPES
|
||||||
#define NK_INCLUDE_STANDARD_IO
|
#define NK_INCLUDE_STANDARD_IO
|
||||||
#define NK_INCLUDE_STANDARD_VARARGS
|
#define NK_INCLUDE_STANDARD_VARARGS
|
||||||
|
@ -70,26 +70,50 @@ struct rawfb_context {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
static unsigned int
|
static unsigned int
|
||||||
nk_color_from_byte(const nk_byte *c)
|
nk_rawfb_color2int(const struct nk_color c)
|
||||||
{
|
{
|
||||||
unsigned int res = 0;
|
unsigned int res = 0;
|
||||||
#if defined(RAWFB_RGBX_8888)
|
#if defined(RAWFB_RGBX_8888) && !defined(RAWFB_XRGB_8888)
|
||||||
res |= (unsigned int)c[0] << 16;
|
res |= c.r << 24;
|
||||||
res |= (unsigned int)c[1] << 8;
|
res |= c.g << 16;
|
||||||
res |= (unsigned int)c[2] << 0;
|
res |= c.b << 8;
|
||||||
#elif defined(RAWFB_XRGB_8888)
|
res |= c.a;
|
||||||
res = ((unsigned int *)c)[0];
|
#elif defined(RAWFB_XRGB_8888) && !defined(RAWFB_RGBX_8888)
|
||||||
|
res |= c.a << 24;
|
||||||
|
res |= c.r << 16;
|
||||||
|
res |= c.g << 8;
|
||||||
|
res |= c.b << 0;
|
||||||
#else
|
#else
|
||||||
#error Define one of RAWFB_RGBX_8888 , RAWFB_XRGB_8888
|
#error Define one of RAWFB_RGBX_8888 , RAWFB_XRGB_8888
|
||||||
#endif
|
#endif
|
||||||
return (res);
|
return (res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct nk_color
|
||||||
|
nk_rawfb_int2color(const unsigned int i)
|
||||||
|
{
|
||||||
|
struct nk_color col;
|
||||||
|
#if defined(RAWFB_RGBX_8888) && !defined(RAWFB_XRGB_8888)
|
||||||
|
col.r = (i >> 24) & 0xff;
|
||||||
|
col.g = (i >> 16) & 0xff;
|
||||||
|
col.b = (i >> 8) & 0xff;
|
||||||
|
col.a = (i >> 0) & 0xff;
|
||||||
|
#elif defined(RAWFB_XRGB_8888) && !defined(RAWFB_RGBX_8888)
|
||||||
|
col.a = (i >> 24) & 0xff;
|
||||||
|
col.r = (i >> 16) & 0xff;
|
||||||
|
col.g = (i >> 8) & 0xff;
|
||||||
|
col.b = (i >> 0) & 0xff;
|
||||||
|
#else
|
||||||
|
#error Define one of RAWFB_RGBX_8888 , RAWFB_XRGB_8888
|
||||||
|
#endif
|
||||||
|
return col;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
nk_rawfb_setpixel(const struct rawfb_context *rawfb,
|
nk_rawfb_ctx_setpixel(const struct rawfb_context *rawfb,
|
||||||
const short x0, const short y0, const struct nk_color col)
|
const short x0, const short y0, const struct nk_color col)
|
||||||
{
|
{
|
||||||
unsigned int c = nk_color_from_byte(&col.r);
|
unsigned int c = nk_rawfb_color2int(col);
|
||||||
unsigned char *pixels = rawfb->fb.pixels;
|
unsigned char *pixels = rawfb->fb.pixels;
|
||||||
unsigned int *ptr;
|
unsigned int *ptr;
|
||||||
|
|
||||||
@ -120,7 +144,7 @@ nk_rawfb_line_horizontal(const struct rawfb_context *rawfb,
|
|||||||
|
|
||||||
n = x1 - x0;
|
n = x1 - x0;
|
||||||
for (i = 0; i < sizeof(c) / sizeof(c[0]); i++)
|
for (i = 0; i < sizeof(c) / sizeof(c[0]); i++)
|
||||||
c[i] = nk_color_from_byte(&col.r);
|
c[i] = nk_rawfb_color2int(col);
|
||||||
|
|
||||||
while (n > 16) {
|
while (n > 16) {
|
||||||
memcpy((void *)ptr, c, sizeof(c));
|
memcpy((void *)ptr, c, sizeof(c));
|
||||||
@ -130,44 +154,49 @@ nk_rawfb_line_horizontal(const struct rawfb_context *rawfb,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
nk_rawfb_imagesetpixel(const struct rawfb_image *img,
|
nk_rawfb_img_setpixel(const struct rawfb_image *img,
|
||||||
const int x0, const int y0, const struct nk_color col)
|
const int x0, const int y0, const struct nk_color col)
|
||||||
{
|
{
|
||||||
|
unsigned int c = nk_rawfb_color2int(col);
|
||||||
unsigned char *ptr;
|
unsigned char *ptr;
|
||||||
|
unsigned int *pixel;
|
||||||
NK_ASSERT(img);
|
NK_ASSERT(img);
|
||||||
if (y0 < img->h && y0 > 0 && x0 > 0 && x0 < img->w) {
|
if (y0 < img->h && y0 >= 0 && x0 >= 0 && x0 < img->w) {
|
||||||
ptr = img->pixels;
|
ptr = img->pixels;
|
||||||
if (img->format == NK_FONT_ATLAS_ALPHA8) {
|
|
||||||
ptr += img->pitch * y0;
|
ptr += img->pitch * y0;
|
||||||
|
pixel = (unsigned int *)ptr;
|
||||||
|
|
||||||
|
if (img->format == NK_FONT_ATLAS_ALPHA8) {
|
||||||
ptr[x0] = col.a;
|
ptr[x0] = col.a;
|
||||||
} else {
|
} else {
|
||||||
ptr += img->pitch * y0;
|
pixel[x0] = c;
|
||||||
((struct nk_color *)ptr)[x0] = col;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct nk_color
|
static struct nk_color
|
||||||
nk_image_getpixel(const struct rawfb_image *img, const int x0, const int y0)
|
nk_rawfb_img_getpixel(const struct rawfb_image *img, const int x0, const int y0)
|
||||||
{
|
{
|
||||||
struct nk_color col = {0, 0, 0, 0};
|
struct nk_color col = {0, 0, 0, 0};
|
||||||
unsigned char *ptr;
|
unsigned char *ptr;
|
||||||
|
unsigned int *pixel;
|
||||||
NK_ASSERT(img);
|
NK_ASSERT(img);
|
||||||
if (y0 < img->h && y0 > 0 && x0 > 0 && x0 < img->w) {
|
if (y0 < img->h && y0 >= 0 && x0 >= 0 && x0 < img->w) {
|
||||||
ptr = img->pixels;
|
ptr = img->pixels;
|
||||||
if (img->format == NK_FONT_ATLAS_ALPHA8) {
|
|
||||||
ptr += img->pitch * y0;
|
ptr += img->pitch * y0;
|
||||||
|
|
||||||
|
if (img->format == NK_FONT_ATLAS_ALPHA8) {
|
||||||
col.a = ptr[x0];
|
col.a = ptr[x0];
|
||||||
col.b = col.g = col.r = 0xff;
|
col.b = col.g = col.r = 0xff;
|
||||||
} else {
|
} else {
|
||||||
ptr += img->pitch * y0;
|
pixel = ptr;
|
||||||
col = ((struct nk_color *)ptr)[x0];
|
pixel += x0;
|
||||||
|
col = nk_rawfb_int2color(*pixel);
|
||||||
}
|
}
|
||||||
} return col;
|
} return col;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
nk_image_blendpixel(const struct rawfb_image *img,
|
nk_rawfb_img_blendpixel(const struct rawfb_image *img,
|
||||||
const int x0, const int y0, struct nk_color col)
|
const int x0, const int y0, struct nk_color col)
|
||||||
{
|
{
|
||||||
struct nk_color col2;
|
struct nk_color col2;
|
||||||
@ -176,11 +205,11 @@ nk_image_blendpixel(const struct rawfb_image *img,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
inv_a = 0xff - col.a;
|
inv_a = 0xff - col.a;
|
||||||
col2 = nk_image_getpixel(img, x0, y0);
|
col2 = nk_rawfb_img_getpixel(img, x0, y0);
|
||||||
col.r = (col.r * col.a + col2.r * inv_a) >> 8;
|
col.r = (col.r * col.a + col2.r * inv_a) >> 8;
|
||||||
col.g = (col.g * col.a + col2.g * inv_a) >> 8;
|
col.g = (col.g * col.a + col2.g * inv_a) >> 8;
|
||||||
col.b = (col.b * col.a + col2.b * inv_a) >> 8;
|
col.b = (col.b * col.a + col2.b * inv_a) >> 8;
|
||||||
nk_rawfb_imagesetpixel(img, x0, y0, col);
|
nk_rawfb_img_setpixel(img, x0, y0, col);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -238,7 +267,7 @@ nk_rawfb_stroke_line(const struct rawfb_context *rawfb,
|
|||||||
dy <<= 1;
|
dy <<= 1;
|
||||||
dx <<= 1;
|
dx <<= 1;
|
||||||
|
|
||||||
nk_rawfb_setpixel(rawfb, x0, y0, col);
|
nk_rawfb_ctx_setpixel(rawfb, x0, y0, col);
|
||||||
if (dx > dy) {
|
if (dx > dy) {
|
||||||
int fraction = dy - (dx >> 1);
|
int fraction = dy - (dx >> 1);
|
||||||
while (x0 != x1) {
|
while (x0 != x1) {
|
||||||
@ -248,7 +277,7 @@ nk_rawfb_stroke_line(const struct rawfb_context *rawfb,
|
|||||||
}
|
}
|
||||||
x0 += stepx;
|
x0 += stepx;
|
||||||
fraction += dy;
|
fraction += dy;
|
||||||
nk_rawfb_setpixel(rawfb, x0, y0, col);
|
nk_rawfb_ctx_setpixel(rawfb, x0, y0, col);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
int fraction = dx - (dy >> 1);
|
int fraction = dx - (dy >> 1);
|
||||||
@ -259,7 +288,7 @@ nk_rawfb_stroke_line(const struct rawfb_context *rawfb,
|
|||||||
}
|
}
|
||||||
y0 += stepy;
|
y0 += stepy;
|
||||||
fraction += dx;
|
fraction += dx;
|
||||||
nk_rawfb_setpixel(rawfb, x0, y0, col);
|
nk_rawfb_ctx_setpixel(rawfb, x0, y0, col);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -320,7 +349,7 @@ nk_rawfb_fill_polygon(const struct rawfb_context *rawfb,
|
|||||||
if (nodeX[i+0] < left) nodeX[i+0] = left ;
|
if (nodeX[i+0] < left) nodeX[i+0] = left ;
|
||||||
if (nodeX[i+1] > right) nodeX[i+1] = right;
|
if (nodeX[i+1] > right) nodeX[i+1] = right;
|
||||||
for (pixelX = nodeX[i]; pixelX < nodeX[i + 1]; pixelX++)
|
for (pixelX = nodeX[i]; pixelX < nodeX[i + 1]; pixelX++)
|
||||||
nk_rawfb_setpixel(rawfb, pixelX, pixelY, col);
|
nk_rawfb_ctx_setpixel(rawfb, pixelX, pixelY, col);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -349,13 +378,13 @@ nk_rawfb_stroke_arc(const struct rawfb_context *rawfb,
|
|||||||
/* First half */
|
/* First half */
|
||||||
for (x = 0, y = h, sigma = 2*b2+a2*(1-2*h); b2*x <= a2*y; x++) {
|
for (x = 0, y = h, sigma = 2*b2+a2*(1-2*h); b2*x <= a2*y; x++) {
|
||||||
if (s == 180)
|
if (s == 180)
|
||||||
nk_rawfb_setpixel(rawfb, x0 + x, y0 + y, col);
|
nk_rawfb_ctx_setpixel(rawfb, x0 + x, y0 + y, col);
|
||||||
else if (s == 270)
|
else if (s == 270)
|
||||||
nk_rawfb_setpixel(rawfb, x0 - x, y0 + y, col);
|
nk_rawfb_ctx_setpixel(rawfb, x0 - x, y0 + y, col);
|
||||||
else if (s == 0)
|
else if (s == 0)
|
||||||
nk_rawfb_setpixel(rawfb, x0 + x, y0 - y, col);
|
nk_rawfb_ctx_setpixel(rawfb, x0 + x, y0 - y, col);
|
||||||
else if (s == 90)
|
else if (s == 90)
|
||||||
nk_rawfb_setpixel(rawfb, x0 - x, y0 - y, col);
|
nk_rawfb_ctx_setpixel(rawfb, x0 - x, y0 - y, col);
|
||||||
if (sigma >= 0) {
|
if (sigma >= 0) {
|
||||||
sigma += fa2 * (1 - y);
|
sigma += fa2 * (1 - y);
|
||||||
y--;
|
y--;
|
||||||
@ -365,13 +394,13 @@ nk_rawfb_stroke_arc(const struct rawfb_context *rawfb,
|
|||||||
/* Second half */
|
/* Second half */
|
||||||
for (x = w, y = 0, sigma = 2*a2+b2*(1-2*w); a2*y <= b2*x; y++) {
|
for (x = w, y = 0, sigma = 2*a2+b2*(1-2*w); a2*y <= b2*x; y++) {
|
||||||
if (s == 180)
|
if (s == 180)
|
||||||
nk_rawfb_setpixel(rawfb, x0 + x, y0 + y, col);
|
nk_rawfb_ctx_setpixel(rawfb, x0 + x, y0 + y, col);
|
||||||
else if (s == 270)
|
else if (s == 270)
|
||||||
nk_rawfb_setpixel(rawfb, x0 - x, y0 + y, col);
|
nk_rawfb_ctx_setpixel(rawfb, x0 - x, y0 + y, col);
|
||||||
else if (s == 0)
|
else if (s == 0)
|
||||||
nk_rawfb_setpixel(rawfb, x0 + x, y0 - y, col);
|
nk_rawfb_ctx_setpixel(rawfb, x0 + x, y0 - y, col);
|
||||||
else if (s == 90)
|
else if (s == 90)
|
||||||
nk_rawfb_setpixel(rawfb, x0 - x, y0 - y, col);
|
nk_rawfb_ctx_setpixel(rawfb, x0 - x, y0 - y, col);
|
||||||
if (sigma >= 0) {
|
if (sigma >= 0) {
|
||||||
sigma += fb2 * (1 - x);
|
sigma += fb2 * (1 - x);
|
||||||
x--;
|
x--;
|
||||||
@ -637,10 +666,10 @@ nk_rawfb_stroke_circle(const struct rawfb_context *rawfb,
|
|||||||
|
|
||||||
/* First half */
|
/* First half */
|
||||||
for (x = 0, y = h, sigma = 2*b2+a2*(1-2*h); b2*x <= a2*y; x++) {
|
for (x = 0, y = h, sigma = 2*b2+a2*(1-2*h); b2*x <= a2*y; x++) {
|
||||||
nk_rawfb_setpixel(rawfb, x0 + x, y0 + y, col);
|
nk_rawfb_ctx_setpixel(rawfb, x0 + x, y0 + y, col);
|
||||||
nk_rawfb_setpixel(rawfb, x0 - x, y0 + y, col);
|
nk_rawfb_ctx_setpixel(rawfb, x0 - x, y0 + y, col);
|
||||||
nk_rawfb_setpixel(rawfb, x0 + x, y0 - y, col);
|
nk_rawfb_ctx_setpixel(rawfb, x0 + x, y0 - y, col);
|
||||||
nk_rawfb_setpixel(rawfb, x0 - x, y0 - y, col);
|
nk_rawfb_ctx_setpixel(rawfb, x0 - x, y0 - y, col);
|
||||||
if (sigma >= 0) {
|
if (sigma >= 0) {
|
||||||
sigma += fa2 * (1 - y);
|
sigma += fa2 * (1 - y);
|
||||||
y--;
|
y--;
|
||||||
@ -648,10 +677,10 @@ nk_rawfb_stroke_circle(const struct rawfb_context *rawfb,
|
|||||||
}
|
}
|
||||||
/* Second half */
|
/* Second half */
|
||||||
for (x = w, y = 0, sigma = 2*a2+b2*(1-2*w); a2*y <= b2*x; y++) {
|
for (x = w, y = 0, sigma = 2*a2+b2*(1-2*w); a2*y <= b2*x; y++) {
|
||||||
nk_rawfb_setpixel(rawfb, x0 + x, y0 + y, col);
|
nk_rawfb_ctx_setpixel(rawfb, x0 + x, y0 + y, col);
|
||||||
nk_rawfb_setpixel(rawfb, x0 - x, y0 + y, col);
|
nk_rawfb_ctx_setpixel(rawfb, x0 - x, y0 + y, col);
|
||||||
nk_rawfb_setpixel(rawfb, x0 + x, y0 - y, col);
|
nk_rawfb_ctx_setpixel(rawfb, x0 + x, y0 - y, col);
|
||||||
nk_rawfb_setpixel(rawfb, x0 - x, y0 - y, col);
|
nk_rawfb_ctx_setpixel(rawfb, x0 - x, y0 - y, col);
|
||||||
if (sigma >= 0) {
|
if (sigma >= 0) {
|
||||||
sigma += fb2 * (1 - x);
|
sigma += fb2 * (1 - x);
|
||||||
x--;
|
x--;
|
||||||
@ -746,7 +775,8 @@ nk_rawfb_init(void *fb, void *tex_mem, const unsigned int w, const unsigned int
|
|||||||
static void
|
static void
|
||||||
nk_rawfb_stretch_image(const struct rawfb_image *dst,
|
nk_rawfb_stretch_image(const struct rawfb_image *dst,
|
||||||
const struct rawfb_image *src, const struct nk_rect *dst_rect,
|
const struct rawfb_image *src, const struct nk_rect *dst_rect,
|
||||||
const struct nk_rect *src_rect, const struct nk_rect *dst_scissors)
|
const struct nk_rect *src_rect, const struct nk_rect *dst_scissors,
|
||||||
|
const struct nk_color *fg)
|
||||||
{
|
{
|
||||||
short i, j;
|
short i, j;
|
||||||
struct nk_color col;
|
struct nk_color col;
|
||||||
@ -764,8 +794,14 @@ nk_rawfb_stretch_image(const struct rawfb_image *dst,
|
|||||||
if (j + (int)(dst_rect->y + 0.5f) < dst_scissors->y || j + (int)(dst_rect->y + 0.5f) >= dst_scissors->h)
|
if (j + (int)(dst_rect->y + 0.5f) < dst_scissors->y || j + (int)(dst_rect->y + 0.5f) >= dst_scissors->h)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
col = nk_image_getpixel(src, (int)xoff, (int) yoff);
|
col = nk_rawfb_img_getpixel(src, (int)xoff, (int) yoff);
|
||||||
nk_image_blendpixel(dst, i + (int)(dst_rect->x + 0.5f), j + (int)(dst_rect->y + 0.5f), col);
|
if (col.r || col.g || col.b)
|
||||||
|
{
|
||||||
|
col.r = fg->r;
|
||||||
|
col.g = fg->g;
|
||||||
|
col.b = fg->b;
|
||||||
|
}
|
||||||
|
nk_rawfb_img_blendpixel(dst, i + (int)(dst_rect->x + 0.5f), j + (int)(dst_rect->y + 0.5f), col);
|
||||||
xoff += xinc;
|
xoff += xinc;
|
||||||
}
|
}
|
||||||
xoff = src_rect->x;
|
xoff = src_rect->x;
|
||||||
@ -843,9 +879,8 @@ nk_rawfb_draw_text(const struct rawfb_context *rawfb,
|
|||||||
dst_rect.w = ceilf(g.width);
|
dst_rect.w = ceilf(g.width);
|
||||||
dst_rect.h = ceilf(g.height);
|
dst_rect.h = ceilf(g.height);
|
||||||
|
|
||||||
/* TODO: account fg */
|
|
||||||
/* Use software rescaling to blit glyph from font_text to framebuffer */
|
/* Use software rescaling to blit glyph from font_text to framebuffer */
|
||||||
nk_rawfb_stretch_image(&rawfb->fb, &rawfb->font_tex, &dst_rect, &src_rect, &rawfb->scissors);
|
nk_rawfb_stretch_image(&rawfb->fb, &rawfb->font_tex, &dst_rect, &src_rect, &rawfb->scissors, &fg);
|
||||||
|
|
||||||
/* offset next glyph */
|
/* offset next glyph */
|
||||||
text_len += glyph_len;
|
text_len += glyph_len;
|
||||||
@ -872,7 +907,7 @@ nk_rawfb_drawimage(const struct rawfb_context *rawfb,
|
|||||||
dst_rect.y = y;
|
dst_rect.y = y;
|
||||||
dst_rect.w = w;
|
dst_rect.w = w;
|
||||||
dst_rect.h = h;
|
dst_rect.h = h;
|
||||||
nk_rawfb_stretch_image(&rawfb->fb, &rawfb->font_tex, &dst_rect, &src_rect, &rawfb->scissors);
|
nk_rawfb_stretch_image(&rawfb->fb, &rawfb->font_tex, &dst_rect, &src_rect, &rawfb->scissors, col);
|
||||||
}
|
}
|
||||||
|
|
||||||
NK_API void
|
NK_API void
|
||||||
|
Loading…
Reference in New Issue
Block a user