Work-arounds to make new ImageIO code work correctly. Still
authorrjw <rjw@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 11 Nov 2004 21:35:26 +0000 (21:35 +0000)
committerrjw <rjw@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 11 Nov 2004 21:35:26 +0000 (21:35 +0000)
        disabled for now.  Requires at least Tiger 300.  Testing does
        show a 3% improvement in PLT tests!  That's huge!

        Reviewed by NOBODY (OOPS!).

        * WebCoreSupport.subproj/WebImageData.m:
        (-[WebImageData imageAtIndex:]):
        (-[WebImageData incrementalLoadWithBytes:length:complete:]):
        (-[WebImageData isNull]):

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

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

index d3298071cd688b6597d7789081a1035a95c5c401..1877a35c60b1a120103289f191a5463d354d6179 100644 (file)
@@ -1,3 +1,16 @@
+2004-11-11  Richard Williamson   <rjw@apple.com>
+
+        Work-arounds to make new ImageIO code work correctly.  Still
+        disabled for now.  Requires at least Tiger 300.  Testing does
+        show a 3% improvement in PLT tests!  That's huge!
+
+        Reviewed by NOBODY (OOPS!).
+
+        * WebCoreSupport.subproj/WebImageData.m:
+        (-[WebImageData imageAtIndex:]):
+        (-[WebImageData incrementalLoadWithBytes:length:complete:]):
+        (-[WebImageData isNull]):
+
 2004-11-10  Chris Blumenberg  <cblu@apple.com>
 
        Fixed: <rdar://problem/3396872> ICONS: icon DB inconsistencies can cause slowness during startup, idle and quit
index 74c1cc631d819d422192a647b7ad09d68ecbade1..cbd26b587096249545e23fa970ba0ace69453636 100644 (file)
@@ -27,6 +27,7 @@ static CFDictionaryRef imageSourceOptions;
 - (void)_nextFrame;
 @end
 
+
 @implementation WebImageData
 
 - (void)_commonTermination
@@ -98,13 +99,21 @@ static CFDictionaryRef imageSourceOptions;
         if (index > [self numberOfImages])
             return 0;
 
+#ifndef NDEBUG
         CGImageSourceStatus containerStatus = CGImageSourceGetStatus(imageSource);
-        if (containerStatus < kCGImageStatusIncomplete)
-            return 0;
+#endif
+       // Ignore status, just try to create the image!  Status reported from ImageIO 
+       // is bogus until the image is created.  See 3827851
+        //if (containerStatus < kCGImageStatusIncomplete)
+        //    return 0;
 
+#ifndef NDEBUG
         CGImageSourceStatus imageStatus = CGImageSourceGetStatusAtIndex(imageSource, index);
-        if (imageStatus < kCGImageStatusIncomplete)
-            return 0;
+#endif
+       // Ignore status.  Status is invalid until we create the image (and eventually try to display it).
+       // See 3827851
+        //if (imageStatus < kCGImageStatusIncomplete)
+        //    return 0;
 
         if (!images) {
             images = (CGImageRef *)calloc ([self numberOfImages], sizeof(CGImageRef *));
@@ -137,13 +146,11 @@ static CFDictionaryRef imageSourceOptions;
     CGImageSourceUpdateData (imageSource, data, isComplete);
     CFRelease (data);
     
-    CGImageSourceStatus status = CGImageSourceGetStatus(imageSource);
-    
-    if (status < kCGImageStatusIncomplete) {
-        ERROR ("error update incremental image data, status %d", status);
-    }
-    
-    return status >= kCGImageStatusIncomplete;
+    // Always returns YES because we can't rely on status.  See 3827851
+    //CGImageSourceStatus status = CGImageSourceGetStatus(imageSource);
+    //
+    //return status >= kCGImageStatusReadingHeader;
+    return YES;
 }
 
 - (void)drawImageAtIndex:(size_t)index inRect:(CGRect)ir fromRect:(CGRect)fr compositeOperation:(CGCompositeOperation)op context:(CGContextRef)aContext;
@@ -158,71 +165,25 @@ static CFDictionaryRef imageSourceOptions;
     float w = CGImageGetWidth(image);
     float h = CGImageGetHeight(image);
 
-    // FIXME:  Need to determine number of available lines.
-    int numCompleteLines = h;
-
-    int pixelsHigh = h;
-    if (pixelsHigh > numCompleteLines) {
-        // Figure out how much of the image is OK to draw.  We can't simply
-        // use numCompleteLines because the image may be scaled.
-        float clippedImageHeight = floor([self size].height * numCompleteLines / pixelsHigh);
-        
-        // Figure out how much of the source is OK to draw from.
-        float clippedSourceHeight = clippedImageHeight - fr.origin.y;
-        if (clippedSourceHeight < 1) {
-            return;
-        }
-        
-        // Figure out how much of the destination we are going to draw to.
-        float clippedDestinationHeight = ir.size.height * clippedSourceHeight / fr.size.height;
-
-        // Reduce heights of both rectangles without changing their positions.
-        // In the flipped case, just adjusting the height is sufficient.
-        ir.size.height = clippedDestinationHeight;
-        fr.size.height = clippedSourceHeight;
-    }
-
+    // Flip the coords.
     CGContextSetCompositeOperation (aContext, op);
     CGContextTranslateCTM (aContext, ir.origin.x, ir.origin.y);
     CGContextScaleCTM (aContext, 1, -1);
-    CGContextTranslateCTM (aContext, 0, -h);
+    CGContextTranslateCTM (aContext, 0, -fr.size.height);
     
     // Translated to origin, now draw at 0,0.
     ir.origin.x = ir.origin.y = 0;
-        
+    
+    // If we're drawing a sub portion of the image then create
+    // a image for the sub portion and draw that.
     if (fr.size.width != w || fr.size.height != h) {
-        //image = CGImageCreateWithImageInRect (image, fr);
-        //if (image) {
-        //    CGContextDrawImage (aContext, ir, image);
-        //    CFRelease (image);
-        //}
-        
-        // FIXME:  Until the API above is implemented (CGImageCreateWithImageInRect), we
-        // must create our own subimage.
-        //
-        // Create a new bitmap of the appropriate size and then draw that into our context.
-        // Slo, boo!
-        CGContextRef clippedSourceContext;
-        CGImageRef clippedSourceImage;
-        size_t csw = (size_t)fr.size.width;
-        size_t csh = (size_t)fr.size.height;
-                            
-        CGColorSpaceRef colorSpace = WebCGColorSpaceCreateRGB();
-        size_t numComponents = CGColorSpaceGetNumberOfComponents(colorSpace);
-        size_t bytesPerRow = ((csw * 8 * (numComponents+1) + 7)/8); // + 1 for alpha
-        void *_drawingContextData = malloc(csh * bytesPerRow);
-        
-        // 8 bit per component
-        clippedSourceContext = CGBitmapContextCreate(_drawingContextData, csw, csh, 8, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast);
-        CGContextTranslateCTM (clippedSourceContext, -fr.origin.x, -fr.origin.y);
-        CGContextDrawImage (clippedSourceContext, CGRectMake(0,0,w,h), image);
-        clippedSourceImage = CGBitmapContextCreateImage(clippedSourceContext);
-        CGContextDrawImage (aContext, ir, clippedSourceImage);
-        
-        CGImageRelease (clippedSourceImage);
-        CGContextRelease (clippedSourceContext);
-        free (_drawingContextData);
+        image = CGImageCreateWithImageInRect (image, fr);
+        if (image) {
+            CGContextDrawImage (aContext, ir, image);
+            CFRelease (image);
+        }
     }
+    // otherwise draw the whole image.
     else { 
         CGContextDrawImage (aContext, ir, image);
     }
@@ -312,8 +273,9 @@ CGPatternCallbacks patternCallbacks = { 0, drawPattern, NULL };
 
 - (BOOL)isNull
 {
-    CGImageSourceStatus status = CGImageSourceGetStatusAtIndex(imageSource, [self currentFrame]);
-    return status < kCGImageStatusIncomplete;
+    if (imageSource)
+       return CGImageSourceGetStatus(imageSource) < kCGImageStatusReadingHeader;
+    return YES;
 }
 
 - (CGSize)size