|
It seems best NOT to put the alpha rendering routine in the main
draw_image loop after all. It can mess up some stuff like fluid. At
least it does right now. So as a C = A + B function it's more predictable and still very useful, though this test is a bit funky. ![]() As you can see in [A] the bottom line and especially the leftmost pixel is 'add'ing to the color of the background. This is built on top of an ordinary button, it's just the 'image' data created by 1. o->hide() on the original button to get a shot of the background with fl_read_image() then 2. o->image() using a png image imported from SVG. Here's the latest alpha adder, such as it is. ---------> typedef struct { uint x, y, w, h, size; }WIDGET_RECT; void get_rect(WIDGET_RECT* a, Fl_Widget* o) { a->x = o->x(); a->y = o->y(); a->w = o->w(); a->h = o->h(); a->size = a->w * a->h; } void get_rect(WIDGET_RECT* a, Fl_RGB_Image* o) { a->x = 0; a->y = 0; a->w = o->w(); a->h = o->h(); a->size = a->w * a->h; } Fl_RGB_Image* get_screen_image(Fl_Widget* o, uchar alpha) { WIDGET_RECT r; get_rect(&r, o); uchar* array = fl_read_image(0, r.x, r.y, r.w, r.h, alpha); Fl_RGB_Image* tmp = new Fl_RGB_Image(array, r.w, r.h, 4); return tmp; } typedef union { struct { uchar red; uchar green; uchar blue; uchar alpha; }byte; void* cref; }PIXELS; #include <string.h> Fl_RGB_Image* add_alpha_images(Fl_RGB_Image* image_1, Fl_RGB_Image* image_2, int x_where, int y_where) { WIDGET_RECT r; get_rect(&r, image_1); Fl_RGB_Image* tmp = image_1; Fl_RGB_Image* fg = image_2; uchar* array = (uchar*)malloc(r.size * 4); memcpy(array, image_1->array, r.size * 4); Fl_RGB_Image* bg = new Fl_RGB_Image(array, r.w, r.h, 4); bg->alloc_array = 1; int X = x_where; int Y = y_where; int W = fg->w(); int H = fg->h(); int bgW = bg->w(); int bgH = bg->h(); // clip if((W + y_where) > bg->w()) W = bg->w() - y_where; if((H + x_where) > bg->h()) H = bg->h() - y_where; //... if((W <= 0) || (H <= 0)) return 0; PIXELS acc; PIXELS* src = ""> PIXELS* pdest = (PIXELS*)bg->array + X + (Y * bgW); PIXELS* dest; PIXELS s; PIXELS d; uint alpha, beta; for(int y = 0; y < H; y++) { dest = pdest; for(int x = 0; x < W; x++) { alpha = src->byte.alpha + 1; beta = 260 - alpha; s = *src; d = *dest; acc.byte.red = (((s.byte.red*alpha) + (d.byte.red*beta)) >> 8); acc.byte.blue = (((s.byte.blue*alpha) + (d.byte.blue*beta)) >> 8); acc.byte.green = (((s.byte.green*alpha) + (d.byte.green*beta)) >> 8); acc.byte.alpha = 255; // or master alpha? *dest = acc; src++; dest++; } pdest += bgW; } return bg; } <--------- The code is probably a mess. I'm just still trying to wrap my brain around C/C++. I'm a Forth fan and it's just soooOOoooo... different. :-) Not sure I'm releasing memory where I should and I'm not sure how these C++ objects delete themselves or when they do it. Still having lots of fun.. losing hair and cussing like wild sometimes, but it's coming along. :-) |
_______________________________________________ fltk-bugs mailing list [email protected] http://lists.easysw.com/mailman/listinfo/fltk-bugs

