From f92292517ee33c64f7d857e63064652f329c7c03 Mon Sep 17 00:00:00 2001 From: Richard Frith-MacDonald Date: Sun, 19 Nov 2006 11:39:27 +0000 Subject: [PATCH] merged in changes from trunk to work with moved NSAffineTransform git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/branches/themes@24134 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 20 +- Headers/AppKit/NSAffineTransform.h | 38 +--- Source/NSAffineTransform.m | 285 ++--------------------------- Source/NSImage.m | 30 +-- Source/NSScrollView.m | 41 +++-- Source/NSStringDrawing.m | 8 +- Source/NSView.m | 19 +- 7 files changed, 91 insertions(+), 350 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5791e0d0b..02a2ea91f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,22 @@ -2006-11-17 Richard Frith-Macdoanld +2006-11-19 Richard Frith-Macdoanld - Sync with trunc at revision 24120. + * Merged in changes from trunk at revision 24133. + +2006-11-19 Richard Frith-Macdoanld + + * Source/NSAffineTransform.m: + * Headers/AppKit/NSAffineTransform.h: + Remove basic implementation (now in base for MacOS-X compatibility) + retaining gui specific methods and GNUstep extensions (to deprecate?) + * Source/NSImage.m: + * Source/NSStringDrawing.m: + * Source/NSView.m: + Update to use transformStruct accessor method rather than trying to + work with the affine transform ivars directly. + +2006-11-18 Richard Frith-Macdoanld + + * Source/NSScrollView.m: Adjust corner view when scroller is on right. 2006-11-17 Richard Frith-Macdoanld diff --git a/Headers/AppKit/NSAffineTransform.h b/Headers/AppKit/NSAffineTransform.h index 597acd726..954d0f847 100644 --- a/Headers/AppKit/NSAffineTransform.h +++ b/Headers/AppKit/NSAffineTransform.h @@ -5,7 +5,7 @@ Author: Ovidiu Predescu Date: August 1997 - Rewrite for macOS-X compatibility: Richard Frith-Macdonald, 1999 + Rewrite for MacOS-X compatibility: Richard Frith-Macdonald, 1999 This file is part of the GNUstep GUI Library. @@ -29,43 +29,15 @@ #define _GNUstep_H_NSAffineTransform #import -#include -#include +#import @class NSBezierPath; -typedef struct { - float m11; - float m12; - float m21; - float m22; - float tX; - float tY; -} NSAffineTransformStruct; +@interface NSAffineTransform (GUIAdditions) -@interface NSAffineTransform : NSObject -{ -@public - NSAffineTransformStruct matrix; -} - -+ (NSAffineTransform*) transform; -- (void) appendTransform: (NSAffineTransform*)aTransform; - (void) concat; -- (id) initWithTransform: (NSAffineTransform*)aTransform; -- (void) invert; -- (void) prependTransform: (NSAffineTransform*)aTransform; -- (void) rotateByDegrees: (float)angle; -- (void) rotateByRadians: (float)angleRad; -- (void) scaleBy: (float)scale; -- (void) scaleXBy: (float)scaleX yBy: (float)scaleY; - (void) set; -- (void) setTransformStruct: (NSAffineTransformStruct)val; - (NSBezierPath*) transformBezierPath: (NSBezierPath*)aPath; -- (NSPoint) transformPoint: (NSPoint)aPoint; -- (NSSize) transformSize: (NSSize)aSize; -- (NSAffineTransformStruct) transformStruct; -- (void) translateXBy: (float)tranX yBy: (float)tranY; @end #if OS_API_VERSION(GS_API_NONE, GS_API_NONE) @@ -77,7 +49,7 @@ typedef struct { - (void) setFrameOrigin: (NSPoint)point; - (void) setFrameRotation: (float)angle; -/* Old Apple name for -invert */ +/* Deprecated: use -invert */ - (void) inverse; - (BOOL) isRotated; @@ -93,7 +65,9 @@ typedef struct { - (NSSize) sizeInMatrixSpace: (NSSize)size; - (NSRect) rectInMatrixSpace: (NSRect)rect; +/* Deprecated: use -setTransformStruct: */ - (void) setMatrix: (const float[6])replace; +/* Deprecated: use -transformStruct */ - (void) getMatrix: (float[6])replace; - (void) takeMatrixFromTransform: (NSAffineTransform *)aTransform; diff --git a/Source/NSAffineTransform.m b/Source/NSAffineTransform.m index 7c7022225..1c86132cd 100644 --- a/Source/NSAffineTransform.m +++ b/Source/NSAffineTransform.m @@ -25,7 +25,8 @@ You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free - Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. + Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02111 USA. */ #include "config.h" @@ -39,7 +40,13 @@ #include "AppKit/NSBezierPath.h" #include "AppKit/PSOperators.h" +typedef struct internal +{ + @defs(NSAffineTransform) +} *iptr; + /* Private definitions */ +#define matrix (((iptr)self)->_matrix) #define A matrix.m11 #define B matrix.m12 #define C matrix.m21 @@ -71,46 +78,11 @@ matrix_multiply (NSAffineTransformStruct MA, NSAffineTransformStruct MB) return MC; } -@implementation NSAffineTransform - static NSAffineTransformStruct identityTransform = { 1.0, 0.0, 0.0, 1.0, 0.0, 0.0 }; -/** - * Return an autoreleased instance of this class. - */ -+ (NSAffineTransform*) transform -{ - NSAffineTransform *t; - - t = (NSAffineTransform*)NSAllocateObject(self, 0, NSDefaultMallocZone()); - t->matrix = identityTransform; - return AUTORELEASE(t); -} - -/** - * Return an autoreleased instance of this class. - */ -+ (id) new -{ - NSAffineTransform *t; - - t = (NSAffineTransform*)NSAllocateObject(self, 0, NSDefaultMallocZone()); - t->matrix = identityTransform; - return t; -} - -/** - * Appends the transform matrix to the receiver. This is done by performing a - * matrix multiplication of the receiver with aTransform so that aTransform - * is the first transform applied to the user coordinate. The new - * matrix then replaces the receiver's matrix. - */ -- (void) appendTransform: (NSAffineTransform*)aTransform -{ - matrix = matrix_multiply(matrix, aTransform->matrix); -} +@implementation NSAffineTransform (GUIAdditions) /** * Concatenates the receiver's matrix with the one in the current graphics @@ -128,142 +100,18 @@ static NSAffineTransformStruct identityTransform = { PSconcat(m); } -/** - * Initialize the transformation matrix instance to the identity matrix. - * The identity matrix transforms a point to itself. - */ -- (id) init -{ - matrix = identityTransform; - return self; -} - -/** - * Initialize the receiever's instance with the instance represented - * by aTransform. - */ -- (id) initWithTransform: (NSAffineTransform*)aTransform -{ - matrix = aTransform->matrix; - return self; -} - -/** - * Calculates the inverse of the receiver's matrix and replaces the - * receiever's matrix with it. - */ -- (void) invert -{ - float newA, newB, newC, newD, newTX, newTY; - float det; - - det = A * D - B * C; - if (det == 0) - { - NSLog (@"error: determinant of matrix is 0!"); - return; - } - - newA = D / det; - newB = -B / det; - newC = -C / det; - newD = A / det; - newTX = (-D * TX + C * TY) / det; - newTY = (B * TX - A * TY) / det; - - NSDebugLLog(@"NSAffineTransform", - @"inverse of matrix ((%f, %f) (%f, %f) (%f, %f))\n" - @"is ((%f, %f) (%f, %f) (%f, %f))", - A, B, C, D, TX, TY, - newA, newB, newC, newD, newTX, newTY); - - A = newA; B = newB; - C = newC; D = newD; - TX = newTX; TY = newTY; -} - -/** - * Prepends the transform matrix to the receiver. This is done by performing a - * matrix multiplication of the receiver with aTransform so that aTransform - * is the last transform applied to the user coordinate. The new - * matrix then replaces the receiver's matrix. - */ -- (void) prependTransform: (NSAffineTransform*)aTransform -{ - matrix = matrix_multiply(aTransform->matrix, matrix); -} - -/** - * Applies the rotation specified by angle in degrees. Points transformed - * with the transformation matrix of the receiver are rotated counter-clockwise - * by the number of degrees specified by angle. - */ -- (void) rotateByDegrees: (float)angle -{ - [self rotateByRadians: pi * angle / 180]; -} - -/** - * Applies the rotation specified by angle in radians. Points transformed - * with the transformation matrix of the receiver are rotated counter-clockwise - * by the number of radians specified by angle. - */ -- (void) rotateByRadians: (float)angleRad -{ - float sine = sin (angleRad); - float cosine = cos (angleRad); - NSAffineTransformStruct rotm; - rotm.m11 = cosine; rotm.m12 = sine; rotm.m21 = -sine; rotm.m22 = cosine; - rotm.tX = rotm.tY = 0; - matrix = matrix_multiply(rotm, matrix); -} - -/** - * Scales the transformation matrix of the reciever by the factor specified - * by scale. - */ -- (void) scaleBy: (float)scale -{ - NSAffineTransformStruct scam = identityTransform; - scam.m11 = scale; scam.m22 = scale; - matrix = matrix_multiply(scam, matrix); -} - -/** - * Scales the X axis of the receiver's transformation matrix - * by scaleX and the Y axis of the transformation matrix by scaleY. - */ -- (void) scaleXBy: (float)scaleX yBy: (float)scaleY -{ - NSAffineTransformStruct scam = identityTransform; - scam.m11 = scaleX; scam.m22 = scaleY; - matrix = matrix_multiply(scam, matrix); -} /** * Get the currently active graphics context's transformation * matrix and set it into the receiver. */ - - (void) set { GSSetCTM(GSCurrentContext(), self); } /** - *

- * Sets the structure which represents the matrix of the reciever. - * The struct is of the form:

- *

{m11, m12, m21, m22, tX, tY}

- */ -- (void) setTransformStruct: (NSAffineTransformStruct)val -{ - matrix = val; -} - -/** - *

- * Applies the receiver's transformation matrix to each point in + *

Applies the receiver's transformation matrix to each point in * the bezier path, then returns the result. The original bezier * path is not modified. *

@@ -276,104 +124,7 @@ static NSAffineTransformStruct identityTransform = { return AUTORELEASE(path); } -/** - * Transforms a single point based on the transformation matrix. - * Returns the resulting point. - */ -- (NSPoint) transformPoint: (NSPoint)aPoint -{ - NSPoint new; - - new.x = A * aPoint.x + C * aPoint.y + TX; - new.y = B * aPoint.x + D * aPoint.y + TY; - - return new; -} - -/** - * Transforms the NSSize represented by aSize using the reciever's - * transformation matrix. Returns the resulting NSSize. - */ -- (NSSize) transformSize: (NSSize)aSize -{ - NSSize new; - - new.width = A * aSize.width + C * aSize.height; - if (new.width < 0) - new.width = - new.width; - new.height = B * aSize.width + D * aSize.height; - if (new.height < 0) - new.height = - new.height; - - return new; -} - -/** - *

- * Returns the NSAffineTransformStruct structure - * which represents the matrix of the reciever. - * The struct is of the form:

- *

{m11, m12, m21, m22, tX, tY}

- */ -- (NSAffineTransformStruct) transformStruct -{ - return matrix; -} - -/** - * Applies the translation specified by tranX and tranY to the receiver's matrix. - * Points transformed by the reciever's matrix after this operation will - * be shifted in position based on the specified translation. - */ -- (void) translateXBy: (float)tranX yBy: (float)tranY -{ - NSAffineTransformStruct tranm = identityTransform; - tranm.tX = tranX; - tranm.tY = tranY; - matrix = matrix_multiply(tranm, matrix); -} - -- (id) copyWithZone: (NSZone*)zone -{ - return NSCopyObject(self, 0, zone); -} - -- (BOOL) isEqual: (id)anObject -{ - if ([anObject class] == isa) - { - NSAffineTransform *o = anObject; - - if (A == o->A && B == o->B && C == o->C - && D == o->D && TX == o->TX && TY == o->TY) - return YES; - } - return NO; -} - -- (id) initWithCoder: (NSCoder*)aCoder -{ - float replace[6]; - - [aCoder decodeArrayOfObjCType: @encode(float) - count: 6 - at: replace]; - [self setMatrix: replace]; - - return self; -} - -- (void) encodeWithCoder: (NSCoder*)aCoder -{ - float replace[6]; - - [self getMatrix: replace]; - [aCoder encodeArrayOfObjCType: @encode(float) - count: 6 - at: replace]; -} - -@end /* NSAffineTransform */ +@end /* NSAffineTransform (GUIAdditions) */ @implementation NSAffineTransform (GNUstep) @@ -571,13 +322,6 @@ static NSAffineTransformStruct identityTransform = { return new; } -- (NSString*) description -{ - return [NSString stringWithFormat: - @"NSAffineTransform ((%f, %f) (%f, %f) (%f, %f))", - A, B, C, D, TX, TY]; -} - - (void) setMatrix: (const float[6])replace { matrix.m11 = replace[0]; @@ -600,12 +344,7 @@ static NSAffineTransformStruct identityTransform = { - (void) takeMatrixFromTransform: (NSAffineTransform *)aTransform { - matrix.m11 = aTransform->matrix.m11; - matrix.m12 = aTransform->matrix.m12; - matrix.m21 = aTransform->matrix.m21; - matrix.m22 = aTransform->matrix.m22; - matrix.tX = aTransform->matrix.tX; - matrix.tY = aTransform->matrix.tY; + matrix = [aTransform transformStruct]; } diff --git a/Source/NSImage.m b/Source/NSImage.m index 9d85d5f1f..a4810255b 100644 --- a/Source/NSImage.m +++ b/Source/NSImage.m @@ -1005,7 +1005,7 @@ repd_for_rep(NSArray *_reps, NSImageRep *rep) NSAffineTransform *transform; if (!dstRect.size.width || !dstRect.size.height - || !srcRect.size.width || !srcRect.size.height) + || !srcRect.size.width || !srcRect.size.height) return; if (![ctxt isDrawingToScreen]) @@ -1046,16 +1046,19 @@ repd_for_rep(NSArray *_reps, NSImageRep *rep) /* If the effective transform is the identity transform and there's no dissolve, we can composite from our cache. */ - if (delta == 1.0 - && fabs(transform->matrix.m11 - 1.0) < 0.01 - && fabs(transform->matrix.m12) < 0.01 - && fabs(transform->matrix.m21) < 0.01 - && fabs(transform->matrix.m22 - 1.0) < 0.01) + + if (delta == 1.0) { - [self compositeToPoint: dstRect.origin - fromRect: srcRect - operation: op]; - return; + NSAffineTransformStruct ts = [transform transformStruct]; + + if (fabs(ts.m11 - 1.0) < 0.01 && fabs(ts.m12) < 0.01 + && fabs(ts.m21) < 0.01 && fabs(ts.m22 - 1.0) < 0.01) + { + [self compositeToPoint: dstRect.origin + fromRect: srcRect + operation: op]; + return; + } } /* We can't composite or dissolve directly from the image reps, so we @@ -1078,6 +1081,7 @@ repd_for_rep(NSArray *_reps, NSImageRep *rep) */ { NSCachedImageRep *cache; + NSAffineTransformStruct ts; NSSize s; NSPoint p; double x0, y0, x1, y1, w, h; @@ -1134,8 +1138,10 @@ repd_for_rep(NSArray *_reps, NSImageRep *rep) /* Set up the effective transform. We also save a gState with this transform to make it easier to do the final composite. */ - transform->matrix.tX = p.x; - transform->matrix.tY = p.y; + ts = [transform transformStruct]; + ts.tX = p.x; + ts.tY = p.y; + [transform setTransformStruct: ts]; [ctxt GSSetCTM: transform]; gState = [ctxt GSDefineGState]; diff --git a/Source/NSScrollView.m b/Source/NSScrollView.m index a887f0bcd..f5f9639e0 100644 --- a/Source/NSScrollView.m +++ b/Source/NSScrollView.m @@ -832,6 +832,15 @@ static float scrollerWidth; NSSize border = _sizeForBorderType(_borderType); NSRectEdge bottomEdge, topEdge; float headerViewHeight = 0; + NSRectEdge verticalScrollerEdge = NSMinXEdge; + NSInterfaceStyle style; + + style = NSInterfaceStyleForKey(@"NSScrollViewInterfaceStyle", nil); + if (style == NSMacintoshInterfaceStyle + || style == NSWindows95InterfaceStyle) + { + verticalScrollerEdge = NSMaxXEdge; + } /* Determine edge positions. */ if (_rFlags.flipped_view) @@ -880,24 +889,15 @@ static float scrollerWidth; if (_hasVertScroller) { NSRect vertScrollerRect; - NSRectEdge edge = NSMinXEdge; - NSInterfaceStyle style; - - style = NSInterfaceStyleForKey(@"NSScrollViewInterfaceStyle", nil); - if (style == NSMacintoshInterfaceStyle - || style == NSWindows95InterfaceStyle) - { - edge = NSMaxXEdge; - } NSDivideRect (contentRect, &vertScrollerRect, &contentRect, - scrollerWidth, edge); + scrollerWidth, verticalScrollerEdge); [_vertScroller setFrame: vertScrollerRect]; /* Substract 1 for the line that separates the vertical scroller * from the clip view (and eventually the horizontal scroller). */ - NSDivideRect (contentRect, NULL, &contentRect, 1, edge); + NSDivideRect (contentRect, NULL, &contentRect, 1, verticalScrollerEdge); } /* Prepare the horizontal scroller. */ @@ -930,7 +930,13 @@ static float scrollerWidth; /* Now place the corner view. */ if (_hasCornerView) { - [_cornerView setFrameOrigin: headerRect.origin]; + NSPoint p = headerRect.origin; + + if (verticalScrollerEdge == NSMaxXEdge) + { + p.x += contentRect.size.width; + } + [_cornerView setFrameOrigin: p]; } /* Now place the rulers. */ @@ -1040,12 +1046,12 @@ static float scrollerWidth; return [_contentView backgroundColor]; } -- (void)setDrawsBackground:(BOOL)flag +- (void) setDrawsBackground: (BOOL)flag { [_contentView setDrawsBackground: flag]; } -- (BOOL)drawsBackground +- (BOOL) drawsBackground { return [_contentView drawsBackground]; } @@ -1454,6 +1460,7 @@ static float scrollerWidth; BOOL hadHeaderView = _hasHeaderView; BOOL hadCornerView = _hasCornerView; NSView *aView = nil; + _hasHeaderView = ([[self documentView] respondsToSelector: @selector(headerView)] && (aView=[(NSTableView *)[self documentView] headerView])); @@ -1475,8 +1482,8 @@ static float scrollerWidth; { aView = nil; _hasCornerView = - ([[self documentView] respondsToSelector: @selector(cornerView)] - && (aView=[(NSTableView *)[self documentView] cornerView])); + ([[self documentView] respondsToSelector: @selector(cornerView)] + && (aView=[(NSTableView *)[self documentView] cornerView])); if (aView == _cornerView) return; @@ -1484,7 +1491,7 @@ static float scrollerWidth; { if (hadCornerView == NO) { - [self addSubview:aView]; + [self addSubview: aView]; } else { diff --git a/Source/NSStringDrawing.m b/Source/NSStringDrawing.m index f2260b949..fc4c8cd16 100644 --- a/Source/NSStringDrawing.m +++ b/Source/NSStringDrawing.m @@ -350,11 +350,11 @@ static int cache_lookup_attributed_string(NSAttributedString *string, static int use_screen_fonts(void) { - NSGraphicsContext *ctxt = GSCurrentContext(); - NSAffineTransform *ctm = GSCurrentCTM(ctxt); + NSGraphicsContext *ctxt = GSCurrentContext(); + NSAffineTransform *ctm = GSCurrentCTM(ctxt); + NSAffineTransformStruct ts = [ctm transformStruct]; - if (ctm->matrix.m11 != 1.0 || ctm->matrix.m12 != 0.0 || - ctm->matrix.m21 != 0.0 || fabs(ctm->matrix.m22) != 1.0) + if (ts.m11 != 1.0 || ts.m12 != 0.0 || ts.m21 != 0.0 || fabs(ts.m22) != 1.0) { return 0; } diff --git a/Source/NSView.m b/Source/NSView.m index 627893f3e..77ef45c09 100644 --- a/Source/NSView.m +++ b/Source/NSView.m @@ -306,16 +306,12 @@ GSSetDragTypes(NSView* obj, NSArray *types) NSRect superviewsVisibleRect; BOOL wasFlipped = _super_view->_rFlags.flipped_view; NSAffineTransform *pMatrix = [_super_view _matrixToWindow]; - NSAffineTransform *tMatrix = nil; - - [_matrixToWindow takeMatrixFromTransform: pMatrix]; + NSAffineTransformStruct ts = [pMatrix transformStruct]; /* prepend translation */ - tMatrix = _matrixToWindow; - tMatrix->matrix.tX = NSMinX(_frame) * tMatrix->matrix.m11 + - NSMinY(_frame) * tMatrix->matrix.m21 + tMatrix->matrix.tX; - tMatrix->matrix.tY = NSMinX(_frame) * tMatrix->matrix.m12 + - NSMinY(_frame) * tMatrix->matrix.m22 + tMatrix->matrix.tY; + ts.tX = NSMinX(_frame) * ts.m11 + NSMinY(_frame) * ts.m21 + ts.tX; + ts.tY = NSMinX(_frame) * ts.m12 + NSMinY(_frame) * ts.m22 + ts.tY; + [_matrixToWindow setTransformStruct: ts]; /* prepend rotation */ if (_frameMatrix != nil) @@ -330,11 +326,14 @@ GSSetDragTypes(NSView* obj, NSArray *types) * exactly overlays the original. To do that, we must translate * the origin by the height of the view. */ - flip->matrix.tY = _frame.size.height; + ts = [flip transformStruct]; + ts.tY = _frame.size.height; + [flip setTransformStruct: ts]; (*preImp)(_matrixToWindow, preSel, flip); } (*preImp)(_matrixToWindow, preSel, _boundsMatrix); - [_matrixFromWindow takeMatrixFromTransform: _matrixToWindow]; + ts = [_matrixToWindow transformStruct]; + [_matrixFromWindow setTransformStruct: ts]; [_matrixFromWindow invert]; superviewsVisibleRect = [self convertRect: [_super_view visibleRect]