Use NeverDestroyed instead of DEPRECATED_DEFINE_STATIC_LOCAL
[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 #include <wtf/NeverDestroyed.h>
41
42 #if __has_include(<WebKitAdditions/LayerBackingStoreAdditions.mm>)
43 #import <WebKitAdditions/LayerBackingStoreAdditions.mm>
44 #else
45 namespace WebCore {
46 static void setBackingStoreFormat(CALayer *)
47 {
48 }
49 } // namespace WebCore
50 #endif
51
52 namespace WebCore {
53
54 #if LOG_TILING
55 static int totalTileCount;
56 #endif
57
58 LegacyTileGridTile::LegacyTileGridTile(LegacyTileGrid* tileGrid, const IntRect& tileRect)
59     : m_tileGrid(tileGrid)
60     , m_rect(tileRect)
61 {
62     ASSERT(!tileRect.isEmpty());
63     IntSize pixelSize(m_rect.size());
64     const CGFloat screenScale = m_tileGrid->tileCache().screenScale();
65     pixelSize.scale(screenScale);
66     m_tileLayer = LegacyTileLayerPool::sharedPool()->takeLayerWithSize(pixelSize);
67     if (!m_tileLayer) {
68 #if LOG_TILING
69         NSLog(@"unable to reuse layer with size %d x %d, creating one", pixelSize.width(), pixelSize.height());
70 #endif
71         m_tileLayer = adoptNS([[LegacyTileLayer alloc] init]);
72     }
73     LegacyTileLayer* layer = m_tileLayer.get();
74     setBackingStoreFormat(layer);
75     [layer setTileGrid:tileGrid];
76     [layer setOpaque:m_tileGrid->tileCache().tilesOpaque()];
77     [layer setEdgeAntialiasingMask:0];
78     [layer setNeedsLayoutOnGeometryChange:NO];
79     [layer setContentsScale:screenScale];
80     [layer setAcceleratesDrawing:m_tileGrid->tileCache().acceleratedDrawingEnabled()];
81
82     // Host layer may have other sublayers. Keep the tile layers at the beginning of the array
83     // so they are painted behind everything else.
84     [tileGrid->tileHostLayer() insertSublayer:layer atIndex:tileGrid->tileCount()];
85     [layer setFrame:m_rect];
86     invalidateRect(m_rect);
87     showBorder(m_tileGrid->tileCache().tileBordersVisible());
88
89 #if LOG_TILING
90     ++totalTileCount;
91     NSLog(@"new Tile (%d,%d) %d %d, count %d", tileRect.x(), tileRect.y(), tileRect.width(), tileRect.height(), totalTileCount);
92 #endif
93 }
94
95 LegacyTileGridTile::~LegacyTileGridTile() 
96 {
97     [tileLayer() setTileGrid:0];
98     [tileLayer() removeFromSuperlayer];
99     LegacyTileLayerPool::sharedPool()->addLayer(tileLayer());
100 #if LOG_TILING
101     --totalTileCount;
102     NSLog(@"delete Tile (%d,%d) %d %d, count %d", m_rect.x(), m_rect.y(), m_rect.width(), m_rect.height(), totalTileCount);
103 #endif
104 }
105
106 void LegacyTileGridTile::invalidateRect(const IntRect& windowDirtyRect)
107 {
108     IntRect dirtyRect = intersection(windowDirtyRect, m_rect);
109     if (dirtyRect.isEmpty())
110         return;
111     dirtyRect.move(IntPoint() - m_rect.location());
112     [tileLayer() setNeedsDisplayInRect:dirtyRect];
113
114     if (m_tileGrid->tileCache().tilePaintCountersVisible())
115         [tileLayer() setNeedsDisplayInRect:CGRectMake(0, 0, 46, 25)];
116 }
117
118 void LegacyTileGridTile::setRect(const IntRect& tileRect)
119 {
120     if (m_rect == tileRect)
121         return;
122     m_rect = tileRect;
123     LegacyTileLayer* layer = m_tileLayer.get();
124     [layer setFrame:m_rect];
125     [layer setNeedsDisplay];
126 }
127
128 void LegacyTileGridTile::showBorder(bool flag)
129 {
130     LegacyTileLayer* layer = m_tileLayer.get();
131     if (flag) {
132         [layer setBorderColor:cachedCGColor(m_tileGrid->tileCache().colorForGridTileBorder(m_tileGrid))];
133         [layer setBorderWidth:0.5f];
134     } else {
135         [layer setBorderColor:nil];
136         [layer setBorderWidth:0];
137     }
138 }
139
140 } // namespace WebCore
141
142 #endif // PLATFORM(IOS)