Reviewed by Hyatt.
authordarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 19 Apr 2005 01:17:53 +0000 (01:17 +0000)
committerdarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 19 Apr 2005 01:17:53 +0000 (01:17 +0000)
        - fixed <rdar://problem/4092614> REGRESSION (Tiger): progressively loaded background images "scroll around" instead of just appearing

        * WebCoreSupport.subproj/WebImageData.m:
        (-[WebImageData _imageSourceOptions]): Moved a global inside this function, since it's only used here.
        (-[WebImageData _cacheImages:allImages:]): Fixed a sizeof that was getting the size of the wrong thing.
        (-[WebImageData _isSizeAvailable]): Used calloc in a more consistent way.
        (drawPattern): Removed an unneeded cast.
        (-[WebImageData tileInRect:fromPoint:context:]): Here's the actual bug fix. Don't use the image size
        when deciding whether the image needs to be tiled as a pattern nor when creating the pattern: in both
        cases, use the tile size. The old way was wrong, and the new way works perfectly. Also removed uneeded
        error message when the image is not yet loaded enough to create a CGImageRef for it -- it's fine to
        draw nothing in that case.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@9032 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebKit/ChangeLog
WebKit/WebCoreSupport.subproj/WebImageData.m

index 91d3138fa4ead85869ed7bf84fd6e965cafdca0a..b3730632fdc6e6e68af550397b80873223c1ffb3 100644 (file)
@@ -1,3 +1,20 @@
+2005-04-18  Darin Adler  <darin@apple.com>
+
+        Reviewed by Hyatt.
+
+        - fixed <rdar://problem/4092614> REGRESSION (Tiger): progressively loaded background images "scroll around" instead of just appearing
+
+        * WebCoreSupport.subproj/WebImageData.m:
+        (-[WebImageData _imageSourceOptions]): Moved a global inside this function, since it's only used here.
+        (-[WebImageData _cacheImages:allImages:]): Fixed a sizeof that was getting the size of the wrong thing.
+        (-[WebImageData _isSizeAvailable]): Used calloc in a more consistent way.
+        (drawPattern): Removed an unneeded cast.
+        (-[WebImageData tileInRect:fromPoint:context:]): Here's the actual bug fix. Don't use the image size
+        when deciding whether the image needs to be tiled as a pattern nor when creating the pattern: in both
+        cases, use the tile size. The old way was wrong, and the new way works perfectly. Also removed uneeded
+        error message when the image is not yet loaded enough to create a CGImageRef for it -- it's fine to
+        draw nothing in that case.
+
 2005-04-14  John Sullivan  <sullivan@apple.com>
 
         Reviewed by Chris.
index 0694efdfe5cb47602c2c119e4233bc2a83c0af34..ae62d0dab66574d701b9a318bb83b90bb3b7ddbf 100644 (file)
@@ -20,8 +20,6 @@
 
 #import <ImageIO/CGImageSourcePrivate.h>
 
-static CFDictionaryRef imageSourceOptions;
-
 // Forward declarations of internal methods.
 @interface WebImageData (WebInternal)
 - (void)_commonTermination;
@@ -165,6 +163,7 @@ static CFDictionaryRef imageSourceOptions;
 
 - (CFDictionaryRef)_imageSourceOptions
 {
+    static CFDictionaryRef imageSourceOptions;
     if (!imageSourceOptions) {
         const void * keys[2] = { kCGImageSourceShouldCache, kCGImageSourceShouldPreferRGB32 };
         const void * values[2] = { kCFBooleanTrue, kCFBooleanTrue };
@@ -310,7 +309,7 @@ static CFDictionaryRef imageSourceOptions;
     }
     for (i = from; i < to; i++) {
         if (!images) {
-            images = (CGImageRef *)calloc (imagesSize, sizeof(CGImageRef *));
+            images = (CGImageRef *)calloc (imagesSize, sizeof(CGImageRef));
         }
 
         images[i] = CGImageSourceCreateImageAtIndex (imageSource, i, [self _imageSourceOptions]);
@@ -393,7 +392,7 @@ static CFDictionaryRef imageSourceOptions;
             }
             else {
                 imagePropertiesSize = [self numberOfImages];
-                imageProperties = (CFDictionaryRef *)calloc (imagePropertiesSize * sizeof(CFDictionaryRef), 1);
+                imageProperties = (CFDictionaryRef *)calloc (imagePropertiesSize, sizeof(CFDictionaryRef));
             }
                 
             imageProperties[0] = image0Properties;
@@ -551,13 +550,13 @@ static void drawPattern (void * info, CGContextRef context)
 {
     WebImageData *data = (WebImageData *)info;
     
-    CGImageRef image = (CGImageRef)[data imageAtIndex:[data currentFrame]];
+    CGImageRef image = [data imageAtIndex:[data currentFrame]];
     float w = CGImageGetWidth(image);
     float h = CGImageGetHeight(image);
     CGContextDrawImage (context, CGRectMake(0, [data size].height-h, w, h), image);    
 }
 
-CGPatternCallbacks patternCallbacks = { 0, drawPattern, NULL };
+static const CGPatternCallbacks patternCallbacks = { 0, drawPattern, NULL };
 
 - (void)tileInRect:(CGRect)rect fromPoint:(CGPoint)point context:(CGContextRef)aContext
 {
@@ -568,7 +567,6 @@ CGPatternCallbacks patternCallbacks = { 0, drawPattern, NULL };
     size_t frame = [self currentFrame];
     CGImageRef image = [self imageAtIndex:frame];
     if (!image) {
-        ERROR ("unable to find image");
         [decodeLock unlock];
         return;
     }
@@ -578,13 +576,13 @@ CGPatternCallbacks patternCallbacks = { 0, drawPattern, NULL };
         
     } else {
         CGSize tileSize = [self size];
-        NSSize imageSize = NSMakeSize(CGImageGetWidth(image),CGImageGetHeight(image));
         
         // Check and see if a single draw of the image can cover the entire area we are supposed to tile.
         NSRect oneTileRect;
         oneTileRect.origin.x = rect.origin.x + fmodf(fmodf(-point.x, tileSize.width) - tileSize.width, tileSize.width);
         oneTileRect.origin.y = rect.origin.y + fmodf(fmodf(-point.y, tileSize.height) - tileSize.height, tileSize.height);
-        oneTileRect.size = imageSize;
+        oneTileRect.size.height = tileSize.height;
+        oneTileRect.size.width = tileSize.width;
 
         // If the single image draw covers the whole area, then just draw once.
         if (NSContainsRect(oneTileRect, NSMakeRect(rect.origin.x, rect.origin.y, rect.size.width, rect.size.height))) {
@@ -612,7 +610,7 @@ CGPatternCallbacks patternCallbacks = { 0, drawPattern, NULL };
         CGSize phase = CGSizeMake(fmodf(originInWindow.x, tileSize.width), fmodf(originInWindow.y, tileSize.height));
 
         // Possible optimization:  We may want to cache the CGPatternRef    
-        CGPatternRef pattern = CGPatternCreate(self, CGRectMake (0, 0, imageSize.width, imageSize.height), CGAffineTransformIdentity, tileSize.width, tileSize.height, 
+        CGPatternRef pattern = CGPatternCreate(self, CGRectMake (0, 0, tileSize.width, tileSize.height), CGAffineTransformIdentity, tileSize.width, tileSize.height, 
             kCGPatternTilingConstantSpacing, true, &patternCallbacks);
         if (pattern) {
             CGContextSaveGState (aContext);