[SCM] WebKit Debian packaging branch, debian/unstable, updated. debian/1.1.15-1-40151-g37bb677

rjw rjw at 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Sat Sep 26 05:57:26 UTC 2009


The following commit has been merged in the debian/unstable branch:
commit a01b708ef707155cbaab284dc15b6c81c51e33bd
Author: rjw <rjw at 268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Thu Mar 14 20:30:26 2002 +0000

    Implemented a progressively cache fragment.
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@738 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog-2002-12-03 b/WebCore/ChangeLog-2002-12-03
index 86568da..d0ad12a 100644
--- a/WebCore/ChangeLog-2002-12-03
+++ b/WebCore/ChangeLog-2002-12-03
@@ -1,3 +1,20 @@
+2002-03-14  Richard Williamson  <rjw at apple.com>
+
+        Implemented a progressively cache fragment.
+        
+	* src/kwq/KWQFontMetrics.mm: (-[KWQSmallLayoutFragment setGlyphRange:]),
+	(-[KWQSmallLayoutFragment setBoundingRect:]), (-[KWQSmallLayoutFragment
+	boundingRect]), (-[KWQLargeLayoutFragment glyphRange]), (-[KWQLargeLayoutFragment
+	setGlyphRange:]), (-[KWQLargeLayoutFragment setBoundingRect:]),
+	(-[KWQLargeLayoutFragment boundingRect]), (-[KWQLargeLayoutFragment compare:]),
+	(+[KWQLayoutInfo drawString:atPoint:withFont:color:]), (+[KWQLayoutInfo
+	drawUnderlineForString:atPoint:withFont:color:]), (+[KWQLayoutInfo
+	_dumpLayoutCache:]), (-[KWQLayoutInfo rectForString:]):
+	* src/kwq/KWQMetrics.h:
+	* src/kwq/KWQTextStorage.h:
+	* src/kwq/KWQTextStorage.mm: (-[KWQTextStorage getFragmentForString:]),
+	(-[KWQTextStorage addFragmentForString:]):
+
 2002-03-13  Richard Williamson  <rjw at apple.com>
 
         Added font cache.  Attempted to reduce size of fragment cache, but
diff --git a/WebCore/ChangeLog-2003-10-25 b/WebCore/ChangeLog-2003-10-25
index 86568da..d0ad12a 100644
--- a/WebCore/ChangeLog-2003-10-25
+++ b/WebCore/ChangeLog-2003-10-25
@@ -1,3 +1,20 @@
+2002-03-14  Richard Williamson  <rjw at apple.com>
+
+        Implemented a progressively cache fragment.
+        
+	* src/kwq/KWQFontMetrics.mm: (-[KWQSmallLayoutFragment setGlyphRange:]),
+	(-[KWQSmallLayoutFragment setBoundingRect:]), (-[KWQSmallLayoutFragment
+	boundingRect]), (-[KWQLargeLayoutFragment glyphRange]), (-[KWQLargeLayoutFragment
+	setGlyphRange:]), (-[KWQLargeLayoutFragment setBoundingRect:]),
+	(-[KWQLargeLayoutFragment boundingRect]), (-[KWQLargeLayoutFragment compare:]),
+	(+[KWQLayoutInfo drawString:atPoint:withFont:color:]), (+[KWQLayoutInfo
+	drawUnderlineForString:atPoint:withFont:color:]), (+[KWQLayoutInfo
+	_dumpLayoutCache:]), (-[KWQLayoutInfo rectForString:]):
+	* src/kwq/KWQMetrics.h:
+	* src/kwq/KWQTextStorage.h:
+	* src/kwq/KWQTextStorage.mm: (-[KWQTextStorage getFragmentForString:]),
+	(-[KWQTextStorage addFragmentForString:]):
+
 2002-03-13  Richard Williamson  <rjw at apple.com>
 
         Added font cache.  Attempted to reduce size of fragment cache, but
diff --git a/WebCore/ChangeLog-2005-08-23 b/WebCore/ChangeLog-2005-08-23
index 86568da..d0ad12a 100644
--- a/WebCore/ChangeLog-2005-08-23
+++ b/WebCore/ChangeLog-2005-08-23
@@ -1,3 +1,20 @@
+2002-03-14  Richard Williamson  <rjw at apple.com>
+
+        Implemented a progressively cache fragment.
+        
+	* src/kwq/KWQFontMetrics.mm: (-[KWQSmallLayoutFragment setGlyphRange:]),
+	(-[KWQSmallLayoutFragment setBoundingRect:]), (-[KWQSmallLayoutFragment
+	boundingRect]), (-[KWQLargeLayoutFragment glyphRange]), (-[KWQLargeLayoutFragment
+	setGlyphRange:]), (-[KWQLargeLayoutFragment setBoundingRect:]),
+	(-[KWQLargeLayoutFragment boundingRect]), (-[KWQLargeLayoutFragment compare:]),
+	(+[KWQLayoutInfo drawString:atPoint:withFont:color:]), (+[KWQLayoutInfo
+	drawUnderlineForString:atPoint:withFont:color:]), (+[KWQLayoutInfo
+	_dumpLayoutCache:]), (-[KWQLayoutInfo rectForString:]):
+	* src/kwq/KWQMetrics.h:
+	* src/kwq/KWQTextStorage.h:
+	* src/kwq/KWQTextStorage.mm: (-[KWQTextStorage getFragmentForString:]),
+	(-[KWQTextStorage addFragmentForString:]):
+
 2002-03-13  Richard Williamson  <rjw at apple.com>
 
         Added font cache.  Attempted to reduce size of fragment cache, but
diff --git a/WebCore/kwq/KWQFontMetrics.mm b/WebCore/kwq/KWQFontMetrics.mm
index 6ed1589..5c70d7e 100644
--- a/WebCore/kwq/KWQFontMetrics.mm
+++ b/WebCore/kwq/KWQFontMetrics.mm
@@ -38,7 +38,7 @@
 const float LargeNumberForText = 1.0e7;
 
 
- at implementation KWQLayoutFragment
+ at implementation KWQSmallLayoutFragment
 - (NSRange)glyphRange
 {
     NSRange glyphRange;
@@ -49,14 +49,15 @@ const float LargeNumberForText = 1.0e7;
     return glyphRange;
 }
 
-- (void)setGlyphRangeLength: (unsigned short)l
+- (void)setGlyphRange: (NSRange)r
 {
-    glyphRangeLength = l;
+    glyphRangeLength = r.length;
 }
 
-- (void)setBoundingRectSize: (NSSize)s
+- (void)setBoundingRect: (NSRect)r
 {
-    boundingRectSize = s;
+    width = (unsigned short)r.size.width;
+    height = (unsigned short)r.size.height;
 }
 
 - (NSRect)boundingRect
@@ -65,7 +66,8 @@ const float LargeNumberForText = 1.0e7;
     
     boundingRect.origin.x = 0;
     boundingRect.origin.y = 0;
-    boundingRect.size = boundingRectSize;
+    boundingRect.size.width = (float)width;
+    boundingRect.size.height = (float)height;
     
 #ifdef _DEBUG_LAYOUT_FRAGMENT
     accessCount++;
@@ -92,6 +94,48 @@ const float LargeNumberForText = 1.0e7;
 
 @end
 
+ at implementation KWQLargeLayoutFragment
+- (NSRange)glyphRange
+{
+    return glyphRange;
+}
+
+- (void)setGlyphRange: (NSRange)r
+{
+    glyphRange = r;
+}
+
+- (void)setBoundingRect: (NSRect)r
+{
+    boundingRect = r;
+}
+
+- (NSRect)boundingRect
+{
+#ifdef _DEBUG_LAYOUT_FRAGMENT
+    accessCount++;
+#endif
+
+    return boundingRect;
+}
+
+#ifdef _DEBUG_LAYOUT_FRAGMENT
+- (int)accessCount { return accessCount; }
+#endif
+
+#ifdef _DEBUG_LAYOUT_FRAGMENT
+- (NSComparisonResult)compare: (id)val
+{
+    if ([val accessCount] > accessCount)
+        return NSOrderedDescending;
+    else if ([val accessCount] < accessCount)
+        return NSOrderedAscending;
+    return NSOrderedSame;
+}
+
+#endif
+
+ at end
 
 static NSMutableDictionary *metricsCache = nil;
 
@@ -107,7 +151,7 @@ static NSMutableDictionary *metricsCache = nil;
     KWQTextStorage *storage = [layoutInfo textStorage];
 
     if (manager != nil){
-        KWQLayoutFragment *frag = [storage getFragmentForString: (NSString *)string];
+        id <KWQLayoutFragment> frag = [storage getFragmentForString: (NSString *)string];
 
         [layoutInfo setColor: color];
         [layoutInfo setFont: font];
@@ -124,7 +168,7 @@ static NSMutableDictionary *metricsCache = nil;
     KWQTextStorage *storage = [layoutInfo textStorage];
 
     if (manager != nil){
-        KWQLayoutFragment *frag = [storage getFragmentForString: (NSString *)string];
+        id <KWQLayoutFragment>frag = [storage getFragmentForString: (NSString *)string];
 
         [layoutInfo setColor: color];
         [layoutInfo setFont: font];
@@ -141,7 +185,7 @@ static NSMutableDictionary *metricsCache = nil;
     int i, count;
     NSArray *stringKeys;
     NSString *string;
-    KWQLayoutFragment *fragment;
+    id KWQLayoutFragment>fragment;
 
     if (fragCache == nil){
         fprintf (stdout, "Fragment cache empty\n");
@@ -230,7 +274,7 @@ static NSMutableDictionary *metricsCache = nil;
 
 - (NSRect)rectForString:(NSString *)string
  {
-    KWQLayoutFragment *cachedFragment, *fragment;
+    id <KWQLayoutFragment> cachedFragment, fragment;
 
     cachedFragment = [textStorage getFragmentForString: string];
     if (cachedFragment != nil){
diff --git a/WebCore/kwq/KWQMetrics.h b/WebCore/kwq/KWQMetrics.h
index 75c5ea4..3b499ce 100644
--- a/WebCore/kwq/KWQMetrics.h
+++ b/WebCore/kwq/KWQMetrics.h
@@ -49,25 +49,37 @@
 - (NSDictionary *)attributes;
 @end
 
- at interface KWQLayoutFragment : NSObject
+ at protocol KWQLayoutFragment
+- (void)setGlyphRange: (NSRange)r;
+- (NSRange)glyphRange;
+- (void)setBoundingRect: (NSRect)r;
+- (NSRect)boundingRect;
+
+#ifdef _DEBUG_LAYOUT_FRAGMENT
+- (int)accessCount;
+#endif
+
+ at end
+
+ at interface KWQSmallLayoutFragment : NSObject <KWQLayoutFragment>
 {
-    NSSize boundingRectSize;
+    unsigned short width;
+    unsigned short height;
     unsigned short glyphRangeLength;  // Is location always zero?  Only need length.
 #ifdef _DEBUG_LAYOUT_FRAGMENT
     int accessCount;
 #endif
 }
+ at end
 
-
-- (void)setGlyphRangeLength: (unsigned short)l;
-- (NSRange)glyphRange;
-- (void)setBoundingRectSize: (NSSize)s;
-- (NSRect)boundingRect;
-
+ at interface KWQLargeLayoutFragment : NSObject <KWQLayoutFragment>
+{
+    NSRect boundingRect;
+    NSRange glyphRange;
 #ifdef _DEBUG_LAYOUT_FRAGMENT
-- (int)accessCount;
+    int accessCount;
 #endif
-
+}
 @end
 
 #endif
diff --git a/WebCore/kwq/KWQTextStorage.h b/WebCore/kwq/KWQTextStorage.h
index bbb3ae4..3a57bc3 100644
--- a/WebCore/kwq/KWQTextStorage.h
+++ b/WebCore/kwq/KWQTextStorage.h
@@ -40,8 +40,8 @@
 - (id)initWithFontAttribute:(NSDictionary *)attrs;
 - (void)setAttributes: (NSDictionary *)at;
 
-- (KWQLayoutFragment *)getFragmentForString: (NSString *)string;
-- (KWQLayoutFragment *)addFragmentForString: (NSString *)string;
+- (id <KWQLayoutFragment>)getFragmentForString: (NSString *)string;
+- (id <KWQLayoutFragment>)addFragmentForString: (NSString *)string;
 
 - (void)setString: (NSString *)dString;
 
diff --git a/WebCore/kwq/KWQTextStorage.mm b/WebCore/kwq/KWQTextStorage.mm
index 05ae66d..154ec2c 100644
--- a/WebCore/kwq/KWQTextStorage.mm
+++ b/WebCore/kwq/KWQTextStorage.mm
@@ -45,47 +45,71 @@
 
 @implementation KWQTextStorage
 
-- (KWQLayoutFragment *)getFragmentForString: (NSString *)fragString
+- (id <KWQLayoutFragment>)getFragmentForString: (NSString *)fragString
 {
     return [fragmentCache objectForKey: fragString];
 }
 
-- (KWQLayoutFragment *)addFragmentForString: (NSString *)fragString
+#ifdef DEBUG_SPACE_OPTIMIZATION
+static int totalMeasurements = 0;
+static int leadingSpace = 0;
+static int trailingSpace = 0;
+#endif
+
+- (id <KWQLayoutFragment>)addFragmentForString: (NSString *)fragString
 {
-    KWQLayoutFragment *fragment;
+    id <KWQLayoutFragment> fragment;
+    bool useLargeFragment = NO;
     
     if (fragmentCache == nil)
         fragmentCache = [[NSMutableDictionary alloc] init];
 
     int fragStringLength = [fragString length];
 
-    fragment = [[KWQLayoutFragment alloc] init];
-
-    [fragmentCache setObject: fragment forKey: fragString];
+#ifdef DEBUG_SPACE_OPTIMIZATION
+    totalMeasurements++;
+    if (fragStringLength > 1){
+    
+        [fragString rangeOfString: @" " options: NSLiteralSearch range: NSMakeRange (0,1)].location = 0;
+        
+        or
+        
+        [fragString rangeOfString: @" " options: NSLiteralSearch range: NSMakeRange (fragStringLength,1)].location = fragStringLength
+       
+        if ([[fragString substringWithRange:NSMakeRange (fragStringLength-1,1)] isEqual: @" "])
+            trailingSpace++;
+        if ([[fragString substringWithRange:NSMakeRange (0,1)] isEqual: @" "])
+            leadingSpace++;
+        if (totalMeasurements % 500 == 0){
+            fprintf (stdout, "totalMeasurements = %d, trailingSpace = %d, leadingSpace = %d\n", totalMeasurements, trailingSpace, leadingSpace);
+        }
+    }
+#endif
     
     [self setString: fragString];
 
     NSRange range = NSMakeRange (0, fragStringLength);
     NSRange glyphRange = [_layoutManager glyphRangeForCharacterRange:range actualCharacterRange:nil];
-    
-    if (glyphRange.location != 0){
-        [NSException raise:@"OPTIMIZATION ASSUMPTION VIOLATED" format:@"glyphRange.location != 0"];
-    }
-
-    if (glyphRange.length > UINT16_MAX){
-        [NSException raise:@"OPTIMIZATION ASSUMPTION VIOLATED" format:@"glyphRange.length > UINT16_MAX"];
-    }
-    
-    [fragment setGlyphRangeLength: glyphRange.length];
-    
     NSRect boundingRect = [_layoutManager boundingRectForGlyphRange: glyphRange inTextContainer: [KWQTextContainer sharedInstance]];
     
     if (boundingRect.origin.x != 0 || boundingRect.origin.y != 0){
         [NSException raise:@"OPTIMIZATION ASSUMPTION VIOLATED" format:@"bounding rect origin not 0,0"];
     }
-    
-    [fragment setBoundingRectSize: boundingRect.size];
+    if (glyphRange.location != 0 ||
+            glyphRange.length > UINT16_MAX || 
+            boundingRect.size.width > (float)UINT16_MAX ||
+            boundingRect.size.height > (float)UINT16_MAX){
+        useLargeFragment = YES;
+    }
 
+    if (useLargeFragment)
+        fragment = [[KWQLargeLayoutFragment alloc] init];
+    else
+        fragment = [[KWQSmallLayoutFragment alloc] init];
+
+    [fragment setGlyphRange: glyphRange];
+    [fragment setBoundingRect: boundingRect];
+    [fragmentCache setObject: fragment forKey: fragString];
     [fragment release];
     
     return fragment;
diff --git a/WebCore/src/kwq/KWQFontMetrics.mm b/WebCore/src/kwq/KWQFontMetrics.mm
index 6ed1589..5c70d7e 100644
--- a/WebCore/src/kwq/KWQFontMetrics.mm
+++ b/WebCore/src/kwq/KWQFontMetrics.mm
@@ -38,7 +38,7 @@
 const float LargeNumberForText = 1.0e7;
 
 
- at implementation KWQLayoutFragment
+ at implementation KWQSmallLayoutFragment
 - (NSRange)glyphRange
 {
     NSRange glyphRange;
@@ -49,14 +49,15 @@ const float LargeNumberForText = 1.0e7;
     return glyphRange;
 }
 
-- (void)setGlyphRangeLength: (unsigned short)l
+- (void)setGlyphRange: (NSRange)r
 {
-    glyphRangeLength = l;
+    glyphRangeLength = r.length;
 }
 
-- (void)setBoundingRectSize: (NSSize)s
+- (void)setBoundingRect: (NSRect)r
 {
-    boundingRectSize = s;
+    width = (unsigned short)r.size.width;
+    height = (unsigned short)r.size.height;
 }
 
 - (NSRect)boundingRect
@@ -65,7 +66,8 @@ const float LargeNumberForText = 1.0e7;
     
     boundingRect.origin.x = 0;
     boundingRect.origin.y = 0;
-    boundingRect.size = boundingRectSize;
+    boundingRect.size.width = (float)width;
+    boundingRect.size.height = (float)height;
     
 #ifdef _DEBUG_LAYOUT_FRAGMENT
     accessCount++;
@@ -92,6 +94,48 @@ const float LargeNumberForText = 1.0e7;
 
 @end
 
+ at implementation KWQLargeLayoutFragment
+- (NSRange)glyphRange
+{
+    return glyphRange;
+}
+
+- (void)setGlyphRange: (NSRange)r
+{
+    glyphRange = r;
+}
+
+- (void)setBoundingRect: (NSRect)r
+{
+    boundingRect = r;
+}
+
+- (NSRect)boundingRect
+{
+#ifdef _DEBUG_LAYOUT_FRAGMENT
+    accessCount++;
+#endif
+
+    return boundingRect;
+}
+
+#ifdef _DEBUG_LAYOUT_FRAGMENT
+- (int)accessCount { return accessCount; }
+#endif
+
+#ifdef _DEBUG_LAYOUT_FRAGMENT
+- (NSComparisonResult)compare: (id)val
+{
+    if ([val accessCount] > accessCount)
+        return NSOrderedDescending;
+    else if ([val accessCount] < accessCount)
+        return NSOrderedAscending;
+    return NSOrderedSame;
+}
+
+#endif
+
+ at end
 
 static NSMutableDictionary *metricsCache = nil;
 
@@ -107,7 +151,7 @@ static NSMutableDictionary *metricsCache = nil;
     KWQTextStorage *storage = [layoutInfo textStorage];
 
     if (manager != nil){
-        KWQLayoutFragment *frag = [storage getFragmentForString: (NSString *)string];
+        id <KWQLayoutFragment> frag = [storage getFragmentForString: (NSString *)string];
 
         [layoutInfo setColor: color];
         [layoutInfo setFont: font];
@@ -124,7 +168,7 @@ static NSMutableDictionary *metricsCache = nil;
     KWQTextStorage *storage = [layoutInfo textStorage];
 
     if (manager != nil){
-        KWQLayoutFragment *frag = [storage getFragmentForString: (NSString *)string];
+        id <KWQLayoutFragment>frag = [storage getFragmentForString: (NSString *)string];
 
         [layoutInfo setColor: color];
         [layoutInfo setFont: font];
@@ -141,7 +185,7 @@ static NSMutableDictionary *metricsCache = nil;
     int i, count;
     NSArray *stringKeys;
     NSString *string;
-    KWQLayoutFragment *fragment;
+    id KWQLayoutFragment>fragment;
 
     if (fragCache == nil){
         fprintf (stdout, "Fragment cache empty\n");
@@ -230,7 +274,7 @@ static NSMutableDictionary *metricsCache = nil;
 
 - (NSRect)rectForString:(NSString *)string
  {
-    KWQLayoutFragment *cachedFragment, *fragment;
+    id <KWQLayoutFragment> cachedFragment, fragment;
 
     cachedFragment = [textStorage getFragmentForString: string];
     if (cachedFragment != nil){
diff --git a/WebCore/src/kwq/KWQMetrics.h b/WebCore/src/kwq/KWQMetrics.h
index 75c5ea4..3b499ce 100644
--- a/WebCore/src/kwq/KWQMetrics.h
+++ b/WebCore/src/kwq/KWQMetrics.h
@@ -49,25 +49,37 @@
 - (NSDictionary *)attributes;
 @end
 
- at interface KWQLayoutFragment : NSObject
+ at protocol KWQLayoutFragment
+- (void)setGlyphRange: (NSRange)r;
+- (NSRange)glyphRange;
+- (void)setBoundingRect: (NSRect)r;
+- (NSRect)boundingRect;
+
+#ifdef _DEBUG_LAYOUT_FRAGMENT
+- (int)accessCount;
+#endif
+
+ at end
+
+ at interface KWQSmallLayoutFragment : NSObject <KWQLayoutFragment>
 {
-    NSSize boundingRectSize;
+    unsigned short width;
+    unsigned short height;
     unsigned short glyphRangeLength;  // Is location always zero?  Only need length.
 #ifdef _DEBUG_LAYOUT_FRAGMENT
     int accessCount;
 #endif
 }
+ at end
 
-
-- (void)setGlyphRangeLength: (unsigned short)l;
-- (NSRange)glyphRange;
-- (void)setBoundingRectSize: (NSSize)s;
-- (NSRect)boundingRect;
-
+ at interface KWQLargeLayoutFragment : NSObject <KWQLayoutFragment>
+{
+    NSRect boundingRect;
+    NSRange glyphRange;
 #ifdef _DEBUG_LAYOUT_FRAGMENT
-- (int)accessCount;
+    int accessCount;
 #endif
-
+}
 @end
 
 #endif
diff --git a/WebCore/src/kwq/KWQTextStorage.h b/WebCore/src/kwq/KWQTextStorage.h
index bbb3ae4..3a57bc3 100644
--- a/WebCore/src/kwq/KWQTextStorage.h
+++ b/WebCore/src/kwq/KWQTextStorage.h
@@ -40,8 +40,8 @@
 - (id)initWithFontAttribute:(NSDictionary *)attrs;
 - (void)setAttributes: (NSDictionary *)at;
 
-- (KWQLayoutFragment *)getFragmentForString: (NSString *)string;
-- (KWQLayoutFragment *)addFragmentForString: (NSString *)string;
+- (id <KWQLayoutFragment>)getFragmentForString: (NSString *)string;
+- (id <KWQLayoutFragment>)addFragmentForString: (NSString *)string;
 
 - (void)setString: (NSString *)dString;
 
diff --git a/WebCore/src/kwq/KWQTextStorage.mm b/WebCore/src/kwq/KWQTextStorage.mm
index 05ae66d..154ec2c 100644
--- a/WebCore/src/kwq/KWQTextStorage.mm
+++ b/WebCore/src/kwq/KWQTextStorage.mm
@@ -45,47 +45,71 @@
 
 @implementation KWQTextStorage
 
-- (KWQLayoutFragment *)getFragmentForString: (NSString *)fragString
+- (id <KWQLayoutFragment>)getFragmentForString: (NSString *)fragString
 {
     return [fragmentCache objectForKey: fragString];
 }
 
-- (KWQLayoutFragment *)addFragmentForString: (NSString *)fragString
+#ifdef DEBUG_SPACE_OPTIMIZATION
+static int totalMeasurements = 0;
+static int leadingSpace = 0;
+static int trailingSpace = 0;
+#endif
+
+- (id <KWQLayoutFragment>)addFragmentForString: (NSString *)fragString
 {
-    KWQLayoutFragment *fragment;
+    id <KWQLayoutFragment> fragment;
+    bool useLargeFragment = NO;
     
     if (fragmentCache == nil)
         fragmentCache = [[NSMutableDictionary alloc] init];
 
     int fragStringLength = [fragString length];
 
-    fragment = [[KWQLayoutFragment alloc] init];
-
-    [fragmentCache setObject: fragment forKey: fragString];
+#ifdef DEBUG_SPACE_OPTIMIZATION
+    totalMeasurements++;
+    if (fragStringLength > 1){
+    
+        [fragString rangeOfString: @" " options: NSLiteralSearch range: NSMakeRange (0,1)].location = 0;
+        
+        or
+        
+        [fragString rangeOfString: @" " options: NSLiteralSearch range: NSMakeRange (fragStringLength,1)].location = fragStringLength
+       
+        if ([[fragString substringWithRange:NSMakeRange (fragStringLength-1,1)] isEqual: @" "])
+            trailingSpace++;
+        if ([[fragString substringWithRange:NSMakeRange (0,1)] isEqual: @" "])
+            leadingSpace++;
+        if (totalMeasurements % 500 == 0){
+            fprintf (stdout, "totalMeasurements = %d, trailingSpace = %d, leadingSpace = %d\n", totalMeasurements, trailingSpace, leadingSpace);
+        }
+    }
+#endif
     
     [self setString: fragString];
 
     NSRange range = NSMakeRange (0, fragStringLength);
     NSRange glyphRange = [_layoutManager glyphRangeForCharacterRange:range actualCharacterRange:nil];
-    
-    if (glyphRange.location != 0){
-        [NSException raise:@"OPTIMIZATION ASSUMPTION VIOLATED" format:@"glyphRange.location != 0"];
-    }
-
-    if (glyphRange.length > UINT16_MAX){
-        [NSException raise:@"OPTIMIZATION ASSUMPTION VIOLATED" format:@"glyphRange.length > UINT16_MAX"];
-    }
-    
-    [fragment setGlyphRangeLength: glyphRange.length];
-    
     NSRect boundingRect = [_layoutManager boundingRectForGlyphRange: glyphRange inTextContainer: [KWQTextContainer sharedInstance]];
     
     if (boundingRect.origin.x != 0 || boundingRect.origin.y != 0){
         [NSException raise:@"OPTIMIZATION ASSUMPTION VIOLATED" format:@"bounding rect origin not 0,0"];
     }
-    
-    [fragment setBoundingRectSize: boundingRect.size];
+    if (glyphRange.location != 0 ||
+            glyphRange.length > UINT16_MAX || 
+            boundingRect.size.width > (float)UINT16_MAX ||
+            boundingRect.size.height > (float)UINT16_MAX){
+        useLargeFragment = YES;
+    }
 
+    if (useLargeFragment)
+        fragment = [[KWQLargeLayoutFragment alloc] init];
+    else
+        fragment = [[KWQSmallLayoutFragment alloc] init];
+
+    [fragment setGlyphRange: glyphRange];
+    [fragment setBoundingRect: boundingRect];
+    [fragmentCache setObject: fragment forKey: fragString];
     [fragment release];
     
     return fragment;

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list