[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 07:46:36 UTC 2009


The following commit has been merged in the debian/unstable branch:
commit a9cde2baa94262d20470c51d429aecbe4c421a08
Author: rjw <rjw at 268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Wed Jul 9 23:21:52 2003 +0000

    WebKit:
    	Fixed 3141257.  Animate multiple copies of the same
    	image on the same page.
    
            Reviewed by hyatt.
    
            * WebCoreSupport.subproj/WebImageRenderer.h:
            * WebCoreSupport.subproj/WebImageRenderer.m:
            (+[WebImageRenderer stopAnimationsInView:]):
            (-[WebImageRenderer retainOrCopyIfNeeded]):
            (-[WebImageRenderer copyWithZone:]):
            (-[WebImageRenderer incrementalLoadWithBytes:length:complete:]):
            (-[WebImageRenderer dealloc]):
            (-[WebImageRenderer repetitionCount]):
            (-[WebImageRenderer scheduleFrame]):
            (-[WebImageRenderer beginAnimationInRect:fromRect:]):
            * WebCoreSupport.subproj/WebImageRendererFactory.h:
            * WebCoreSupport.subproj/WebImageRendererFactory.m:
            (-[WebImageRendererFactory imageRendererWithMIMEType:]):
            (-[WebImageRendererFactory imageRendererWithData:MIMEType:]):
            (-[WebImageRendererFactory imageRendererWithBytes:length:MIMEType:]):
    
    WebCore:
    	Fixed 3141257.  Animate multiple copies of the same
    	image on the same page.
    
            Reviewed by hyatt.
    
            * khtml/rendering/render_replaced.cpp:
            (RenderReplaced::paint):
            * kwq/KWQPixmap.mm:
            (QPixmap::operator=):
            * kwq/WebCoreImageRenderer.h:
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@4608 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog-2003-10-25 b/WebCore/ChangeLog-2003-10-25
index 01564d5..be68d54 100644
--- a/WebCore/ChangeLog-2003-10-25
+++ b/WebCore/ChangeLog-2003-10-25
@@ -1,3 +1,16 @@
+2003-07-09  Richard Williamson   <rjw at apple.com>
+
+	Fixed 3141257.  Animate multiple copies of the same
+	image on the same page.
+
+        Reviewed by hyatt.
+
+        * khtml/rendering/render_replaced.cpp:
+        (RenderReplaced::paint):
+        * kwq/KWQPixmap.mm:
+        (QPixmap::operator=):
+        * kwq/WebCoreImageRenderer.h:
+
 2003-07-08  Darin Adler  <darin at apple.com>
 
         Reviewed by John.
diff --git a/WebCore/ChangeLog-2005-08-23 b/WebCore/ChangeLog-2005-08-23
index 01564d5..be68d54 100644
--- a/WebCore/ChangeLog-2005-08-23
+++ b/WebCore/ChangeLog-2005-08-23
@@ -1,3 +1,16 @@
+2003-07-09  Richard Williamson   <rjw at apple.com>
+
+	Fixed 3141257.  Animate multiple copies of the same
+	image on the same page.
+
+        Reviewed by hyatt.
+
+        * khtml/rendering/render_replaced.cpp:
+        (RenderReplaced::paint):
+        * kwq/KWQPixmap.mm:
+        (QPixmap::operator=):
+        * kwq/WebCoreImageRenderer.h:
+
 2003-07-08  Darin Adler  <darin at apple.com>
 
         Reviewed by John.
diff --git a/WebCore/khtml/rendering/render_replaced.cpp b/WebCore/khtml/rendering/render_replaced.cpp
index 7197864..f9b7d7a 100644
--- a/WebCore/khtml/rendering/render_replaced.cpp
+++ b/WebCore/khtml/rendering/render_replaced.cpp
@@ -65,9 +65,8 @@ void RenderReplaced::paint(QPainter *p, int _x, int _y, int _w, int _h,
     _tx += m_x;
     _ty += m_y;
 
-    // These checks should probably be >= and <=, because we
-    // can early exit if the element touches the edges.
-    if((_ty > _y + _h) || (_ty + m_height < _y))
+    // Early exit if the element touches the edges.
+    if((_tx >= _x + _w) || (_tx + m_width <= _x))
         return;
 
     if((_tx >= _x + _w) || (_tx + m_width <= _x))
diff --git a/WebCore/kwq/KWQPixmap.mm b/WebCore/kwq/KWQPixmap.mm
index 78adbac..d8deb30 100644
--- a/WebCore/kwq/KWQPixmap.mm
+++ b/WebCore/kwq/KWQPixmap.mm
@@ -184,9 +184,9 @@ QPixmap QPixmap::xForm(const QWMatrix &xmatrix) const
 
 QPixmap &QPixmap::operator=(const QPixmap &assignFrom)
 {
-    [assignFrom.imageRenderer retain];
-    [imageRenderer release];
-    imageRenderer = assignFrom.imageRenderer;
+    id <WebCoreImageRenderer> oldImageRenderer = imageRenderer;
+    imageRenderer = [assignFrom.imageRenderer retainOrCopyIfNeeded];
+    [oldImageRenderer release];
     NSString *newMIMEType = [assignFrom.MIMEType copy];
     [MIMEType release];
     MIMEType = newMIMEType;
diff --git a/WebCore/kwq/WebCoreImageRenderer.h b/WebCore/kwq/WebCoreImageRenderer.h
index 34d15aa..feba214 100644
--- a/WebCore/kwq/WebCoreImageRenderer.h
+++ b/WebCore/kwq/WebCoreImageRenderer.h
@@ -35,5 +35,5 @@
 - (void)stopAnimation;
 - (void)tileInRect:(NSRect)r fromPoint:(NSPoint)p;
 - (BOOL)isNull;
-
+- (id <WebCoreImageRenderer>)retainOrCopyIfNeeded;
 @end
diff --git a/WebKit/ChangeLog b/WebKit/ChangeLog
index ac9d93a..84edce9 100644
--- a/WebKit/ChangeLog
+++ b/WebKit/ChangeLog
@@ -1,3 +1,26 @@
+2003-07-09  Richard Williamson   <rjw at apple.com>
+
+	Fixed 3141257.  Animate multiple copies of the same
+	image on the same page.
+
+        Reviewed by hyatt.
+
+        * WebCoreSupport.subproj/WebImageRenderer.h:
+        * WebCoreSupport.subproj/WebImageRenderer.m:
+        (+[WebImageRenderer stopAnimationsInView:]):
+        (-[WebImageRenderer retainOrCopyIfNeeded]):
+        (-[WebImageRenderer copyWithZone:]):
+        (-[WebImageRenderer incrementalLoadWithBytes:length:complete:]):
+        (-[WebImageRenderer dealloc]):
+        (-[WebImageRenderer repetitionCount]):
+        (-[WebImageRenderer scheduleFrame]):
+        (-[WebImageRenderer beginAnimationInRect:fromRect:]):
+        * WebCoreSupport.subproj/WebImageRendererFactory.h:
+        * WebCoreSupport.subproj/WebImageRendererFactory.m:
+        (-[WebImageRendererFactory imageRendererWithMIMEType:]):
+        (-[WebImageRendererFactory imageRendererWithData:MIMEType:]):
+        (-[WebImageRendererFactory imageRendererWithBytes:length:MIMEType:]):
+
 2003-07-09  Chris Blumenberg  <cblu at apple.com>
 
 	Fixed: <rdar://problem/3229364>: user stylesheet path should be stored relative to home directory
diff --git a/WebKit/WebCoreSupport.subproj/WebImageRenderer.h b/WebKit/WebCoreSupport.subproj/WebImageRenderer.h
index ac7e939..1372f43 100644
--- a/WebKit/WebCoreSupport.subproj/WebImageRenderer.h
+++ b/WebKit/WebCoreSupport.subproj/WebImageRenderer.h
@@ -21,17 +21,16 @@
     int repetitionsComplete;
     BOOL animationFinished;
 
-    BOOL sawGIFExtensionSignature;
-    char GIFExtensionBuffer[10];
-    int GIFExtensionBufferLength;
-    
     NSString *MIMEType;
     BOOL isNull;
+ at public    
+    NSData *originalData;
 }
 
 - (id)initWithMIMEType:(NSString *)MIME;
 - (id)initWithData:(NSData *)data MIMEType:(NSString *)MIME;
 + (void)stopAnimationsInView:(NSView *)aView;
+- (int)frameCount;
 
 - (NSString *)MIMEType;
 
diff --git a/WebKit/WebCoreSupport.subproj/WebImageRenderer.m b/WebKit/WebCoreSupport.subproj/WebImageRenderer.m
index 23df268..11f4029 100644
--- a/WebKit/WebCoreSupport.subproj/WebImageRenderer.m
+++ b/WebKit/WebCoreSupport.subproj/WebImageRenderer.m
@@ -3,7 +3,9 @@
 	Copyright (c) 2002, 2003, Apple, Inc. All rights reserved.
 */
 
+#import <WebKit/WebAssertions.h>
 #import <WebKit/WebImageRenderer.h>
+#import <WebKit/WebImageRendererFactory.h>
 
 #import <WebCore/WebCoreImageRenderer.h>
 #import <WebKit/WebAssertions.h>
@@ -14,19 +16,27 @@ extern NSString *NSImageLoopCount;
 
 @implementation WebImageRenderer
 
-static NSMutableArray *activeImageRenderers;
+static NSMutableSet *activeImageRenderers;
 
 + (void)stopAnimationsInView:(NSView *)aView
 {
-    int i, count;    
+    NSEnumerator *objectEnumerator = [activeImageRenderers objectEnumerator];
+    WebImageRenderer *renderer;
+    NSMutableSet *renderersToStop = [[NSMutableSet alloc] init];
 
-    count = [activeImageRenderers count];
-    for (i = count-1; i >= 0; i--) {
-        WebImageRenderer *renderer = [activeImageRenderers objectAtIndex:i];
+    while ((renderer = [objectEnumerator nextObject])) {
+        if (renderer->frameView == aView) {
+            [renderersToStop addObject: renderer];
+        }
+    }
+
+    objectEnumerator = [renderersToStop objectEnumerator];
+    while ((renderer = [objectEnumerator nextObject])) {
         if (renderer->frameView == aView) {
             [renderer stopAnimation];
         }
     }
+    [renderersToStop release];
 }
 
 - (id)initWithMIMEType:(NSString *)MIME
@@ -66,15 +76,31 @@ static NSMutableArray *activeImageRenderers;
     return self;
 }
 
+- (id <WebCoreImageRenderer>)retainOrCopyIfNeeded
+{
+    WebImageRenderer *copy;
+
+    if (originalData){
+        copy = [[[WebImageRendererFactory sharedFactory] imageRendererWithData:originalData MIMEType:MIMEType] retain];
+    }
+    else {
+        copy = [self retain];
+    }
+
+    return copy;
+}
+
 - copyWithZone:(NSZone *)zone
 {
-    WebImageRenderer *copy = [super copyWithZone:zone];
-    
     // FIXME: If we copy while doing an incremental load, it won't work.
+    WebImageRenderer *copy;
+
+    copy = [super copyWithZone:zone];
+    copy->MIMEType = [MIMEType copy];
+    copy->originalData = [originalData retain];
     copy->frameTimer = nil;
     copy->frameView = nil;
     copy->patternColor = nil;
-    copy->MIMEType = [MIMEType copy];
         
     return copy;
 }
@@ -101,7 +127,14 @@ static NSMutableArray *activeImageRenderers;
     NSData *data = [[NSData alloc] initWithBytes:bytes length:length];
 
     loadStatus = [imageRep incrementalLoadFromData:data complete:isComplete];
-    [data release];
+
+    // Hold onto the original data in case we need to copy this image.  (Workaround for appkit NSImage
+    // copy flaw).
+    if (isComplete && [self frameCount] > 1)
+        originalData = data;
+    else
+        [data release];
+
     switch (loadStatus) {
     case NSImageRepLoadStatusUnknownType:       // not enough data to determine image format. please feed me more data
         //printf ("NSImageRepLoadStatusUnknownType size %d, isComplete %d\n", length, isComplete);
@@ -140,6 +173,7 @@ static NSMutableArray *activeImageRenderers;
     ASSERT(frameView == nil);
     [patternColor release];
     [MIMEType release];
+    [originalData release];
     [super dealloc];
 }
 
@@ -199,16 +233,13 @@ static NSMutableArray *activeImageRenderers;
 {
     id property = [self firstRepProperty:NSImageLoopCount];
     int count = property ? [property intValue] : 0;
-    // This is a workaround for bug 3090341.
-    // If we see no extension, then the loop count is 1, not 0.
-    if (count == 0 && !sawGIFExtensionSignature) {
-        count = 1;
-    }
     return count;
 }
 
 - (void)scheduleFrame
-{   
+{
+    if (frameTimer && [frameTimer isValid])
+        return;
     frameTimer = [[NSTimer scheduledTimerWithTimeInterval:[self frameDuration]
                                                     target:self
                                                   selector:@selector(nextFrame:)
@@ -294,20 +325,21 @@ static NSMutableArray *activeImageRenderers;
 
 - (void)beginAnimationInRect:(NSRect)ir fromRect:(NSRect)fr
 {
-    // The previous, if any, frameView, is released in stopAnimation.
-    [self stopAnimation];
-
     [self drawClippedToValidInRect:ir fromRect:fr];
-    
+
     if ([self frameCount] > 1 && !animationFinished) {
         imageRect = fr;
         targetRect = ir;
-        frameView = [[NSView focusView] retain];
+        NSView *newView = [NSView focusView];
+        if (newView != frameView){
+            [frameView release];
+            frameView = [newView retain];
+        }
         [self scheduleFrame];
-	if (!activeImageRenderers) {
-	    activeImageRenderers = [[NSMutableArray alloc] init];
-	}
-	[activeImageRenderers addObject:self];
+        if (!activeImageRenderers) {
+            activeImageRenderers = [[NSMutableSet alloc] init];
+        }
+        [activeImageRenderers addObject:self];
     }
 }
 
diff --git a/WebKit/WebCoreSupport.subproj/WebImageRendererFactory.h b/WebKit/WebCoreSupport.subproj/WebImageRendererFactory.h
index 0db938c..5ffd2b0 100644
--- a/WebKit/WebCoreSupport.subproj/WebImageRendererFactory.h
+++ b/WebKit/WebCoreSupport.subproj/WebImageRendererFactory.h
@@ -15,5 +15,6 @@
 
 + (void)createSharedFactory;
 + (WebImageRendererFactory *)sharedFactory;
+- (id <WebCoreImageRenderer>)imageRendererWithData:(NSData*)data MIMEType:(NSString *)MIMEType;
 
 @end
diff --git a/WebKit/WebCoreSupport.subproj/WebImageRendererFactory.m b/WebKit/WebCoreSupport.subproj/WebImageRendererFactory.m
index 720f455..f9b1aef 100644
--- a/WebKit/WebCoreSupport.subproj/WebImageRendererFactory.m
+++ b/WebKit/WebCoreSupport.subproj/WebImageRendererFactory.m
@@ -50,7 +50,7 @@
 
     NSBitmapImageRep *rep = [[NSBitmapImageRep alloc] initForIncrementalLoad];
     [imageRenderer addRepresentation:rep];
-    [rep release];
+    [rep autorelease];
     [imageRenderer setFlipped:YES];
     
     // Turn the default caching mode back on when the image has completed load.
@@ -69,30 +69,39 @@
     return [self imageRendererWithMIMEType:nil];
 }
 
-- (id <WebCoreImageRenderer>)imageRendererWithBytes:(const void *)bytes length:(unsigned)length MIMEType:(NSString *)MIMEType
+- (id <WebCoreImageRenderer>)imageRendererWithData:(NSData*)data MIMEType:(NSString *)MIMEType
 {
-    // FIXME: Why must we copy the data here?
-    //NSData *data = [[NSData alloc] initWithBytesNoCopy:(void *)bytes length:length freeWhenDone:NO];
-    NSData *data = [[NSData alloc] initWithBytes:(void *)bytes length:length];
     WebImageRenderer *imageRenderer = [[WebImageRenderer alloc] initWithData:data MIMEType:MIMEType];
-    [data release];
-    
+
     NSArray *reps = [imageRenderer representations];
     if ([reps count] == 0){
         [imageRenderer release];
+        NSLog (@"Unable to allocate image renderer");
         return nil;
     }
-
+    
     // Force the image to use the pixel size and ignore the dpi.
     [imageRenderer setScalesWhenResized:NO];
-    NSImageRep *rep = [reps objectAtIndex:0];
-    [rep setSize:NSMakeSize([rep pixelsWide], [rep pixelsHigh])];
+    if ([reps count] > 0){
+        NSImageRep *rep = [reps objectAtIndex:0];
+        [rep setSize:NSMakeSize([rep pixelsWide], [rep pixelsHigh])];
+        if ([imageRenderer frameCount] > 1)
+            imageRenderer->originalData = [data retain];
+    }
     
     [imageRenderer setFlipped:YES];
-    
+
     return [imageRenderer autorelease];
 }
 
+- (id <WebCoreImageRenderer>)imageRendererWithBytes:(const void *)bytes length:(unsigned)length MIMEType:(NSString *)MIMEType
+{
+    NSData *data = [[NSData alloc] initWithBytes:(void *)bytes length:length];
+    WebImageRenderer *imageRenderer = [self imageRendererWithData:data MIMEType:MIMEType];
+    [data autorelease];
+    return imageRenderer;
+}
+
 - (id <WebCoreImageRenderer>)imageRendererWithBytes:(const void *)bytes length:(unsigned)length
 {
     return [self imageRendererWithBytes:bytes length:length MIMEType:nil];

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list