static int writeData(void* _call) { unsigned char r; unsigned char g; unsigned char b; unsigned char a; int x,y; int res = 0; unsigned char* dst; WriterFBCallData_t* call = (WriterFBCallData_t*) _call; fb_printf(100, "\n"); if (call == NULL) { fb_err("call data is NULL...\n"); return 0; } if (call->destination == NULL) { fb_err("file pointer < 0. ignoring ...\n"); return 0; } if (call->data != NULL) { unsigned int opacity = 255 - ((unsigned int)_a(call->color)); unsigned int r = (unsigned int)_r(call->color); unsigned int g = (unsigned int)_g(call->color); unsigned int b = (unsigned int) _b(call->color); int src_stride = call->Stride; int dst_stride = call->destStride; int dst_delta = dst_stride - call->Width*4; int x,y; const unsigned char *src = call->data; unsigned char *dst = call->destination + (call->y * dst_stride + call->x * 4); //uint32_t *dst = call->destination + call->y * dst_stride + call->x; unsigned int k,ck,t; static uint32_t last_color = 0, colortable[256]; if (last_color != call->color) { // call->color is rgba, our spark frame buffer is argb uint32_t c = call->color >> 8, a = 255 - (call->color & 0xff); int i; for (i = 0; i < 256; i++) { uint32_t k = (a * i) >> 8; colortable[i] = k ? (c | (k << 24)) : 0; } last_color = call->color; }
static int writeData(void* _call) { unsigned char r; unsigned char g; unsigned char b; unsigned char a; int x,y; int res = 0; unsigned char* dst; WriterFBCallData_t* call = (WriterFBCallData_t*) _call; fb_printf(100, "\n"); if (call == NULL) { fb_err("call data is NULL...\n"); return 0; } if (call->destination == NULL) { fb_err("file pointer < 0. ignoring ...\n"); return 0; } if (call->data != NULL) { unsigned int opacity = 255 - ((unsigned int)_a(call->color)); unsigned int r = (unsigned int)_r(call->color); unsigned int g = (unsigned int)_g(call->color); unsigned int b = (unsigned int) _b(call->color); int src_stride = call->Stride; int dst_stride = call->destStride; int dst_delta = dst_stride - call->Width*4; int x,y; const unsigned char *src = call->data; unsigned char *dst = call->destination + (call->y * dst_stride + call->x * 4); unsigned int k,ck,t; fb_printf(100, "x %d\n", call->x); fb_printf(100, "y %d\n", call->y); fb_printf(100, "width %d\n", call->Width); fb_printf(100, "height %d\n", call->Height); fb_printf(100, "stride %d\n", call->Stride); fb_printf(100, "color %d\n", call->color); fb_printf(100, "data %p\n", call->data); fb_printf(100, "dest %p\n", call->destination); fb_printf(100, "dest.stride %d\n", call->destStride); fb_printf(100, "r 0x%hhx, g 0x%hhx, b 0x%hhx, a 0x%hhx, opacity %d\n", r, g, b, a, opacity); for (y=0;y<call->Height;y++) { for (x = 0; x < call->Width; x++) { k = ((unsigned)src[x]) * opacity / 255; ck = 255 - k; t = *dst; *dst++ = (k*b + ck*t) / 255; t = *dst; *dst++ = (k*g + ck*t) / 255; t = *dst; *dst++ = (k*r + ck*t) / 255; *dst++ = 0; } dst += dst_delta; src += src_stride; } } else { for (y = 0; y < call->Height; y++) memset(call->destination + ((call->y + y) * call->destStride) + call->x * 4, 0, call->Width * 4); } fb_printf(100, "< %d\n", res); return res; }