231aeb6d6f2200cc7d83be1dcf5f274b72fa7eca
[WebKit-https.git] / Source / WebCore / platform / ios / LegacyTileGridTile.mm
1 /*
2  * Copyright (C) 2011 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "LegacyTileGridTile.h"
28
29 #if PLATFORM(IOS)
30
31 #include "Color.h"
32 #include "LegacyTileCache.h"
33 #include "LegacyTileGrid.h"
34 #include "LegacyTileLayer.h"
35 #include "LegacyTileLayerPool.h"
36 #include "QuartzCoreSPI.h"
37 #include "WAKWindow.h"
38 #include <algorithm>
39 #include <functional>
40
41 #if __has_include(<WebKitAdditions/LayerBackingStoreAdditions.mm>)
42 #import <WebKitAdditions/LayerBackingStoreAdditions.mm>
43 #else
44 namespace WebCore {
45 static void setBackingStoreFormat(CALayer *)
46 {
47 }
48 } // namespace WebCore
49 #endif
50
51 namespace WebCore {
52
53 #if LOG_TILING
54 static int totalTileCount;
55 #endif
56
57 LegacyTileGridTile::LegacyTileGridTile(LegacyTileGrid* tileGrid, const IntRect& tileRect)
58     : m_tileGrid(tileGrid)
59     , m_rect(tileRect)
60 {
61     ASSERT(!tileRect.isEmpty());
62     IntSize pixelSize(m_rect.size());
63     const CGFloat screenScale = m_tileGrid->tileCache().screenScale();
64     pixelSize.scale(screenScale);
65     m_tileLayer = LegacyTileLayerPool::sharedPool()->takeLayerWithSize(pixelSize);
66     if (!m_tileLayer) {
67 #if LOG_TILING
68         NSLog(@"unable to reuse layer with size %d x %d, creating one", pixelSize.width(), pixelSize.height());
69 #endif
70         m_tileLayer = adoptNS([[LegacyTileLayer alloc] init]);
71     }
72     LegacyTileLayer* layer = m_tileLayer.get();
73     setBackingStoreFormat(layer);
74     [layer setTileGrid:tileGrid];
75     [layer setOpaque:m_tileGrid->tileCache().tilesOpaque()];
76     [layer setEdgeAntialiasingMask:0];
77     [layer setNeedsLayoutOnGeometryChange:NO];
78     [layer setContentsScale:screenScale];
79     [layer setAcceleratesDrawing:m_tileGrid->tileCache().acceleratedDrawingEnabled()];
80
81     // Host layer may have other sublayers. Keep the tile layers at the beginning of the array
82     // so they are painted behind everything else.
83     [tileGrid->tileHostLayer() insertSublayer:layer atIndex:tileGrid->tileCount()];
84     [layer setFrame:m_rect];
85     invalidateRect(m_rect);
86     showBorder(m_tileGrid->tileCache().tileBordersVisible());
87
88 #if LOG_TILING
89     ++totalTileCount;
90     NSLog(@"new Tile (%d,%d) %d %d, count %d", tileRect.x(), tileRect.y(), tileRect.width(), tileRect.height(), totalTileCount);
91 #endif
92 }
93
94 LegacyTileGridTile::~LegacyTileGridTile() 
95 {
96     [tileLayer() setTileGrid:0];
97     [tileLayer() removeFromSuperlayer];
98     LegacyTileLayerPool::sharedPool()->addLayer(tileLayer());
99 #if LOG_TILING
100     --totalTileCount;
101     NSLog(@"delete Tile (%d,%d) %d %d, count %d", m_rect.x(), m_rect.y(), m_rect.width(), m_rect.height(), totalTileCount);
102 #endif
103 }
104
105 void LegacyTileGridTile::invalidateRect(const IntRect& windowDirtyRect)
106 {
107     IntRect dirtyRect = intersection(windowDirtyRect, m_rect);
108     if (dirtyRect.isEmpty())
109         return;
110     dirtyRect.move(IntPoint() - m_rect.location());
111     [tileLayer() setNeedsDisplayInRect:dirtyRect];
112
113     if (m_tileGrid->tileCache().tilePaintCountersVisible())
114         [tileLayer() setNeedsDisplayInRect:CGRectMake(0, 0, 46, 25)];
115 }
116
117 void LegacyTileGridTile::setRect(const IntRect& tileRect)
118 {
119     if (m_rect == tileRect)
120         return;
121     m_rect = tileRect;
122     LegacyTileLayer* layer = m_tileLayer.get();
123     [layer setFrame:m_rect];
124     [layer setNeedsDisplay];
125 }
126
127 void LegacyTileGridTile::showBorder(bool flag)
128 {
129     LegacyTileLayer* layer = m_tileLayer.get();
130     if (flag) {
131         [layer setBorderColor:cachedCGColor(m_tileGrid->tileCache().colorForGridTileBorder(m_tileGrid))];
132         [layer setBorderWidth:0.5f];
133     } else {
134         [layer setBorderColor:nil];
135         [layer setBorderWidth:0];
136     }
137 }
138
139 } // namespace WebCore
140
141 #endif // PLATFORM(IOS)