OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/debug/trace_event.h" | 5 #include "base/debug/trace_event.h" |
6 #include "cc/debug_colors.h" | 6 #include "cc/debug_colors.h" |
7 #include "cc/picture_pile_impl.h" | 7 #include "cc/picture_pile_impl.h" |
8 #include "cc/region.h" | 8 #include "cc/region.h" |
9 #include "cc/rendering_stats.h" | 9 #include "cc/rendering_stats.h" |
| 10 #include "skia/ext/analysis_canvas.h" |
10 #include "third_party/skia/include/core/SkCanvas.h" | 11 #include "third_party/skia/include/core/SkCanvas.h" |
11 #include "third_party/skia/include/core/SkSize.h" | 12 #include "third_party/skia/include/core/SkSize.h" |
12 #include "ui/gfx/rect_conversions.h" | 13 #include "ui/gfx/rect_conversions.h" |
13 #include "ui/gfx/skia_util.h" | 14 #include "ui/gfx/skia_util.h" |
14 | 15 |
15 namespace cc { | 16 namespace cc { |
16 | 17 |
17 scoped_refptr<PicturePileImpl> PicturePileImpl::Create() { | 18 scoped_refptr<PicturePileImpl> PicturePileImpl::Create() { |
18 return make_scoped_refptr(new PicturePileImpl()); | 19 return make_scoped_refptr(new PicturePileImpl()); |
19 } | 20 } |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
180 layer_rect.height(), | 181 layer_rect.height(), |
181 SkPicture::kUsePathBoundsForClip_RecordingFlag); | 182 SkPicture::kUsePathBoundsForClip_RecordingFlag); |
182 | 183 |
183 int64 total_pixels_rasterized = 0; | 184 int64 total_pixels_rasterized = 0; |
184 Raster(canvas, layer_rect, 1.0, &total_pixels_rasterized); | 185 Raster(canvas, layer_rect, 1.0, &total_pixels_rasterized); |
185 picture->endRecording(); | 186 picture->endRecording(); |
186 | 187 |
187 return picture; | 188 return picture; |
188 } | 189 } |
189 | 190 |
190 bool PicturePileImpl::IsCheapInRect( | 191 void PicturePileImpl::AnalyzeInRect(const gfx::Rect& content_rect, |
191 gfx::Rect content_rect, float contents_scale) const { | 192 float contents_scale) { |
| 193 TRACE_EVENT0("cc", "PicturePileImpl::AnalyzeInRect"); |
| 194 |
| 195 if (analysis_.is_analyzed_ && |
| 196 content_rect == analysis_.analyzed_content_rect_ && |
| 197 contents_scale == analysis_.analyzed_contents_scale_) { |
| 198 return; |
| 199 } |
| 200 |
192 gfx::Rect layer_rect = gfx::ToEnclosingRect( | 201 gfx::Rect layer_rect = gfx::ToEnclosingRect( |
193 gfx::ScaleRect(content_rect, 1.f / contents_scale)); | 202 gfx::ScaleRect(content_rect, 1.f / contents_scale)); |
194 | 203 |
| 204 SkBitmap emptyBitmap; |
| 205 emptyBitmap.setConfig(SkBitmap::kNo_Config, content_rect.width(), |
| 206 content_rect.height()); |
| 207 skia::AnalysisDevice device(emptyBitmap); |
| 208 skia::AnalysisCanvas canvas(&device); |
| 209 |
| 210 canvas.translate(-content_rect.x(), -content_rect.y()); |
| 211 canvas.clipRect(gfx::RectToSkRect(content_rect)); |
| 212 |
| 213 Region unclipped(content_rect); |
| 214 bool determined_if_solid = false; |
| 215 bool determined_if_transparent = false; |
| 216 bool is_transparent_guess = false; |
| 217 bool cheap = true; |
195 for (TilingData::Iterator tile_iter(&tiling_, layer_rect); | 218 for (TilingData::Iterator tile_iter(&tiling_, layer_rect); |
196 tile_iter; ++tile_iter) { | 219 tile_iter; ++tile_iter) { |
197 PictureListMap::const_iterator map_iter = | 220 PictureListMap::iterator map_iter = |
198 picture_list_map_.find(tile_iter.index()); | 221 picture_list_map_.find(tile_iter.index()); |
199 if (map_iter == picture_list_map_.end()) | 222 if (map_iter == picture_list_map_.end()) |
200 continue; | 223 continue; |
| 224 PictureList& pic_list= map_iter->second; |
| 225 if (pic_list.empty()) |
| 226 continue; |
201 | 227 |
202 const PictureList& pic_list = map_iter->second; | 228 for (PictureList::reverse_iterator i = pic_list.rbegin(); |
203 for (PictureList::const_iterator i = pic_list.begin(); | 229 i != pic_list.rend(); ++i) { |
204 i != pic_list.end(); ++i) { | 230 gfx::Rect content_clip = gfx::ToEnclosedRect( |
205 if (!(*i)->LayerRect().Intersects(layer_rect) || !(*i)->HasRecording()) | 231 gfx::ScaleRect((*i)->LayerRect(), contents_scale)); |
| 232 if (!unclipped.Intersects(content_clip)) |
206 continue; | 233 continue; |
207 if (!(*i)->IsCheapInRect(layer_rect)) | 234 |
208 return false; | 235 bool is_picture_solid; |
| 236 SkColor solid_color; |
| 237 bool is_picture_transparent; |
| 238 bool is_picture_cheap; |
| 239 (*i)->AnalyzeInRect(&canvas, |
| 240 content_clip, |
| 241 contents_scale, |
| 242 &is_picture_solid, |
| 243 &solid_color, |
| 244 &is_picture_transparent, |
| 245 &is_picture_cheap); |
| 246 if (!determined_if_solid) { |
| 247 determined_if_solid = true; |
| 248 analysis_.is_solid_color_ = is_picture_solid; |
| 249 analysis_.solid_color_ = solid_color; |
| 250 } |
| 251 else { |
| 252 analysis_.is_solid_color_ = false; |
| 253 } |
| 254 |
| 255 if (is_picture_transparent) |
| 256 is_transparent_guess = true; |
| 257 else { |
| 258 analysis_.is_transparent_ = false; |
| 259 determined_if_transparent = true; |
| 260 } |
| 261 |
| 262 if (cheap) |
| 263 cheap = is_picture_cheap; |
| 264 |
| 265 // Don't allow pictures underneath to draw where this picture did. |
| 266 canvas.clipRect( |
| 267 gfx::RectToSkRect(content_clip), |
| 268 SkRegion::kDifference_Op); |
| 269 unclipped.Subtract(content_clip); |
209 } | 270 } |
210 } | 271 } |
211 return true; | 272 |
| 273 if (!determined_if_solid) |
| 274 analysis_.is_solid_color_ = false; |
| 275 if (!determined_if_transparent) |
| 276 analysis_.is_transparent_ = is_transparent_guess; |
| 277 analysis_.is_cheap_ = cheap; |
| 278 analysis_.is_analyzed_ = true; |
| 279 analysis_.analyzed_content_rect_ = content_rect; |
| 280 analysis_.analyzed_contents_scale_ = contents_scale; |
212 } | 281 } |
213 | 282 |
| 283 bool PicturePileImpl::GetColorIfSolidInRect(const gfx::Rect& content_rect, |
| 284 float contents_scale, |
| 285 SkColor* color) { |
| 286 AnalyzeInRect(content_rect, contents_scale); |
| 287 DCHECK(analysis_.is_analyzed_); |
| 288 *color = analysis_.solid_color_; |
| 289 return analysis_.is_solid_color_; |
| 290 } |
| 291 |
| 292 bool PicturePileImpl::IsCheapInRect(const gfx::Rect& content_rect, |
| 293 float contents_scale) { |
| 294 AnalyzeInRect(content_rect, contents_scale); |
| 295 DCHECK(analysis_.is_analyzed_); |
| 296 return analysis_.is_cheap_; |
| 297 } |
| 298 |
| 299 bool PicturePileImpl::IsTransparentInRect(const gfx::Rect& content_rect, |
| 300 float contents_scale) { |
| 301 AnalyzeInRect(content_rect, contents_scale); |
| 302 DCHECK(analysis_.is_analyzed_); |
| 303 return analysis_.is_transparent_; |
| 304 } |
| 305 |
| 306 PicturePileImpl::Analysis::Analysis() |
| 307 : is_analyzed_(false) {} |
| 308 |
214 } // namespace cc | 309 } // namespace cc |
OLD | NEW |