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