diff options
| author | Matthias Melcher <fltk@matthiasm.com> | 2006-06-06 08:00:56 +0000 |
|---|---|---|
| committer | Matthias Melcher <fltk@matthiasm.com> | 2006-06-06 08:00:56 +0000 |
| commit | 30786c2ed39ef0e8482b48b6663ffd99fb032ddd (patch) | |
| tree | 295b630bbc3de3d9c0639b11a2e69fd737a962ea /src | |
| parent | 587e1d170b1b7f0757d24cb44769b7af2993bf8d (diff) | |
STR #1310: OS X Quartz support fixed. All test codes now work without complaints fro Quickdraw or CoreGraphics. If no more major bugs are reported for Quartz, I will make Quartz the default over Quickdraw in the next release of FLTK 1.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@5178 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src')
| -rw-r--r-- | src/Fl_Double_Window.cxx | 25 | ||||
| -rw-r--r-- | src/Fl_mac.cxx | 11 | ||||
| -rw-r--r-- | src/cgdebug.h | 28 |
3 files changed, 48 insertions, 16 deletions
diff --git a/src/Fl_Double_Window.cxx b/src/Fl_Double_Window.cxx index e1fa64e67..54fd2b935 100644 --- a/src/Fl_Double_Window.cxx +++ b/src/Fl_Double_Window.cxx @@ -219,12 +219,19 @@ void fl_delete_offscreen(Fl_Offscreen ctx) { free(data); } -static CGContextRef prev_gc = 0; -static Window prev_window = 0; +const int stack_max = 16; +static int stack_ix = 0; +static CGContextRef stack_gc[stack_max]; +static Window stack_window[stack_max]; void fl_begin_offscreen(Fl_Offscreen ctx) { - prev_gc = fl_gc; - prev_window = fl_window; + 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; //fl_push_no_clip(); @@ -235,8 +242,14 @@ void fl_begin_offscreen(Fl_Offscreen ctx) { void fl_end_offscreen() { Fl_X::q_release_context(); //fl_pop_clip(); - fl_gc = prev_gc; - fl_window = prev_window; + 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]; + } } extern void fl_restore_clip(); diff --git a/src/Fl_mac.cxx b/src/Fl_mac.cxx index c7a03531a..732f4f143 100644 --- a/src/Fl_mac.cxx +++ b/src/Fl_mac.cxx @@ -2032,6 +2032,7 @@ void Fl_Window::resize(int X,int Y,int W,int H) { void Fl_Window::make_current() { #ifdef __APPLE_QUARTZ__ + OSStatus err; Fl_X::q_release_context(); #endif if ( !fl_window_region ) @@ -2068,7 +2069,9 @@ void Fl_Window::make_current() } #ifdef __APPLE_QUARTZ__ - QDBeginCGContext(GetWindowPort(i->xid), &i->gc); + err = QDBeginCGContext(GetWindowPort(i->xid), &i->gc); + if (err!=noErr) + fprintf(stderr, "Error %d in QDBeginCGContext\n", (int)err); fl_gc = i->gc; CGContextSaveGState(fl_gc); Fl_X::q_fill_context(); @@ -2117,7 +2120,11 @@ void Fl_X::q_release_context(Fl_X *x) { if (x && x->gc!=fl_gc) return; if (!fl_gc) return; CGContextRestoreGState(fl_gc); - if (fl_window) QDEndCGContext(GetWindowPort(fl_window), &fl_gc); + if (fl_window) { + OSStatus err = QDEndCGContext(GetWindowPort(fl_window), &fl_gc); + if (err!=noErr) + fprintf(stderr, "Error %d in QDEndCGContext\n", (int)err); + } fl_gc = 0; } diff --git a/src/cgdebug.h b/src/cgdebug.h index 3d11158ff..a8a605322 100644 --- a/src/cgdebug.h +++ b/src/cgdebug.h @@ -83,6 +83,18 @@ //+StrokePath //+TranslateCTM +inline OSStatus dbgLocation(const char *file, int line) +{ + fprintf(stderr, "%s:%d ", file, line); + return 0; +} + +inline OSStatus dbgEndl() +{ + fprintf(stderr, "\n"); + return 0; +} + inline void dbgCGContextClipToRect(CGContextRef a, CGRect b) { @@ -109,20 +121,20 @@ inline OSStatus dbgQDEndCGContext(CGrafPtr a, CGContextRef *b) return QDEndCGContext(a, b); } -#define QDEndCGContext(a, b) { \ - fprintf(stderr, "%s:%d ", __FILE__, __LINE__); \ - dbgQDEndCGContext(a, b); \ - fprintf(stderr, "\n"); } +#define QDEndCGContext(a, b) ( \ + dbgLocation(__FILE__, __LINE__) + \ + dbgQDEndCGContext(a, b) + \ + dbgEndl() ) inline OSStatus dbgQDBeginCGContext(CGrafPtr a, CGContextRef *b) { return QDBeginCGContext(a, b); } -#define QDBeginCGContext(a, b) { \ - fprintf(stderr, "%s:%d ", __FILE__, __LINE__); \ - dbgQDBeginCGContext(a, b); \ - fprintf(stderr, "\n"); } +#define QDBeginCGContext(a, b) ( \ + dbgLocation(__FILE__, __LINE__) + \ + dbgQDBeginCGContext(a, b) + \ + dbgEndl() ) inline void dbgClipCGContextToRegion(CGContextRef a, const Rect *b, RgnHandle c) { |
