mirror of
https://github.com/gnustep/libs-gui.git
synced 2025-04-22 13:10:59 +00:00
Added checks on rectangle dimensions etc
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@3891 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
96b894fdab
commit
f5d2532cd0
3 changed files with 177 additions and 31 deletions
11
ChangeLog
11
ChangeLog
|
@ -1,8 +1,19 @@
|
|||
Wed Mar 10 12:56:00 1999 Richard Frith-Macdonald <richard@brainstorm.co.uk>
|
||||
|
||||
* Source/NSAffineTransform.m: Improved debug logging.
|
||||
* Source/NSView.m: Add loads of checks to ensure that you can't set
|
||||
illegal (negative) dimensions in frame or bounds. Add loads of code
|
||||
to cope with scaling when bounds dimensions are zero.
|
||||
Added logged warning if you set bounds dimensions to zero.
|
||||
Changed debug logging to use the 'NSView' logging level.
|
||||
|
||||
Tue Mar 9 19:57:00 1999 Richard Frith-Macdonald <richard@brainstorm.co.uk>
|
||||
|
||||
* Headers/AppKit/NSParagraphStyle.h: Tidied
|
||||
* Headers/AppKit/NSTextStorage.h: Tidied
|
||||
* Source/NSParagraphStyle.m: Implemented NSTextTab, NSParagraphStyle,
|
||||
and NSMutableParagraphStyle classes.
|
||||
* Source/NSTextStorage.m: Added incomplete implementation.
|
||||
|
||||
1999-03-08 Adam Fedor <fedor@gnu.org>
|
||||
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#include <math.h>
|
||||
|
||||
#include <Foundation/NSArray.h>
|
||||
#include <Foundation/NSException.h>
|
||||
#include <Foundation/NSString.h>
|
||||
|
||||
#include <AppKit/config.h>
|
||||
|
@ -124,7 +125,7 @@ static NSAffineTransformStruct identityTransform = {
|
|||
float det;
|
||||
|
||||
det = A * D - B * C;
|
||||
if (!det)
|
||||
if (det == 0)
|
||||
{
|
||||
NSLog (@"error: determinant of matrix is 0!");
|
||||
return;
|
||||
|
@ -137,7 +138,8 @@ static NSAffineTransformStruct identityTransform = {
|
|||
newTX = (-D * TX + C * TY) / det;
|
||||
newTY = (B * TX - A * TY) / det;
|
||||
|
||||
NSDebugLog (@"inverse of matrix ((%f, %f) (%f, %f) (%f, %f))\n"
|
||||
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);
|
||||
|
|
191
Source/NSView.m
191
Source/NSView.m
|
@ -82,7 +82,7 @@ static SEL invalidateSel = @selector(_invalidateCoordinates);
|
|||
flip = [matrixClass new];
|
||||
[flip setTransformStruct: ats];
|
||||
|
||||
NSDebugLog(@"Initialize NSView class\n");
|
||||
NSDebugLLog(@"NSView", @"Initialize NSView class\n");
|
||||
[self setVersion: 1];
|
||||
}
|
||||
}
|
||||
|
@ -108,6 +108,9 @@ static SEL invalidateSel = @selector(_invalidateCoordinates);
|
|||
{
|
||||
[super init]; // super is NSResponder
|
||||
|
||||
NSAssert(frameRect.size.width >= 0 && frameRect.size.height >= 0,
|
||||
@"illegal frame dimensions supplied");
|
||||
|
||||
frame = frameRect; // Set frame rectangle
|
||||
bounds.origin = NSZeroPoint; // Set bounds rectangle
|
||||
bounds.size = frame.size;
|
||||
|
@ -393,6 +396,9 @@ static SEL invalidateSel = @selector(_invalidateCoordinates);
|
|||
{
|
||||
NSSize old_size = frame.size;
|
||||
|
||||
NSAssert(frameRect.size.width >= 0 && frameRect.size.height >= 0,
|
||||
@"illegal frame dimensions supplied");
|
||||
|
||||
if (coordinates_valid)
|
||||
(*invalidateImp)(self, invalidateSel);
|
||||
frame = frameRect;
|
||||
|
@ -423,6 +429,8 @@ static SEL invalidateSel = @selector(_invalidateCoordinates);
|
|||
{
|
||||
NSSize old_size = frame.size;
|
||||
|
||||
NSAssert(newSize.width >= 0 && newSize.height >= 0,
|
||||
@"illegal frame dimensions supplied");
|
||||
if (coordinates_valid)
|
||||
(*invalidateImp)(self, invalidateSel);
|
||||
frame.size = bounds.size = newSize;
|
||||
|
@ -469,20 +477,44 @@ static SEL invalidateSel = @selector(_invalidateCoordinates);
|
|||
|
||||
- (void) scaleUnitSquareToSize: (NSSize)newSize
|
||||
{
|
||||
float sx;
|
||||
float sy;
|
||||
|
||||
NSAssert(newSize.width > 0 && newSize.height > 0, @"illegal size supplied");
|
||||
|
||||
if (coordinates_valid)
|
||||
(*invalidateImp)(self, invalidateSel);
|
||||
if (!newSize.width)
|
||||
newSize.width = 1;
|
||||
if (!newSize.height)
|
||||
newSize.height = 1;
|
||||
|
||||
bounds.size.width = frame.size.width / newSize.width;
|
||||
bounds.size.height = frame.size.height / newSize.height;
|
||||
|
||||
is_rotated_or_scaled_from_base = YES;
|
||||
|
||||
[boundsMatrix scaleBy: frame.size.width / bounds.size.width
|
||||
: frame.size.height / bounds.size.height];
|
||||
if (bounds.size.width == 0)
|
||||
{
|
||||
if (frame.size.width == 0)
|
||||
sx = 1;
|
||||
else
|
||||
sx = FLT_MAX;
|
||||
}
|
||||
else
|
||||
{
|
||||
sx = frame.size.width / bounds.size.width;
|
||||
}
|
||||
|
||||
if (bounds.size.height == 0)
|
||||
{
|
||||
if (frame.size.height == 0)
|
||||
sy = 1;
|
||||
else
|
||||
sy = FLT_MAX;
|
||||
}
|
||||
else
|
||||
{
|
||||
sy = frame.size.height / bounds.size.height;
|
||||
}
|
||||
|
||||
[boundsMatrix scaleBy: sx : sy];
|
||||
|
||||
if (post_bounds_changes)
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
|
@ -494,15 +526,39 @@ static SEL invalidateSel = @selector(_invalidateCoordinates);
|
|||
{
|
||||
float sx, sy;
|
||||
|
||||
NSAssert(aRect.size.width >= 0 && aRect.size.height >= 0,
|
||||
@"illegal bounds dimensions supplied");
|
||||
|
||||
if (coordinates_valid)
|
||||
(*invalidateImp)(self, invalidateSel);
|
||||
if (aRect.size.width <= 0 || aRect.size.height <= 0)
|
||||
[NSException raise: NSInvalidArgumentException
|
||||
format: @"illegal bounds size supplied"];
|
||||
|
||||
bounds = aRect;
|
||||
[boundsMatrix setFrameOrigin: NSMakePoint(-bounds.origin.x,-bounds.origin.y)];
|
||||
sx = frame.size.width / bounds.size.width;
|
||||
sy = frame.size.height / bounds.size.height;
|
||||
|
||||
if (bounds.size.width == 0)
|
||||
{
|
||||
if (frame.size.width == 0)
|
||||
sx = 1;
|
||||
else
|
||||
sx = FLT_MAX;
|
||||
}
|
||||
else
|
||||
{
|
||||
sx = frame.size.width / bounds.size.width;
|
||||
}
|
||||
|
||||
if (bounds.size.height == 0)
|
||||
{
|
||||
if (frame.size.height == 0)
|
||||
sy = 1;
|
||||
else
|
||||
sy = FLT_MAX;
|
||||
}
|
||||
else
|
||||
{
|
||||
sy = frame.size.height / bounds.size.height;
|
||||
}
|
||||
|
||||
[boundsMatrix scaleTo: sx : sy];
|
||||
|
||||
if (sx != 1 || sy != 1)
|
||||
|
@ -532,14 +588,48 @@ static SEL invalidateSel = @selector(_invalidateCoordinates);
|
|||
{
|
||||
float sx, sy;
|
||||
|
||||
NSAssert(newSize.width >= 0 && newSize.height >= 0,
|
||||
@"illegal bounds dimensions supplied");
|
||||
|
||||
if (coordinates_valid)
|
||||
(*invalidateImp)(self, invalidateSel);
|
||||
if (newSize.width <= 0 || newSize.height <= 0)
|
||||
[NSException raise: NSInvalidArgumentException
|
||||
format: @"illegal bounds size supplied"];
|
||||
bounds.size = newSize;
|
||||
sx = frame.size.width / bounds.size.width;
|
||||
sy = frame.size.height / bounds.size.height;
|
||||
{
|
||||
(*invalidateImp)(self, invalidateSel);
|
||||
}
|
||||
if (newSize.width == 0)
|
||||
{
|
||||
NSLog(@"[NSView -setBoundsSize:] zero width supplied");
|
||||
}
|
||||
if (newSize.height == 0)
|
||||
{
|
||||
NSLog(@"[NSView -setBoundsSize:] zero height supplied");
|
||||
}
|
||||
|
||||
bounds.size = newSize;
|
||||
|
||||
if (bounds.size.width == 0)
|
||||
{
|
||||
if (frame.size.width == 0)
|
||||
sx = 1;
|
||||
else
|
||||
sx = FLT_MAX;
|
||||
}
|
||||
else
|
||||
{
|
||||
sx = frame.size.width / bounds.size.width;
|
||||
}
|
||||
|
||||
if (bounds.size.height == 0)
|
||||
{
|
||||
if (frame.size.height == 0)
|
||||
sy = 1;
|
||||
else
|
||||
sy = FLT_MAX;
|
||||
}
|
||||
else
|
||||
{
|
||||
sy = frame.size.height / bounds.size.height;
|
||||
}
|
||||
|
||||
[boundsMatrix scaleTo: sx : sy];
|
||||
|
||||
if (sx != 1 || sy != 1)
|
||||
|
@ -578,7 +668,27 @@ static SEL invalidateSel = @selector(_invalidateCoordinates);
|
|||
|
||||
- (NSRect) centerScanRect: (NSRect)aRect
|
||||
{
|
||||
return NSZeroRect;
|
||||
NSAffineTransform *matrix;
|
||||
|
||||
/*
|
||||
* Hmm - we assume that the windows coordinate system is centered on the
|
||||
* pixels of the screen - this may not be correct of course.
|
||||
* Plus - this is all pretty meaningless is we are not in a window!
|
||||
*/
|
||||
matrix = [self _matrixToWindow];
|
||||
aRect.origin = [matrix pointInMatrixSpace: aRect.origin];
|
||||
aRect.size = [matrix sizeInMatrixSpace: aRect.size];
|
||||
|
||||
aRect.origin.x = floor(aRect.origin.x);
|
||||
aRect.origin.y = floor(aRect.origin.y);
|
||||
aRect.size.width = floor(aRect.size.width);
|
||||
aRect.size.height = floor(aRect.size.height);
|
||||
|
||||
matrix = [self _matrixFromWindow];
|
||||
aRect.origin = [matrix pointInMatrixSpace: aRect.origin];
|
||||
aRect.size = [matrix sizeInMatrixSpace: aRect.size];
|
||||
|
||||
return aRect;
|
||||
}
|
||||
|
||||
- (NSPoint) convertPoint: (NSPoint)aPoint fromView: (NSView*)aView
|
||||
|
@ -845,8 +955,32 @@ static SEL invalidateSel = @selector(_invalidateCoordinates);
|
|||
|
||||
if (changedSize && is_rotated_or_scaled_from_base)
|
||||
{
|
||||
float sx = frame.size.width / bounds.size.width;
|
||||
float sy = frame.size.height / bounds.size.height;
|
||||
float sx;
|
||||
float sy;
|
||||
|
||||
if (bounds.size.width == 0)
|
||||
{
|
||||
if (frame.size.width == 0)
|
||||
sx = 1;
|
||||
else
|
||||
sx = FLT_MAX;
|
||||
}
|
||||
else
|
||||
{
|
||||
sx = frame.size.width / bounds.size.width;
|
||||
}
|
||||
|
||||
if (bounds.size.height == 0)
|
||||
{
|
||||
if (frame.size.height == 0)
|
||||
sy = 1;
|
||||
else
|
||||
sy = FLT_MAX;
|
||||
}
|
||||
else
|
||||
{
|
||||
sy = frame.size.height / bounds.size.height;
|
||||
}
|
||||
|
||||
[boundsMatrix scaleTo: sx : sy];
|
||||
}
|
||||
|
@ -1071,9 +1205,8 @@ static SEL invalidateSel = @selector(_invalidateCoordinates);
|
|||
if (!window)
|
||||
return;
|
||||
|
||||
if (!boundsMatrix || !frameMatrix)
|
||||
NSLog (@"warning: %@ %p does not have it's PS matrices configured!",
|
||||
NSStringFromClass(isa), self);
|
||||
if (coordinates_valid == NO)
|
||||
[self _rebuildCoordinates];
|
||||
|
||||
[self lockFocus];
|
||||
[self drawRect: aRect];
|
||||
|
@ -1569,7 +1702,7 @@ static SEL invalidateSel = @selector(_invalidateCoordinates);
|
|||
{
|
||||
[super encodeWithCoder: aCoder];
|
||||
|
||||
NSDebugLog(@"NSView: start encoding\n");
|
||||
NSDebugLLog(@"NSView", @"NSView: start encoding\n");
|
||||
[aCoder encodeRect: frame];
|
||||
[aCoder encodeRect: bounds];
|
||||
[aCoder encodeConditionalObject: super_view];
|
||||
|
@ -1583,14 +1716,14 @@ static SEL invalidateSel = @selector(_invalidateCoordinates);
|
|||
[aCoder encodeValueOfObjCType: @encode(BOOL) at: &disable_autodisplay];
|
||||
[aCoder encodeValueOfObjCType: @encode(BOOL) at: &post_frame_changes];
|
||||
[aCoder encodeValueOfObjCType: @encode(BOOL) at: &autoresize_subviews];
|
||||
NSDebugLog(@"NSView: finish encoding\n");
|
||||
NSDebugLLog(@"NSView", @"NSView: finish encoding\n");
|
||||
}
|
||||
|
||||
- (id) initWithCoder: (NSCoder*)aDecoder
|
||||
{
|
||||
[super initWithCoder: aDecoder];
|
||||
|
||||
NSDebugLog(@"NSView: start decoding\n");
|
||||
NSDebugLLog(@"NSView", @"NSView: start decoding\n");
|
||||
frame = [aDecoder decodeRect];
|
||||
bounds = [aDecoder decodeRect];
|
||||
super_view = [aDecoder decodeObject];
|
||||
|
@ -1604,7 +1737,7 @@ static SEL invalidateSel = @selector(_invalidateCoordinates);
|
|||
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &disable_autodisplay];
|
||||
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &post_frame_changes];
|
||||
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &autoresize_subviews];
|
||||
NSDebugLog(@"NSView: finish decoding\n");
|
||||
NSDebugLLog(@"NSView", @"NSView: finish decoding\n");
|
||||
|
||||
return self;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue