Index: third_party/WebKit/WebCore/platform/graphics/mac/WebLayer.mm |
=================================================================== |
--- third_party/WebKit/WebCore/platform/graphics/mac/WebLayer.mm (revision 9391) |
+++ third_party/WebKit/WebCore/platform/graphics/mac/WebLayer.mm (working copy) |
@@ -1,225 +1,219 @@ |
-/* |
- * Copyright (C) 2009 Apple Inc. All rights reserved. |
- * |
- * Redistribution and use in source and binary forms, with or without |
- * modification, are permitted provided that the following conditions |
- * are met: |
- * 1. Redistributions of source code must retain the above copyright |
- * notice, this list of conditions and the following disclaimer. |
- * 2. Redistributions in binary form must reproduce the above copyright |
- * notice, this list of conditions and the following disclaimer in the |
- * documentation and/or other materials provided with the distribution. |
- * |
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY |
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR |
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
- */ |
- |
-#include "config.h" |
- |
-#if USE(ACCELERATED_COMPOSITING) |
- |
-#import "WebLayer.h" |
- |
-#import "GraphicsContext.h" |
-#import "GraphicsLayer.h" |
-#import <QuartzCore/QuartzCore.h> |
-#import "WebCoreTextRenderer.h" |
-#import <wtf/UnusedParam.h> |
- |
-using namespace WebCore; |
- |
-@implementation WebLayer |
- |
-+ (void)drawContents:(WebCore::GraphicsLayer*)layerContents ofLayer:(CALayer*)layer intoContext:(CGContextRef)context |
-{ |
- UNUSED_PARAM(layer); |
- CGContextSaveGState(context); |
- |
- if (layerContents && layerContents->client()) { |
- [NSGraphicsContext saveGraphicsState]; |
- |
- // Set up an NSGraphicsContext for the context, so that parts of AppKit that rely on |
- // the current NSGraphicsContext (e.g. NSCell drawing) get the right one. |
- NSGraphicsContext* layerContext = [NSGraphicsContext graphicsContextWithGraphicsPort:context flipped:YES]; |
- [NSGraphicsContext setCurrentContext:layerContext]; |
- |
- GraphicsContext graphicsContext(context); |
- |
- // When drawing into CALayers, we need to turn off font smoothing (aka LCD antialiasing). |
- bool wasSmoothing = graphicsContext.usingFontSmoothing(); |
- graphicsContext.setUseFontSmoothing(false); |
- |
- // It's important to get the clip from the context, because it may be significantly |
- // smaller than the layer bounds (e.g. tiled layers) |
- CGRect clipBounds = CGContextGetClipBoundingBox(context); |
- IntRect clip(enclosingIntRect(clipBounds)); |
- layerContents->paintGraphicsLayerContents(graphicsContext, clip); |
- |
- graphicsContext.setUseFontSmoothing(wasSmoothing); |
- |
- [NSGraphicsContext restoreGraphicsState]; |
- } |
-#ifndef NDEBUG |
- else { |
- ASSERT_NOT_REACHED(); |
- |
- // FIXME: ideally we'd avoid calling -setNeedsDisplay on a layer that is a plain color, |
- // so CA never makes backing store for it (which is what -setNeedsDisplay will do above). |
- CGContextSetRGBFillColor(context, 0.0f, 1.0f, 0.0f, 1.0f); |
- CGRect aBounds = [layer bounds]; |
- CGContextFillRect(context, aBounds); |
- } |
-#endif |
- |
- CGContextRestoreGState(context); |
- |
-#ifndef NDEBUG |
- if (layerContents && layerContents->showRepaintCounter()) { |
- bool isTiledLayer = [layer isKindOfClass:[CATiledLayer class]]; |
- |
- char text[16]; // that's a lot of repaints |
- snprintf(text, sizeof(text), "%d", layerContents->incrementRepaintCount()); |
- |
- CGAffineTransform a = CGContextGetCTM(context); |
- |
- CGContextSaveGState(context); |
- if (isTiledLayer) |
- CGContextSetRGBFillColor(context, 0.0f, 1.0f, 0.0f, 0.8f); |
- else |
- CGContextSetRGBFillColor(context, 1.0f, 0.0f, 0.0f, 0.8f); |
- |
- CGRect aBounds = [layer bounds]; |
- |
- aBounds.size.width = 10 + 12 * strlen(text); |
- aBounds.size.height = 25; |
- CGContextFillRect(context, aBounds); |
- |
- CGContextSetRGBFillColor(context, 0.0f, 0.0f, 0.0f, 1.0f); |
- |
- CGContextSetTextMatrix(context, CGAffineTransformMakeScale(1.0f, -1.0f)); |
- CGContextSelectFont(context, "Helvetica", 25, kCGEncodingMacRoman); |
- CGContextShowTextAtPoint(context, aBounds.origin.x + 3.0f, aBounds.origin.y + 20.0f, text, strlen(text)); |
- |
- CGContextRestoreGState(context); |
- } |
-#endif |
-} |
- |
-// Disable default animations |
-- (id<CAAction>)actionForKey:(NSString *)key |
-{ |
- UNUSED_PARAM(key); |
- return nil; |
-} |
- |
-// Implement this so presentationLayer can get our custom attributes |
-- (id)initWithLayer:(id)layer |
-{ |
- if ((self = [super initWithLayer:layer])) |
- m_layerOwner = [(WebLayer*)layer layerOwner]; |
- |
- return self; |
-} |
- |
-- (void)setNeedsDisplay |
-{ |
- if (m_layerOwner && m_layerOwner->client() && m_layerOwner->drawsContent()) |
- [super setNeedsDisplay]; |
-} |
- |
-- (void)setNeedsDisplayInRect:(CGRect)dirtyRect |
-{ |
- if (m_layerOwner && m_layerOwner->client() && m_layerOwner->drawsContent()) { |
- [super setNeedsDisplayInRect:dirtyRect]; |
- |
-#ifndef NDEBUG |
- if (m_layerOwner->showRepaintCounter()) { |
- CGRect bounds = [self bounds]; |
- [super setNeedsDisplayInRect:CGRectMake(bounds.origin.x, bounds.origin.y, 46, 25)]; |
- } |
-#endif |
- } |
-} |
- |
-- (void)drawInContext:(CGContextRef)context |
-{ |
- [WebLayer drawContents:m_layerOwner ofLayer:self intoContext:context]; |
-} |
- |
-@end // implementation WebLayer |
- |
-#pragma mark - |
- |
-@implementation WebLayer(WebLayerAdditions) |
- |
-- (void)setLayerOwner:(GraphicsLayer*)aLayer |
-{ |
- m_layerOwner = aLayer; |
-} |
- |
-- (GraphicsLayer*)layerOwner |
-{ |
- return m_layerOwner; |
-} |
- |
-@end |
- |
-#pragma mark - |
- |
-#ifndef NDEBUG |
- |
-@implementation CALayer(ExtendedDescription) |
- |
-- (NSString*)_descriptionWithPrefix:(NSString*)inPrefix |
-{ |
- CGRect aBounds = [self bounds]; |
- CGPoint aPos = [self position]; |
- CATransform3D t = [self transform]; |
- |
- NSString* selfString = [NSString stringWithFormat:@"%@<%@ 0x%08x> \"%@\" bounds(%.1f, %.1f, %.1f, %.1f) pos(%.1f, %.1f), sublayers=%d masking=%d", |
- inPrefix, |
- [self class], |
- self, |
- [self name], |
- aBounds.origin.x, aBounds.origin.y, aBounds.size.width, aBounds.size.height, |
- aPos.x, aPos.y, |
- [[self sublayers] count], |
- [self masksToBounds]]; |
- |
- NSMutableString* curDesc = [NSMutableString stringWithString:selfString]; |
- |
- if ([[self sublayers] count] > 0) |
- [curDesc appendString:@"\n"]; |
- |
- NSString* sublayerPrefix = [inPrefix stringByAppendingString:@"\t"]; |
- |
- NSEnumerator* sublayersEnum = [[self sublayers] objectEnumerator]; |
- CALayer* curLayer; |
- while ((curLayer = [sublayersEnum nextObject])) |
- [curDesc appendString:[curLayer _descriptionWithPrefix:sublayerPrefix]]; |
- |
- if ([[self sublayers] count] == 0) |
- [curDesc appendString:@"\n"]; |
- |
- return curDesc; |
-} |
- |
-- (NSString*)extendedDescription |
-{ |
- return [self _descriptionWithPrefix:@""]; |
-} |
- |
-@end // implementation WebLayer(ExtendedDescription) |
- |
-#endif // NDEBUG |
- |
-#endif // USE(ACCELERATED_COMPOSITING) |
+/* |
+ * Copyright (C) 2009 Apple Inc. All rights reserved. |
+ * |
+ * Redistribution and use in source and binary forms, with or without |
+ * modification, are permitted provided that the following conditions |
+ * are met: |
+ * 1. Redistributions of source code must retain the above copyright |
+ * notice, this list of conditions and the following disclaimer. |
+ * 2. Redistributions in binary form must reproduce the above copyright |
+ * notice, this list of conditions and the following disclaimer in the |
+ * documentation and/or other materials provided with the distribution. |
+ * |
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY |
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR |
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+ */ |
+ |
+#include "config.h" |
+ |
+#if USE(ACCELERATED_COMPOSITING) |
+ |
+#import "WebLayer.h" |
+ |
+#import "GraphicsContext.h" |
+#import "GraphicsLayer.h" |
+#import <QuartzCore/QuartzCore.h> |
+#import "WebCoreTextRenderer.h" |
+#import <wtf/UnusedParam.h> |
+ |
+using namespace WebCore; |
+ |
+@implementation WebLayer |
+ |
++ (void)drawContents:(WebCore::GraphicsLayer*)layerContents ofLayer:(CALayer*)layer intoContext:(CGContextRef)context |
+{ |
+ UNUSED_PARAM(layer); |
+ CGContextSaveGState(context); |
+ |
+ if (layerContents && layerContents->client()) { |
+ [NSGraphicsContext saveGraphicsState]; |
+ |
+ // Set up an NSGraphicsContext for the context, so that parts of AppKit that rely on |
+ // the current NSGraphicsContext (e.g. NSCell drawing) get the right one. |
+ NSGraphicsContext* layerContext = [NSGraphicsContext graphicsContextWithGraphicsPort:context flipped:YES]; |
+ [NSGraphicsContext setCurrentContext:layerContext]; |
+ |
+ GraphicsContext graphicsContext(context); |
+ |
+ // It's important to get the clip from the context, because it may be significantly |
+ // smaller than the layer bounds (e.g. tiled layers) |
+ CGRect clipBounds = CGContextGetClipBoundingBox(context); |
+ IntRect clip(enclosingIntRect(clipBounds)); |
+ layerContents->paintGraphicsLayerContents(graphicsContext, clip); |
+ |
+ [NSGraphicsContext restoreGraphicsState]; |
+ } |
+#ifndef NDEBUG |
+ else { |
+ ASSERT_NOT_REACHED(); |
+ |
+ // FIXME: ideally we'd avoid calling -setNeedsDisplay on a layer that is a plain color, |
+ // so CA never makes backing store for it (which is what -setNeedsDisplay will do above). |
+ CGContextSetRGBFillColor(context, 0.0f, 1.0f, 0.0f, 1.0f); |
+ CGRect aBounds = [layer bounds]; |
+ CGContextFillRect(context, aBounds); |
+ } |
+#endif |
+ |
+ CGContextRestoreGState(context); |
+ |
+#ifndef NDEBUG |
+ if (layerContents && layerContents->showRepaintCounter()) { |
+ bool isTiledLayer = [layer isKindOfClass:[CATiledLayer class]]; |
+ |
+ char text[16]; // that's a lot of repaints |
+ snprintf(text, sizeof(text), "%d", layerContents->incrementRepaintCount()); |
+ |
+ CGAffineTransform a = CGContextGetCTM(context); |
+ |
+ CGContextSaveGState(context); |
+ if (isTiledLayer) |
+ CGContextSetRGBFillColor(context, 0.0f, 1.0f, 0.0f, 0.8f); |
+ else |
+ CGContextSetRGBFillColor(context, 1.0f, 0.0f, 0.0f, 0.8f); |
+ |
+ CGRect aBounds = [layer bounds]; |
+ |
+ aBounds.size.width = 10 + 12 * strlen(text); |
+ aBounds.size.height = 25; |
+ CGContextFillRect(context, aBounds); |
+ |
+ CGContextSetRGBFillColor(context, 0.0f, 0.0f, 0.0f, 1.0f); |
+ |
+ CGContextSetTextMatrix(context, CGAffineTransformMakeScale(1.0f, -1.0f)); |
+ CGContextSelectFont(context, "Helvetica", 25, kCGEncodingMacRoman); |
+ CGContextShowTextAtPoint(context, aBounds.origin.x + 3.0f, aBounds.origin.y + 20.0f, text, strlen(text)); |
+ |
+ CGContextRestoreGState(context); |
+ } |
+#endif |
+} |
+ |
+// Disable default animations |
+- (id<CAAction>)actionForKey:(NSString *)key |
+{ |
+ UNUSED_PARAM(key); |
+ return nil; |
+} |
+ |
+// Implement this so presentationLayer can get our custom attributes |
+- (id)initWithLayer:(id)layer |
+{ |
+ if ((self = [super initWithLayer:layer])) |
+ m_layerOwner = [(WebLayer*)layer layerOwner]; |
+ |
+ return self; |
+} |
+ |
+- (void)setNeedsDisplay |
+{ |
+ if (m_layerOwner && m_layerOwner->client() && m_layerOwner->drawsContent()) |
+ [super setNeedsDisplay]; |
+} |
+ |
+- (void)setNeedsDisplayInRect:(CGRect)dirtyRect |
+{ |
+ if (m_layerOwner && m_layerOwner->client() && m_layerOwner->drawsContent()) { |
+ [super setNeedsDisplayInRect:dirtyRect]; |
+ |
+#ifndef NDEBUG |
+ if (m_layerOwner->showRepaintCounter()) { |
+ CGRect bounds = [self bounds]; |
+ [super setNeedsDisplayInRect:CGRectMake(bounds.origin.x, bounds.origin.y, 46, 25)]; |
+ } |
+#endif |
+ } |
+} |
+ |
+- (void)drawInContext:(CGContextRef)context |
+{ |
+ [WebLayer drawContents:m_layerOwner ofLayer:self intoContext:context]; |
+} |
+ |
+@end // implementation WebLayer |
+ |
+#pragma mark - |
+ |
+@implementation WebLayer(WebLayerAdditions) |
+ |
+- (void)setLayerOwner:(GraphicsLayer*)aLayer |
+{ |
+ m_layerOwner = aLayer; |
+} |
+ |
+- (GraphicsLayer*)layerOwner |
+{ |
+ return m_layerOwner; |
+} |
+ |
+@end |
+ |
+#pragma mark - |
+ |
+#ifndef NDEBUG |
+ |
+@implementation CALayer(ExtendedDescription) |
+ |
+- (NSString*)_descriptionWithPrefix:(NSString*)inPrefix |
+{ |
+ CGRect aBounds = [self bounds]; |
+ CGPoint aPos = [self position]; |
+ CATransform3D t = [self transform]; |
+ |
+ NSString* selfString = [NSString stringWithFormat:@"%@<%@ 0x%08x> \"%@\" bounds(%.1f, %.1f, %.1f, %.1f) pos(%.1f, %.1f), sublayers=%d masking=%d", |
+ inPrefix, |
+ [self class], |
+ self, |
+ [self name], |
+ aBounds.origin.x, aBounds.origin.y, aBounds.size.width, aBounds.size.height, |
+ aPos.x, aPos.y, |
+ [[self sublayers] count], |
+ [self masksToBounds]]; |
+ |
+ NSMutableString* curDesc = [NSMutableString stringWithString:selfString]; |
+ |
+ if ([[self sublayers] count] > 0) |
+ [curDesc appendString:@"\n"]; |
+ |
+ NSString* sublayerPrefix = [inPrefix stringByAppendingString:@"\t"]; |
+ |
+ NSEnumerator* sublayersEnum = [[self sublayers] objectEnumerator]; |
+ CALayer* curLayer; |
+ while ((curLayer = [sublayersEnum nextObject])) |
+ [curDesc appendString:[curLayer _descriptionWithPrefix:sublayerPrefix]]; |
+ |
+ if ([[self sublayers] count] == 0) |
+ [curDesc appendString:@"\n"]; |
+ |
+ return curDesc; |
+} |
+ |
+- (NSString*)extendedDescription |
+{ |
+ return [self _descriptionWithPrefix:@""]; |
+} |
+ |
+@end // implementation WebLayer(ExtendedDescription) |
+ |
+#endif // NDEBUG |
+ |
+#endif // USE(ACCELERATED_COMPOSITING) |