summaryrefslogtreecommitdiff
path: root/src/Fl_Double_Window.cxx
diff options
context:
space:
mode:
authorMatthias Melcher <fltk@matthiasm.com>2016-02-09 21:54:38 +0000
committerMatthias Melcher <fltk@matthiasm.com>2016-02-09 21:54:38 +0000
commit94f0278d4771c816f3303efd2e8fa10fc6c41b7a (patch)
treed60ad09f2f45e2d972541fe19a5a7d26bb3a1ddf /src/Fl_Double_Window.cxx
parent7a0fe79f99ea90106b035047cb37148b4f3809fc (diff)
Porting efforts, minimal Android stuff, cleanup.
- Moving code around for Fl_Double_Window, but not yet happy - Tested CMake for Android cross compilation. Very happy! git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3-porting@11142 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src/Fl_Double_Window.cxx')
-rw-r--r--src/Fl_Double_Window.cxx249
1 files changed, 1 insertions, 248 deletions
diff --git a/src/Fl_Double_Window.cxx b/src/Fl_Double_Window.cxx
index 9bdbf4406..c8e0dabcc 100644
--- a/src/Fl_Double_Window.cxx
+++ b/src/Fl_Double_Window.cxx
@@ -105,257 +105,10 @@ void Fl_Graphics_Driver::copy_offscreen(int x, int y, int w, int h, Fl_Offscreen
delete[] img;
}
-#if defined(USE_X11)
-
-#include "drivers/Xlib/Fl_Xlib_Graphics_Driver.h"
-
-#if HAVE_XRENDER
-#include <X11/extensions/Xrender.h>
-#endif
-
-void Fl_Xlib_Graphics_Driver::copy_offscreen(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy) {
- XCopyArea(fl_display, pixmap, fl_window, fl_gc, srcx, srcy, w, h, x, y);
-}
-
-void Fl_Xlib_Graphics_Driver::copy_offscreen_with_alpha(int x, int y, int w, int h,
- Fl_Offscreen pixmap, int srcx, int srcy) {
-#if HAVE_XRENDER
- XRenderPictureAttributes srcattr;
- memset(&srcattr, 0, sizeof(XRenderPictureAttributes));
- static XRenderPictFormat *srcfmt = XRenderFindStandardFormat(fl_display, PictStandardARGB32);
- static XRenderPictFormat *dstfmt = XRenderFindStandardFormat(fl_display, PictStandardRGB24);
-
- Picture src = XRenderCreatePicture(fl_display, pixmap, srcfmt, 0, &srcattr);
- Picture dst = XRenderCreatePicture(fl_display, fl_window, dstfmt, 0, &srcattr);
-
- if (!src || !dst) {
- fprintf(stderr, "Failed to create Render pictures (%lu %lu)\n", src, dst);
- return;
- }
-
- const Fl_Region clipr = fl_clip_region();
- if (clipr)
- XRenderSetPictureClipRegion(fl_display, dst, clipr);
-
- XRenderComposite(fl_display, PictOpOver, src, None, dst, srcx, srcy, 0, 0,
- x, y, w, h);
-
- XRenderFreePicture(fl_display, src);
- XRenderFreePicture(fl_display, dst);
-#endif
-}
-
-char fl_can_do_alpha_blending() {
- return Fl_X::xrender_supported();
-}
-#elif defined(WIN32)
-
-#include "drivers/GDI/Fl_GDI_Graphics_Driver.h"
-
-// Code used to switch output to an off-screen window. See macros in
-// win32.H which save the old state in local variables.
-
-typedef struct { BYTE a; BYTE b; BYTE c; BYTE d; } FL_BLENDFUNCTION;
-typedef BOOL (WINAPI* fl_alpha_blend_func)
- (HDC,int,int,int,int,HDC,int,int,int,int,FL_BLENDFUNCTION);
-static fl_alpha_blend_func fl_alpha_blend = NULL;
-static FL_BLENDFUNCTION blendfunc = { 0, 0, 255, 1};
-
-/*
- * This function checks if the version of MSWindows that we
- * curently run on supports alpha blending for bitmap transfers
- * and finds the required function if so.
- */
-char fl_can_do_alpha_blending() {
- static char been_here = 0;
- static char can_do = 0;
- // do this test only once
- if (been_here) return can_do;
- been_here = 1;
- // load the library that implements alpha blending
- HMODULE hMod = LoadLibrary("MSIMG32.DLL");
- // give up if that doesn't exist (Win95?)
- if (!hMod) return 0;
- // now find the blending function inside that dll
- fl_alpha_blend = (fl_alpha_blend_func)GetProcAddress(hMod, "AlphaBlend");
- // give up if we can't find it (Win95)
- if (!fl_alpha_blend) return 0;
- // we have the call, but does our display support alpha blending?
- // get the desktop's device context
- HDC dc = GetDC(0L);
- if (!dc) return 0;
- // check the device capabilities flags. However GetDeviceCaps
- // does not return anything useful, so we have to do it manually:
-
- HBITMAP bm = CreateCompatibleBitmap(dc, 1, 1);
- HDC new_gc = CreateCompatibleDC(dc);
- int save = SaveDC(new_gc);
- SelectObject(new_gc, bm);
- /*COLORREF set = */ SetPixel(new_gc, 0, 0, 0x01010101);
- BOOL alpha_ok = fl_alpha_blend(dc, 0, 0, 1, 1, new_gc, 0, 0, 1, 1, blendfunc);
- RestoreDC(new_gc, save);
- DeleteDC(new_gc);
- DeleteObject(bm);
- ReleaseDC(0L, dc);
-
- if (alpha_ok) can_do = 1;
- return can_do;
-}
-
-HDC fl_makeDC(HBITMAP bitmap) {
- HDC new_gc = CreateCompatibleDC(fl_gc);
- SetTextAlign(new_gc, TA_BASELINE|TA_LEFT);
- SetBkMode(new_gc, TRANSPARENT);
-#if USE_COLORMAP
- if (fl_palette) SelectPalette(new_gc, fl_palette, FALSE);
-#endif
- SelectObject(new_gc, bitmap);
- return new_gc;
-}
-
-void Fl_GDI_Graphics_Driver::copy_offscreen(int x,int y,int w,int h,HBITMAP bitmap,int srcx,int srcy) {
- HDC new_gc = CreateCompatibleDC(fl_gc);
- int save = SaveDC(new_gc);
- SelectObject(new_gc, bitmap);
- BitBlt(fl_gc, x, y, w, h, new_gc, srcx, srcy, SRCCOPY);
- RestoreDC(new_gc, save);
- DeleteDC(new_gc);
-}
-
-void Fl_GDI_Graphics_Driver::copy_offscreen_with_alpha(int x,int y,int w,int h,HBITMAP bitmap,int srcx,int srcy) {
- HDC new_gc = CreateCompatibleDC(fl_gc);
- int save = SaveDC(new_gc);
- SelectObject(new_gc, bitmap);
- BOOL alpha_ok = 0;
- // first try to alpha blend
- if ( fl_can_do_alpha_blending() ) {
- alpha_ok = fl_alpha_blend(fl_gc, x, y, w, h, new_gc, srcx, srcy, w, h, blendfunc);
- }
- // if that failed (it shouldn't), still copy the bitmap over, but now alpha is 1
- if (!alpha_ok) {
- BitBlt(fl_gc, x, y, w, h, new_gc, srcx, srcy, SRCCOPY);
- }
- RestoreDC(new_gc, save);
- DeleteDC(new_gc);
-}
-
-
-#elif defined(__APPLE_QUARTZ__) || defined(FL_DOXYGEN)
-
-#include "src/drivers/Quartz/Fl_Quartz_Graphics_Driver.h"
-
char fl_can_do_alpha_blending() {
- return 1;
-}
-
-/** \addtogroup fl_drawings
- @{
- */
-
-/**
- Creation of an offscreen graphics buffer.
- \param w,h width and height in pixels of the buffer.
- \return the created graphics buffer.
- */
-Fl_Offscreen fl_create_offscreen(int w, int h) {
- void *data = calloc(w*h,4);
- CGColorSpaceRef lut = CGColorSpaceCreateDeviceRGB();
- CGContextRef ctx = CGBitmapContextCreate(
- data, w, h, 8, w*4, lut, kCGImageAlphaNoneSkipLast);
- CGColorSpaceRelease(lut);
- return (Fl_Offscreen)ctx;
-}
-
-static void bmProviderRelease (void *src, const void *data, size_t size) {
- CFIndex count = CFGetRetainCount(src);
- CFRelease(src);
- if(count == 1) free((void*)data);
-}
-
-void Fl_Quartz_Graphics_Driver::copy_offscreen(int x,int y,int w,int h,Fl_Offscreen osrc,int srcx,int srcy) {
- CGContextRef src = (CGContextRef)osrc;
- void *data = CGBitmapContextGetData(src);
- int sw = CGBitmapContextGetWidth(src);
- int sh = CGBitmapContextGetHeight(src);
- CGImageAlphaInfo alpha = CGBitmapContextGetAlphaInfo(src);
- CGColorSpaceRef lut = CGColorSpaceCreateDeviceRGB();
- // when output goes to a Quartz printercontext, release of the bitmap must be
- // delayed after the end of the print page
- CFRetain(src);
- CGDataProviderRef src_bytes = CGDataProviderCreateWithData( src, data, sw*sh*4, bmProviderRelease);
- CGImageRef img = CGImageCreate( sw, sh, 8, 4*8, 4*sw, lut, alpha,
- src_bytes, 0L, false, kCGRenderingIntentDefault);
- // fl_push_clip();
- CGRect rect = CGRectMake(x, y, w, h);
- Fl_X::q_begin_image(rect, srcx, srcy, sw, sh);
- CGContextDrawImage(fl_gc, rect, img);
- Fl_X::q_end_image();
- CGImageRelease(img);
- CGColorSpaceRelease(lut);
- CGDataProviderRelease(src_bytes);
-}
-
-/** Deletion of an offscreen graphics buffer.
- \param ctx the buffer to be deleted.
- */
-void fl_delete_offscreen(Fl_Offscreen ctx) {
- if (!ctx) return;
- void *data = CGBitmapContextGetData((CGContextRef)ctx);
- CFIndex count = CFGetRetainCount(ctx);
- CGContextRelease((CGContextRef)ctx);
- if(count == 1) free(data);
-}
-
-const int stack_max = 16;
-static int stack_ix = 0;
-static CGContextRef stack_gc[stack_max];
-static Window stack_window[stack_max];
-static Fl_Surface_Device *_ss;
-
-/** Send all subsequent drawing commands to this offscreen buffer.
- \param ctx the offscreen buffer.
- */
-void fl_begin_offscreen(Fl_Offscreen ctx) {
- _ss = Fl_Surface_Device::surface();
- Fl_Display_Device::display_device()->set_current();
- if (stack_ix<stack_max) {
- stack_gc[stack_ix] = fl_gc;
- stack_window[stack_ix] = fl_window;
- } else
- fprintf(stderr, "FLTK CGContext Stack overflow error\n");
- stack_ix++;
-
- fl_gc = (CGContextRef)ctx;
- fl_window = 0;
- CGContextSaveGState(fl_gc);
- fl_push_no_clip();
-}
-
-/** Quit sending drawing commands to the current offscreen buffer.
- */
-void fl_end_offscreen() {
- fl_pop_clip();
- CGContextRestoreGState(fl_gc); // matches CGContextSaveGState in fl_begin_offscreen()
- CGContextFlush(fl_gc);
- if (stack_ix>0)
- stack_ix--;
- else
- fprintf(stderr, "FLTK CGContext Stack underflow error\n");
- if (stack_ix<stack_max) {
- fl_gc = stack_gc[stack_ix];
- fl_window = stack_window[stack_ix];
- }
- _ss->set_current();
+ return Fl_Display_Device::display_device()->driver()->can_do_alpha_blending();
}
-/** @} */
-
-#elif defined(FL_PORTING)
-# pragma message "FL_PORTING: implement offscreen render space generation and management"
-#else
-# error unsupported platform
-#endif
-
/**
Forces the window to be redrawn.
*/