GUI part of the graphics context rewrite.

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@24966 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
fredkiefer 2007-04-04 14:33:39 +00:00
parent f8aac2ba14
commit 66fcff3b42
5 changed files with 147 additions and 125 deletions

View file

@ -1,3 +1,17 @@
2007-04-04 Fred Kiefer <FredKiefer@gmx.de>
* Headers/AppKit/NSWindow.h: Reuse one reserved ivar as the
graphics context.
* Source/NSWindow.m (-_terminateBackendWindow,
-_initBackendWindow, -initWithWindowRef:, -graphicsContext,
-flushWindow, -_processResizeEvent): Set and use context from ivar.
* Source/NSImage.m (-drawInRect:fromRect:operation:fraction:):
make sure to use the right graphic context.
* Source/NSView.m (-releaseGState): Use context from window.
* Source/NSView.m (-_lockFocusInContext:inRect:,
-unlockFocusNeedsFlush:) Set context to current when locking focus
and pop it when unlocking.
2007-04-02 Richard Frith-Macdonald <rfm@gnu.org>
* Headers/AppKit/NSAlert.h: Tidied.

View file

@ -215,9 +215,9 @@ APPKIT_EXPORT NSSize NSTokenSize;
} _f;
id _defaultButtonCell;
void *_reserved_1;
void *_reserved_2;
NSGraphicsContext *_context;
void *_reserved_1;
}
/*

View file

@ -1051,6 +1051,7 @@ repd_for_rep(NSArray *_reps, NSImageRep *rep)
NSPoint p;
double x0, y0, x1, y1, w, h;
int gState;
NSGraphicsContext *ctxt1;
s = [self size];
@ -1098,8 +1099,9 @@ repd_for_rep(NSArray *_reps, NSImageRep *rep)
alpha: YES];
[[[cache window] contentView] lockFocus];
DPScompositerect(ctxt, 0, 0, w, h, NSCompositeClear);
// The context of the cache window
ctxt1 = GSCurrentContext();
DPScompositerect(ctxt1, 0, 0, w, h, NSCompositeClear);
/* Set up the effective transform. We also save a gState with this
transform to make it easier to do the final composite. */
@ -1107,9 +1109,8 @@ repd_for_rep(NSArray *_reps, NSImageRep *rep)
ts.tX = p.x;
ts.tY = p.y;
[transform setTransformStruct: ts];
[ctxt GSSetCTM: transform];
gState = [ctxt GSDefineGState];
[ctxt1 GSSetCTM: transform];
gState = [ctxt1 GSDefineGState];
[self drawRepresentation: [self bestRepresentationForDevice: nil]
inRect: NSMakeRect(0, 0, s.width, s.height)];
@ -1118,8 +1119,8 @@ repd_for_rep(NSArray *_reps, NSImageRep *rep)
the alpha of the pixels. */
if (delta != 1.0)
{
DPSsetalpha(ctxt, delta);
DPScompositerect(ctxt, 0, 0, s.width, s.height,
DPSsetalpha(ctxt1, delta);
DPScompositerect(ctxt1, 0, 0, s.width, s.height,
NSCompositeDestinationIn);
}

View file

@ -1709,8 +1709,10 @@ static NSRect convert_rect_using_matrices(NSRect aRect, NSAffineTransform *matri
ctxt = [_window graphicsContext];
}
}
// FIXME: Set current context
// Set current context
[NSGraphicsContext saveGraphicsState];
[NSGraphicsContext setCurrentContext: ctxt];
[ctxt lockFocusView: self inRect: rect];
wrect = [self convertRect: rect toView: nil];
@ -1763,6 +1765,7 @@ static NSRect convert_rect_using_matrices(NSRect aRect, NSAffineTransform *matri
}
else
{
// This only works, when the context comes from the window
DPSsetgstate(ctxt, window_gstate);
DPSgsave(ctxt);
[matrix concat];
@ -1808,7 +1811,7 @@ static NSRect convert_rect_using_matrices(NSRect aRect, NSAffineTransform *matri
}
}
/* Tell backends that images are drawn upside down.
/* Tell backends that images are drawn upside down. Obsolete?
This is needed when a backend is able to handle full image transformation. */
GSWSetViewIsFlipped(ctxt, _rFlags.flipped_view);
}
@ -1851,6 +1854,7 @@ static NSRect convert_rect_using_matrices(NSRect aRect, NSAffineTransform *matri
[window_t->_rectsBeingDrawn removeLastObject];
}
[ctxt unlockFocusView: self needsFlush: YES ];
[NSGraphicsContext restoreGraphicsState];
}
/**
@ -1878,7 +1882,7 @@ static NSRect convert_rect_using_matrices(NSRect aRect, NSAffineTransform *matri
- (void) releaseGState
{
if (_allocate_gstate && _gstate)
GSUndefineGState(GSCurrentContext(), _gstate);
GSUndefineGState([_window graphicsContext], _gstate);
_gstate = 0;
_allocate_gstate = NO;
}

View file

@ -664,17 +664,16 @@ many times.
*/
- (void) _terminateBackendWindow
{
NSGraphicsContext *context = GSCurrentContext();
/* Check for context also as it might have disappeared before us */
if (context && _gstate)
if (_context && _gstate)
{
GSUndefineGState(context, _gstate);
GSUndefineGState(_context, _gstate);
_gstate = 0;
}
if (_windowNum)
{
DESTROY(_context);
[_wv setWindowNumber: 0];
[GSServerForWindow(self) termwindow: _windowNum];
NSMapRemove(windowmaps, (void*)(intptr_t)_windowNum);
@ -749,7 +748,6 @@ many times.
{
int screenNumber;
NSCountedSet *dragTypes;
NSGraphicsContext *context = GSCurrentContext();
GSDisplayServer *srv = GSCurrentServer();
/* If we were deferred or one shot, our drag types may not have
@ -776,11 +774,15 @@ many times.
[srv setwindowlevel: [self level] : _windowNum];
NSMapInsert (windowmaps, (void*)(intptr_t)_windowNum, self);
// Set window in new _gstate
DPSgsave(context);
ASSIGN(_context, [NSGraphicsContext graphicsContextWithWindow: self]);
// FIXME: This belongs into NSGraphicsContext
[NSGraphicsContext saveGraphicsState];
[NSGraphicsContext setCurrentContext: _context];
[srv windowdevice: _windowNum];
_gstate = GSDefineGState(context);
DPSgrestore(context);
[NSGraphicsContext restoreGraphicsState];
// Set window in new _gstate
_gstate = GSDefineGState(_context);
{
NSRect frame = _frame;
@ -974,7 +976,6 @@ many times.
NSScreen* aScreen;
int screen;
int winNum;
NSGraphicsContext *context = GSCurrentContext();
GSDisplayServer *srv = GSCurrentServer();
// Get the properties for the underlying window
@ -994,11 +995,15 @@ many times.
_windowNum = winNum;
NSMapInsert (windowmaps, (void*)(intptr_t)_windowNum, self);
// Set window in new _gstate
DPSgsave(context);
ASSIGN(_context, [NSGraphicsContext graphicsContextWithWindow: self]);
// FIXME: This belongs into NSGraphicsContext
[NSGraphicsContext saveGraphicsState];
[NSGraphicsContext setCurrentContext: _context];
[srv windowdevice: _windowNum];
_gstate = GSDefineGState(context);
DPSgrestore(context);
[NSGraphicsContext restoreGraphicsState];
// Set window in new _gstate
_gstate = GSDefineGState(_context);
{
NSRect frame = _frame;
@ -1173,8 +1178,7 @@ many times.
- (NSGraphicsContext*) graphicsContext
{
// FIXME
return GSCurrentContext();
return _context;
}
- (int) gState
@ -2118,9 +2122,7 @@ many times.
*/
if (_backingType == NSBackingStoreNonretained)
{
NSGraphicsContext *context = GSCurrentContext();
[context flushGraphics];
[_context flushGraphics];
return;
}
@ -3167,12 +3169,13 @@ resetCursorRectsForView(NSView *theView)
{
if (_windowNum && _gstate)
{
NSGraphicsContext *context = GSCurrentContext();
DPSgsave(context);
DPSsetgstate(context, _gstate);
// FIXME: move this into NSGraphicsContext
[NSGraphicsContext saveGraphicsState];
[NSGraphicsContext setCurrentContext: _context];
DPSsetgstate(_context, _gstate);
[GSServerForWindow(self) windowdevice: _windowNum];
GSReplaceGState(context, _gstate);
DPSgrestore(context);
GSReplaceGState(_context, _gstate);
[NSGraphicsContext restoreGraphicsState];
}
[self update];