36 #include <X11/extensions/Xdbe.h> 40 static int can_xdbe() {
44 int event_base, error_base;
45 if (!XdbeQueryExtension(
fl_display, &event_base, &error_base))
return 0;
48 XdbeScreenVisualInfo *a = XdbeGetVisualInfo(
fl_display,&root,&numscreens);
50 for (
int j = 0; j < a->count; j++) {
51 if (a->visinfo[j].visual ==
fl_visual->visualid
56 XdbeFreeVisualInfo(a);
65 force_doublebuffering_(0)
73 force_doublebuffering_(0)
93 #if FLTK_ABI_VERSION >= 10301 109 #elif defined(__APPLE__) 117 #endif // FLTK_ABI_VERSION 133 #include <X11/extensions/Xrender.h> 143 XRenderPictureAttributes srcattr;
144 memset(&srcattr, 0,
sizeof(XRenderPictureAttributes));
145 static XRenderPictFormat *srcfmt = XRenderFindStandardFormat(
fl_display, PictStandardARGB32);
146 static XRenderPictFormat *dstfmt = XRenderFindStandardFormat(
fl_display, PictStandardRGB24);
148 Picture src = XRenderCreatePicture(
fl_display,
pixmap, srcfmt, 0, &srcattr);
152 fprintf(stderr,
"Failed to create Render pictures (%lu %lu)\n", src, dst);
158 XRenderSetPictureClipRegion(
fl_display, dst, clipr);
160 XRenderComposite(
fl_display, PictOpOver, src, None, dst, srcx, srcy, 0, 0,
169 return Fl_X::xrender_supported();
176 typedef struct { BYTE a; BYTE
b; BYTE c; BYTE d; } FL_BLENDFUNCTION;
177 typedef BOOL (WINAPI* fl_alpha_blend_func)
178 (HDC,int,int,int,int,HDC,int,int,int,int,FL_BLENDFUNCTION);
179 static fl_alpha_blend_func fl_alpha_blend =
NULL;
180 static FL_BLENDFUNCTION blendfunc = { 0, 0, 255, 1};
188 static char been_here = 0;
189 static char can_do = 0;
191 if (been_here)
return can_do;
194 HMODULE hMod = LoadLibrary(
"MSIMG32.DLL");
198 fl_alpha_blend = (fl_alpha_blend_func)GetProcAddress(hMod,
"AlphaBlend");
200 if (!fl_alpha_blend)
return 0;
208 HBITMAP bm = CreateCompatibleBitmap(dc, 1, 1);
209 HDC new_gc = CreateCompatibleDC(dc);
210 int save = SaveDC(new_gc);
211 SelectObject(new_gc, bm);
212 SetPixel(new_gc, 0, 0, 0x01010101);
213 BOOL alpha_ok = fl_alpha_blend(dc, 0, 0, 1, 1, new_gc, 0, 0, 1, 1, blendfunc);
214 RestoreDC(new_gc, save);
219 if (alpha_ok) can_do = 1;
224 HDC new_gc = CreateCompatibleDC(
fl_gc);
225 SetTextAlign(new_gc, TA_BASELINE|TA_LEFT);
226 SetBkMode(new_gc, TRANSPARENT);
230 SelectObject(new_gc, bitmap);
234 void Fl_GDI_Graphics_Driver::copy_offscreen(
int x,
int y,
int w,
int h,HBITMAP bitmap,
int srcx,
int srcy) {
235 HDC new_gc = CreateCompatibleDC(
fl_gc);
236 int save = SaveDC(new_gc);
237 SelectObject(new_gc, bitmap);
238 BitBlt(
fl_gc,
x,
y, w, h, new_gc, srcx, srcy, SRCCOPY);
239 RestoreDC(new_gc, save);
243 void Fl_GDI_Graphics_Driver::copy_offscreen_with_alpha(
int x,
int y,
int w,
int h,HBITMAP bitmap,
int srcx,
int srcy) {
244 HDC new_gc = CreateCompatibleDC(
fl_gc);
245 int save = SaveDC(new_gc);
246 SelectObject(new_gc, bitmap);
250 alpha_ok = fl_alpha_blend(
fl_gc,
x,
y, w, h, new_gc, srcx, srcy, w, h, blendfunc);
254 BitBlt(
fl_gc,
x,
y, w, h, new_gc, srcx, srcy, SRCCOPY);
256 RestoreDC(new_gc, save);
261 #elif defined(__APPLE_QUARTZ__) || defined(FL_DOXYGEN) 267 #if ! defined(FL_DOXYGEN) 268 Fl_Offscreen Fl_Quartz_Graphics_Driver::create_offscreen_with_alpha(
int w,
int h) {
269 void *data =
calloc(w*h,4);
270 CGColorSpaceRef lut = CGColorSpaceCreateDeviceRGB();
272 data, w, h, 8, w*4, lut, kCGImageAlphaPremultipliedLast);
273 CGColorSpaceRelease(lut);
288 void *data =
calloc(w*h,4);
289 CGColorSpaceRef lut = CGColorSpaceCreateDeviceRGB();
291 data, w, h, 8, w*4, lut, kCGImageAlphaNoneSkipLast);
292 CGColorSpaceRelease(lut);
296 static void bmProviderRelease (
void *src,
const void *data,
size_t size) {
297 CFIndex count = CFGetRetainCount(src);
299 if(count == 1)
free((
void*)data);
302 void Fl_Quartz_Graphics_Driver::copy_offscreen(
int x,
int y,
int w,
int h,
Fl_Offscreen osrc,
int srcx,
int srcy) {
304 void *data = CGBitmapContextGetData(src);
305 int sw = CGBitmapContextGetWidth(src);
306 int sh = CGBitmapContextGetHeight(src);
307 CGImageAlphaInfo alpha = CGBitmapContextGetAlphaInfo(src);
308 CGColorSpaceRef lut = CGColorSpaceCreateDeviceRGB();
312 CGDataProviderRef src_bytes = CGDataProviderCreateWithData( src, data, sw*sh*4, bmProviderRelease);
313 CGImageRef img = CGImageCreate( sw, sh, 8, 4*8, 4*sw, lut, alpha,
314 src_bytes, 0L,
false, kCGRenderingIntentDefault);
316 CGRect
rect = CGRectMake(
x,
y, w, h);
317 Fl_X::q_begin_image(
rect, srcx, srcy, sw, sh);
321 CGColorSpaceRelease(lut);
322 CGDataProviderRelease(src_bytes);
331 CFIndex count = CFGetRetainCount(ctx);
333 if(count == 1)
free(data);
336 const int stack_max = 16;
337 static int stack_ix = 0;
339 static Window stack_window[stack_max];
348 if (stack_ix<stack_max) {
349 stack_gc[stack_ix] =
fl_gc;
352 fprintf(stderr,
"FLTK CGContext Stack overflow error\n");
370 fprintf(stderr,
"FLTK CGContext Stack underflow error\n");
371 if (stack_ix<stack_max) {
372 fl_gc = stack_gc[stack_ix];
382 # error unsupported platform 399 if (!
shown())
return;
401 Fl_X *myi = Fl_X::i(
this);
403 if (!myi->other_xid) {
406 myi->other_xid = XdbeAllocateBackBufferName(
fl_display,
fl_xid(
this), XdbeCopied);
407 myi->backbuffer_bad = 1;
410 #if defined(USE_X11) || defined(WIN32) 413 #elif defined(__APPLE_QUARTZ__) 419 # error unsupported platform 424 if (myi->backbuffer_bad || eraseoverlay) {
426 if (myi->region) {XDestroyRegion(myi->region); myi->region = 0;}
428 myi->backbuffer_bad = 0;
441 s.swap_window =
fl_xid(
this);
442 s.swap_action = XdbeCopied;
452 int save = SaveDC(
fl_gc);
455 RestoreDC(
fl_gc, save);
461 #elif defined(__APPLE__) 462 if ( myi->other_xid ) {
479 int X,
Y,W,
H;
fl_clip_box(0,0,
w(),
h(),X,
Y,W,
H);
489 Fl_X* myi = Fl_X::i(
this);
490 if (myi && myi->other_xid && (ow <
w() || oh <
h())) {
492 XdbeDeallocateBackBufferName(
fl_display,myi->other_xid);
498 Fl_X* myi = Fl_X::i(
this);
499 if (myi && myi->other_xid && (ow !=
w() || oh !=
h())) {
506 Fl_X* myi = Fl_X::i(
this);
507 if (myi && myi->other_xid) {
510 XdbeDeallocateBackBufferName(
fl_display, myi->other_xid);