+2004-10-21 Darin Adler <darin@apple.com>
+
+ Reviewed by John.
+
+ - fixed <rdar://problem/3847994> REGRESSION: reproducible exception in WebImageRenderer releasePatternColor; afterwards get crash or no more browsing
+
+ * WebCoreSupport.subproj/WebImageRenderer.m:
+ (-[WebInternalImage createRendererIfNeeded]): Replaced retainOrCopyIfNeeded with this.
+ This returns nil if a copied renderer isn't needed, and returns a new renderer if a copy is.
+ The old version was sometimes returning a WebInternalImage and other times a WebImageRenderer.
+ (-[WebImageRenderer retainOrCopyIfNeeded]): Returns the result of createRendererIfNeeded
+ or retains self and returns self.
+
2004-10-20 Darin Adler <darin@apple.com>
Reviewed by Dave.
- (BOOL)isNull;
- (void)increaseUseCount;
- (void)decreaseUseCount;
-- (WebInternalImage *)retainOrCopyIfNeeded;
+- (WebImageRenderer *)createRendererIfNeeded;
- (void)flushRasterCache;
- (CGImageRef)imageRef;
useCount--;
}
-- (WebInternalImage *)retainOrCopyIfNeeded
+- (WebImageRenderer *)createRendererIfNeeded
{
- WebInternalImage *copy;
-
// If an animated image appears multiple times in a given page, we
// must create multiple WebCoreImageRenderers so that each copy
// animates. However, we don't want to incur the expense of
// re-decoding for the very first use on a page, since QPixmap
// assignment always calls this method, even when just fetching
// the image from the cache for the first time for a page.
- if (originalData && useCount){
- copy = [[[WebImageRendererFactory sharedFactory] imageRendererWithData:originalData MIMEType:MIMEType] retain];
- }
- else {
- copy = [self retain];
+ if (originalData && useCount) {
+ return [[[WebImageRendererFactory sharedFactory] imageRendererWithData:originalData MIMEType:MIMEType] retain];
}
-
- return copy;
+ return nil;
}
- copyWithZone:(NSZone *)zone
- (id <WebCoreImageRenderer>)retainOrCopyIfNeeded
{
- WebInternalImage *newImage = [image retainOrCopyIfNeeded];
- if (newImage == image) {
- [image release];
- [self retain];
- return self;
+ WebImageRenderer *newRenderer = [image createRendererIfNeeded];
+ if (newRenderer) {
+ return newRenderer;
}
- WebImageRenderer *newRenderer = [[WebImageRenderer alloc] init];
- newRenderer->image = newImage;
- return newRenderer;
+ [self retain];
+ return self;
}
- (void)increaseUseCount