18f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian/* 28f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * Copyright (C) 2009 Apple Inc. All rights reserved. 38f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * 48f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * Redistribution and use in source and binary forms, with or without 58f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * modification, are permitted provided that the following conditions 68f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * are met: 78f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * 1. Redistributions of source code must retain the above copyright 88f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * notice, this list of conditions and the following disclaimer. 98f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * 2. Redistributions in binary form must reproduce the above copyright 108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * notice, this list of conditions and the following disclaimer in the 118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * documentation and/or other materials provided with the distribution. 128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * 138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian */ 258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "config.h" 278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if USE(ACCELERATED_COMPOSITING) 298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#import "WebLayer.h" 318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#import "GraphicsContext.h" 33f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#import "GraphicsLayerCA.h" 34f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#import "PlatformCALayer.h" 35967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#import <objc/objc-runtime.h> 368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#import <QuartzCore/QuartzCore.h> 378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#import <wtf/UnusedParam.h> 388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianusing namespace WebCore; 408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian@implementation WebLayer 428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 432bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid drawLayerContents(CGContextRef context, CALayer *layer, WebCore::PlatformCALayer* platformLayer) 448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 452bde8e466a4451c7319e3a072d118917957d6554Steve Block WebCore::PlatformCALayerClient* layerContents = platformLayer->owner(); 460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!layerContents) 470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return; 480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian CGContextSaveGState(context); 500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch CGRect layerBounds = [layer bounds]; 52cad810f21b803229eb11403f9209855525a25d57Steve Block if (layerContents->platformCALayerContentsOrientation() == WebCore::GraphicsLayer::CompositingCoordinatesBottomUp) { 530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch CGContextScaleCTM(context, 1, -1); 540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch CGContextTranslateCTM(context, 0, -layerBounds.size.height); 550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 57cad810f21b803229eb11403f9209855525a25d57Steve Block [NSGraphicsContext saveGraphicsState]; 588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 59cad810f21b803229eb11403f9209855525a25d57Steve Block // Set up an NSGraphicsContext for the context, so that parts of AppKit that rely on 60cad810f21b803229eb11403f9209855525a25d57Steve Block // the current NSGraphicsContext (e.g. NSCell drawing) get the right one. 61cad810f21b803229eb11403f9209855525a25d57Steve Block NSGraphicsContext* layerContext = [NSGraphicsContext graphicsContextWithGraphicsPort:context flipped:YES]; 62cad810f21b803229eb11403f9209855525a25d57Steve Block [NSGraphicsContext setCurrentContext:layerContext]; 638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 64cad810f21b803229eb11403f9209855525a25d57Steve Block GraphicsContext graphicsContext(context); 6581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch graphicsContext.setIsCALayerContext(true); 662bde8e466a4451c7319e3a072d118917957d6554Steve Block graphicsContext.setIsAcceleratedContext(platformLayer->acceleratesDrawing()); 678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 68cad810f21b803229eb11403f9209855525a25d57Steve Block if (!layerContents->platformCALayerContentsOpaque()) { 69cad810f21b803229eb11403f9209855525a25d57Steve Block // Turn off font smoothing to improve the appearance of text rendered onto a transparent background. 70cad810f21b803229eb11403f9209855525a25d57Steve Block graphicsContext.setShouldSmoothFonts(false); 718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 72cad810f21b803229eb11403f9209855525a25d57Steve Block 73cad810f21b803229eb11403f9209855525a25d57Steve Block // It's important to get the clip from the context, because it may be significantly 74cad810f21b803229eb11403f9209855525a25d57Steve Block // smaller than the layer bounds (e.g. tiled layers) 75cad810f21b803229eb11403f9209855525a25d57Steve Block CGRect clipBounds = CGContextGetClipBoundingBox(context); 76cad810f21b803229eb11403f9209855525a25d57Steve Block IntRect clip(enclosingIntRect(clipBounds)); 77cad810f21b803229eb11403f9209855525a25d57Steve Block layerContents->platformCALayerPaintContents(graphicsContext, clip); 788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 79cad810f21b803229eb11403f9209855525a25d57Steve Block [NSGraphicsContext restoreGraphicsState]; 808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 81cad810f21b803229eb11403f9209855525a25d57Steve Block if (layerContents->platformCALayerShowRepaintCounter()) { 828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian bool isTiledLayer = [layer isKindOfClass:[CATiledLayer class]]; 838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian char text[16]; // that's a lot of repaints 85cad810f21b803229eb11403f9209855525a25d57Steve Block snprintf(text, sizeof(text), "%d", layerContents->platformCALayerIncrementRepaintCount()); 868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian CGContextSaveGState(context); 888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (isTiledLayer) 898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian CGContextSetRGBFillColor(context, 0.0f, 1.0f, 0.0f, 0.8f); 908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else 918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian CGContextSetRGBFillColor(context, 1.0f, 0.0f, 0.0f, 0.8f); 928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch CGRect aBounds = layerBounds; 948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian aBounds.size.width = 10 + 12 * strlen(text); 968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian aBounds.size.height = 25; 978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian CGContextFillRect(context, aBounds); 988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian CGContextSetRGBFillColor(context, 0.0f, 0.0f, 0.0f, 1.0f); 1008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian CGContextSetTextMatrix(context, CGAffineTransformMakeScale(1.0f, -1.0f)); 1028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian CGContextSelectFont(context, "Helvetica", 25, kCGEncodingMacRoman); 1038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian CGContextShowTextAtPoint(context, aBounds.origin.x + 3.0f, aBounds.origin.y + 20.0f, text, strlen(text)); 1048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian CGContextRestoreGState(context); 1068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 1070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch CGContextRestoreGState(context); 1098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 1108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 111cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid setLayerNeedsDisplayInRect(CALayer *layer, WebCore::PlatformCALayerClient* layerContents, CGRect rect) 112967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{ 113cad810f21b803229eb11403f9209855525a25d57Steve Block if (layerContents && layerContents->platformCALayerDrawsContent()) { 114967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch struct objc_super layerSuper = { layer, class_getSuperclass(object_getClass(layer)) }; 115967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#if defined(BUILDING_ON_LEOPARD) 116967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch rect = CGRectApplyAffineTransform(rect, [layer contentsTransform]); 117967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#else 118cad810f21b803229eb11403f9209855525a25d57Steve Block if (layerContents->platformCALayerContentsOrientation() == WebCore::GraphicsLayer::CompositingCoordinatesBottomUp) 119967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch rect.origin.y = [layer bounds].size.height - rect.origin.y - rect.size.height; 120967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#endif 121967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch objc_msgSendSuper(&layerSuper, @selector(setNeedsDisplayInRect:), rect); 122967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch 123967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#ifndef NDEBUG 124cad810f21b803229eb11403f9209855525a25d57Steve Block if (layerContents->platformCALayerShowRepaintCounter()) { 125967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch CGRect bounds = [layer bounds]; 126967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch CGRect indicatorRect = CGRectMake(bounds.origin.x, bounds.origin.y, 46, 25); 127967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#if defined(BUILDING_ON_LEOPARD) 128967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch indicatorRect = CGRectApplyAffineTransform(indicatorRect, [layer contentsTransform]); 129967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#else 130cad810f21b803229eb11403f9209855525a25d57Steve Block if (layerContents->platformCALayerContentsOrientation() == WebCore::GraphicsLayer::CompositingCoordinatesBottomUp) 131967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch indicatorRect.origin.y = [layer bounds].size.height - indicatorRect.origin.y - indicatorRect.size.height; 132967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#endif 133967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch objc_msgSendSuper(&layerSuper, @selector(setNeedsDisplayInRect:), indicatorRect); 134967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch } 135967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#endif 136967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch } 137967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch} 138967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch 1398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian// Disable default animations 1408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian- (id<CAAction>)actionForKey:(NSString *)key 1418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 1428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian UNUSED_PARAM(key); 1438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return nil; 1448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 1458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian- (void)setNeedsDisplay 1478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 148f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch PlatformCALayer* layer = PlatformCALayer::platformCALayer(self); 149cad810f21b803229eb11403f9209855525a25d57Steve Block if (layer && layer->owner() && layer->owner()->platformCALayerDrawsContent()) 1508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian [super setNeedsDisplay]; 1518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 1528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian- (void)setNeedsDisplayInRect:(CGRect)dirtyRect 1548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 155f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch PlatformCALayer* layer = PlatformCALayer::platformCALayer(self); 156f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (layer) 157f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch setLayerNeedsDisplayInRect(self, layer->owner(), dirtyRect); 1588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 1598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 160d0825bca7fe65beaee391d30da42e937db621564Steve Block- (void)display 161d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 162d0825bca7fe65beaee391d30da42e937db621564Steve Block [super display]; 163f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch PlatformCALayer* layer = PlatformCALayer::platformCALayer(self); 164f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (layer && layer->owner()) 165cad810f21b803229eb11403f9209855525a25d57Steve Block layer->owner()->platformCALayerLayerDidDisplay(self); 166d0825bca7fe65beaee391d30da42e937db621564Steve Block} 167d0825bca7fe65beaee391d30da42e937db621564Steve Block 1688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian- (void)drawInContext:(CGContextRef)context 1698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 170f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch PlatformCALayer* layer = PlatformCALayer::platformCALayer(self); 171f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (layer) 1722bde8e466a4451c7319e3a072d118917957d6554Steve Block drawLayerContents(context, self, layer); 1738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 1748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian@end // implementation WebLayer 1768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 177cad810f21b803229eb11403f9209855525a25d57Steve Block// MARK: - 1788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#ifndef NDEBUG 1808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian@implementation CALayer(ExtendedDescription) 1828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian- (NSString*)_descriptionWithPrefix:(NSString*)inPrefix 1848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 1858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian CGRect aBounds = [self bounds]; 1868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian CGPoint aPos = [self position]; 1878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian NSString* selfString = [NSString stringWithFormat:@"%@<%@ 0x%08x> \"%@\" bounds(%.1f, %.1f, %.1f, %.1f) pos(%.1f, %.1f), sublayers=%d masking=%d", 1898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian inPrefix, 1908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian [self class], 1918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian self, 1928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian [self name], 1938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian aBounds.origin.x, aBounds.origin.y, aBounds.size.width, aBounds.size.height, 1948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian aPos.x, aPos.y, 1958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian [[self sublayers] count], 1968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian [self masksToBounds]]; 1978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian NSMutableString* curDesc = [NSMutableString stringWithString:selfString]; 1998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if ([[self sublayers] count] > 0) 2018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian [curDesc appendString:@"\n"]; 2028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian NSString* sublayerPrefix = [inPrefix stringByAppendingString:@"\t"]; 2048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian NSEnumerator* sublayersEnum = [[self sublayers] objectEnumerator]; 2068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian CALayer* curLayer; 2078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian while ((curLayer = [sublayersEnum nextObject])) 2088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian [curDesc appendString:[curLayer _descriptionWithPrefix:sublayerPrefix]]; 2098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if ([[self sublayers] count] == 0) 2118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian [curDesc appendString:@"\n"]; 2128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return curDesc; 2148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 2158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian- (NSString*)extendedDescription 2178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 2188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return [self _descriptionWithPrefix:@""]; 2198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 2208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian@end // implementation WebLayer(ExtendedDescription) 2228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif // NDEBUG 2248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif // USE(ACCELERATED_COMPOSITING) 226