OLD | NEW |
| (Empty) |
1 // Copyright 2011 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 | |
6 #include "config.h" | |
7 | |
8 #if USE(ACCELERATED_COMPOSITING) | |
9 | |
10 #include "CCLayerTilingData.h" | |
11 | |
12 using namespace std; | |
13 | |
14 namespace cc { | |
15 | |
16 PassOwnPtr<CCLayerTilingData> CCLayerTilingData::create(const IntSize& tileSize,
BorderTexelOption border) | |
17 { | |
18 return adoptPtr(new CCLayerTilingData(tileSize, border)); | |
19 } | |
20 | |
21 CCLayerTilingData::CCLayerTilingData(const IntSize& tileSize, BorderTexelOption
border) | |
22 : m_tilingData(tileSize, IntSize(), border == HasBorderTexels) | |
23 { | |
24 setTileSize(tileSize); | |
25 } | |
26 | |
27 CCLayerTilingData::~CCLayerTilingData() | |
28 { | |
29 } | |
30 | |
31 void CCLayerTilingData::setTileSize(const IntSize& size) | |
32 { | |
33 if (tileSize() == size) | |
34 return; | |
35 | |
36 reset(); | |
37 | |
38 m_tilingData.setMaxTextureSize(size); | |
39 } | |
40 | |
41 IntSize CCLayerTilingData::tileSize() const | |
42 { | |
43 return m_tilingData.maxTextureSize(); | |
44 } | |
45 | |
46 void CCLayerTilingData::setBorderTexelOption(BorderTexelOption borderTexelOption
) | |
47 { | |
48 bool borderTexels = borderTexelOption == HasBorderTexels; | |
49 if (hasBorderTexels() == borderTexels) | |
50 return; | |
51 | |
52 reset(); | |
53 m_tilingData.setHasBorderTexels(borderTexels); | |
54 } | |
55 | |
56 const CCLayerTilingData& CCLayerTilingData::operator=(const CCLayerTilingData& t
iler) | |
57 { | |
58 m_tilingData = tiler.m_tilingData; | |
59 | |
60 return *this; | |
61 } | |
62 | |
63 void CCLayerTilingData::addTile(PassOwnPtr<Tile> tile, int i, int j) | |
64 { | |
65 ASSERT(!tileAt(i, j)); | |
66 tile->moveTo(i, j); | |
67 m_tiles.add(make_pair(i, j), tile); | |
68 } | |
69 | |
70 PassOwnPtr<CCLayerTilingData::Tile> CCLayerTilingData::takeTile(int i, int j) | |
71 { | |
72 return m_tiles.take(make_pair(i, j)); | |
73 } | |
74 | |
75 CCLayerTilingData::Tile* CCLayerTilingData::tileAt(int i, int j) const | |
76 { | |
77 return m_tiles.get(make_pair(i, j)); | |
78 } | |
79 | |
80 void CCLayerTilingData::reset() | |
81 { | |
82 m_tiles.clear(); | |
83 } | |
84 | |
85 void CCLayerTilingData::contentRectToTileIndices(const IntRect& contentRect, int
& left, int& top, int& right, int& bottom) const | |
86 { | |
87 // An empty rect doesn't result in an empty set of tiles, so don't pass an e
mpty rect. | |
88 // FIXME: Possibly we should fill a vector of tiles instead, | |
89 // since the normal use of this function is to enumerate some tiles. | |
90 ASSERT(!contentRect.isEmpty()); | |
91 | |
92 left = m_tilingData.tileXIndexFromSrcCoord(contentRect.x()); | |
93 top = m_tilingData.tileYIndexFromSrcCoord(contentRect.y()); | |
94 right = m_tilingData.tileXIndexFromSrcCoord(contentRect.maxX() - 1); | |
95 bottom = m_tilingData.tileYIndexFromSrcCoord(contentRect.maxY() - 1); | |
96 } | |
97 | |
98 IntRect CCLayerTilingData::tileRect(const Tile* tile) const | |
99 { | |
100 IntRect tileRect = m_tilingData.tileBoundsWithBorder(tile->i(), tile->j()); | |
101 tileRect.setSize(tileSize()); | |
102 return tileRect; | |
103 } | |
104 | |
105 Region CCLayerTilingData::opaqueRegionInContentRect(const IntRect& contentRect)
const | |
106 { | |
107 if (contentRect.isEmpty()) | |
108 return Region(); | |
109 | |
110 Region opaqueRegion; | |
111 int left, top, right, bottom; | |
112 contentRectToTileIndices(contentRect, left, top, right, bottom); | |
113 for (int j = top; j <= bottom; ++j) { | |
114 for (int i = left; i <= right; ++i) { | |
115 Tile* tile = tileAt(i, j); | |
116 if (!tile) | |
117 continue; | |
118 | |
119 IntRect tileOpaqueRect = intersection(contentRect, tile->opaqueRect(
)); | |
120 opaqueRegion.unite(tileOpaqueRect); | |
121 } | |
122 } | |
123 return opaqueRegion; | |
124 } | |
125 | |
126 void CCLayerTilingData::setBounds(const IntSize& size) | |
127 { | |
128 m_tilingData.setTotalSize(size); | |
129 if (size.isEmpty()) { | |
130 m_tiles.clear(); | |
131 return; | |
132 } | |
133 | |
134 // Any tiles completely outside our new bounds are invalid and should be dro
pped. | |
135 int left, top, right, bottom; | |
136 contentRectToTileIndices(IntRect(IntPoint(), size), left, top, right, bottom
); | |
137 Vector<TileMapKey> invalidTileKeys; | |
138 for (TileMap::const_iterator it = m_tiles.begin(); it != m_tiles.end(); ++it
) { | |
139 #if WTF_NEW_HASHMAP_ITERATORS_INTERFACE | |
140 if (it->key.first > right || it->key.second > bottom) | |
141 invalidTileKeys.append(it->key); | |
142 #else | |
143 if (it->first.first > right || it->first.second > bottom) | |
144 invalidTileKeys.append(it->first); | |
145 #endif | |
146 } | |
147 for (size_t i = 0; i < invalidTileKeys.size(); ++i) | |
148 m_tiles.remove(invalidTileKeys[i]); | |
149 } | |
150 | |
151 IntSize CCLayerTilingData::bounds() const | |
152 { | |
153 return m_tilingData.totalSize(); | |
154 } | |
155 | |
156 } // namespace cc | |
157 | |
158 #endif // USE(ACCELERATED_COMPOSITING) | |
OLD | NEW |