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 "cc/resources/picture.h" | 5 #include "cc/resources/picture.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <limits> | 8 #include <limits> |
9 #include <set> | 9 #include <set> |
10 | 10 |
11 #include "base/base64.h" | 11 #include "base/base64.h" |
12 #include "base/debug/trace_event.h" | 12 #include "base/debug/trace_event.h" |
13 #include "base/debug/trace_event_argument.h" | 13 #include "base/debug/trace_event_argument.h" |
14 #include "base/values.h" | 14 #include "base/values.h" |
15 #include "cc/base/math_util.h" | 15 #include "cc/base/math_util.h" |
16 #include "cc/base/util.h" | 16 #include "cc/base/util.h" |
17 #include "cc/debug/picture_debug_util.h" | 17 #include "cc/debug/picture_debug_util.h" |
18 #include "cc/debug/traced_picture.h" | 18 #include "cc/debug/traced_picture.h" |
19 #include "cc/debug/traced_value.h" | 19 #include "cc/debug/traced_value.h" |
20 #include "cc/layers/content_layer_client.h" | 20 #include "cc/layers/content_layer_client.h" |
21 #include "skia/ext/pixel_ref_utils.h" | 21 #include "skia/ext/pixel_ref_utils.h" |
22 #include "third_party/skia/include/core/SkBBHFactory.h" | |
23 #include "third_party/skia/include/core/SkCanvas.h" | 22 #include "third_party/skia/include/core/SkCanvas.h" |
24 #include "third_party/skia/include/core/SkDrawPictureCallback.h" | 23 #include "third_party/skia/include/core/SkDrawPictureCallback.h" |
25 #include "third_party/skia/include/core/SkPaint.h" | 24 #include "third_party/skia/include/core/SkPaint.h" |
26 #include "third_party/skia/include/core/SkPictureRecorder.h" | 25 #include "third_party/skia/include/core/SkPictureRecorder.h" |
27 #include "third_party/skia/include/core/SkStream.h" | 26 #include "third_party/skia/include/core/SkStream.h" |
28 #include "third_party/skia/include/utils/SkNullCanvas.h" | 27 #include "third_party/skia/include/utils/SkNullCanvas.h" |
29 #include "third_party/skia/include/utils/SkPictureUtils.h" | 28 #include "third_party/skia/include/utils/SkPictureUtils.h" |
30 #include "ui/gfx/codec/jpeg_codec.h" | 29 #include "ui/gfx/codec/jpeg_codec.h" |
31 #include "ui/gfx/codec/png_codec.h" | 30 #include "ui/gfx/codec/png_codec.h" |
32 #include "ui/gfx/geometry/rect_conversions.h" | 31 #include "ui/gfx/geometry/rect_conversions.h" |
(...skipping 14 matching lines...) Expand all Loading... |
47 scoped_ptr<SkBitmap> decoded_jpeg(gfx::JPEGCodec::Decode(data, size)); | 46 scoped_ptr<SkBitmap> decoded_jpeg(gfx::JPEGCodec::Decode(data, size)); |
48 if (decoded_jpeg) { | 47 if (decoded_jpeg) { |
49 *bm = *decoded_jpeg; | 48 *bm = *decoded_jpeg; |
50 return true; | 49 return true; |
51 } | 50 } |
52 return false; | 51 return false; |
53 } | 52 } |
54 | 53 |
55 } // namespace | 54 } // namespace |
56 | 55 |
57 scoped_refptr<Picture> Picture::Create( | 56 scoped_refptr<Picture> Picture::Create(const gfx::Rect& layer_rect, |
58 const gfx::Rect& layer_rect, | 57 ContentLayerClient* client, |
59 ContentLayerClient* client, | 58 const gfx::Size& tile_grid_size, |
60 const SkTileGridFactory::TileGridInfo& tile_grid_info, | 59 bool gather_pixel_refs, |
61 bool gather_pixel_refs, | 60 RecordingMode recording_mode) { |
62 RecordingMode recording_mode) { | |
63 scoped_refptr<Picture> picture = make_scoped_refptr(new Picture(layer_rect)); | 61 scoped_refptr<Picture> picture = make_scoped_refptr(new Picture(layer_rect)); |
64 | 62 |
65 picture->Record(client, tile_grid_info, recording_mode); | 63 picture->Record(client, tile_grid_size, recording_mode); |
66 if (gather_pixel_refs) | 64 if (gather_pixel_refs) |
67 picture->GatherPixelRefs(tile_grid_info); | 65 picture->GatherPixelRefs(tile_grid_size); |
68 | 66 |
69 return picture; | 67 return picture; |
70 } | 68 } |
71 | 69 |
72 Picture::Picture(const gfx::Rect& layer_rect) | 70 Picture::Picture(const gfx::Rect& layer_rect) |
73 : layer_rect_(layer_rect), | 71 : layer_rect_(layer_rect), |
74 cell_size_(layer_rect.size()) { | 72 cell_size_(layer_rect.size()) { |
75 // Instead of recording a trace event for object creation here, we wait for | 73 // Instead of recording a trace event for object creation here, we wait for |
76 // the picture to be recorded in Picture::Record. | 74 // the picture to be recorded in Picture::Record. |
77 } | 75 } |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
163 DCHECK(picture_); | 161 DCHECK(picture_); |
164 return SkPictureUtils::ApproximateBytesUsed(picture_.get()); | 162 return SkPictureUtils::ApproximateBytesUsed(picture_.get()); |
165 } | 163 } |
166 | 164 |
167 bool Picture::HasText() const { | 165 bool Picture::HasText() const { |
168 DCHECK(picture_); | 166 DCHECK(picture_); |
169 return picture_->hasText(); | 167 return picture_->hasText(); |
170 } | 168 } |
171 | 169 |
172 void Picture::Record(ContentLayerClient* painter, | 170 void Picture::Record(ContentLayerClient* painter, |
173 const SkTileGridFactory::TileGridInfo& tile_grid_info, | 171 const gfx::Size& tile_grid_size, |
174 RecordingMode recording_mode) { | 172 RecordingMode recording_mode) { |
175 TRACE_EVENT2("cc", | 173 TRACE_EVENT2("cc", |
176 "Picture::Record", | 174 "Picture::Record", |
177 "data", | 175 "data", |
178 AsTraceableRecordData(), | 176 AsTraceableRecordData(), |
179 "recording_mode", | 177 "recording_mode", |
180 recording_mode); | 178 recording_mode); |
181 | 179 |
182 DCHECK(!picture_); | 180 DCHECK(!picture_); |
183 DCHECK(!tile_grid_info.fTileInterval.isEmpty()); | 181 DCHECK(!tile_grid_size.IsEmpty()); |
184 | 182 |
185 // TODO(mtklein): If SkRTree sticks, clean up tile_grid_info. skbug.com/3085 | 183 // TODO(mtklein): If SkRTree sticks, clean up tile_grid_info. skbug.com/3085 |
186 SkRTreeFactory factory; | 184 SkRTreeFactory factory; |
187 SkPictureRecorder recorder; | 185 SkPictureRecorder recorder; |
188 | 186 |
189 skia::RefPtr<SkCanvas> canvas; | 187 skia::RefPtr<SkCanvas> canvas; |
190 canvas = skia::SharePtr(recorder.beginRecording( | 188 canvas = skia::SharePtr(recorder.beginRecording( |
191 layer_rect_.width(), layer_rect_.height(), &factory, | 189 layer_rect_.width(), layer_rect_.height(), &factory, |
192 SkPictureRecorder::kComputeSaveLayerInfo_RecordFlag)); | 190 SkPictureRecorder::kComputeSaveLayerInfo_RecordFlag)); |
193 | 191 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
225 | 223 |
226 painter->PaintContents(canvas.get(), layer_rect_, graphics_context_status); | 224 painter->PaintContents(canvas.get(), layer_rect_, graphics_context_status); |
227 | 225 |
228 canvas->restore(); | 226 canvas->restore(); |
229 picture_ = skia::AdoptRef(recorder.endRecording()); | 227 picture_ = skia::AdoptRef(recorder.endRecording()); |
230 DCHECK(picture_); | 228 DCHECK(picture_); |
231 | 229 |
232 EmitTraceSnapshot(); | 230 EmitTraceSnapshot(); |
233 } | 231 } |
234 | 232 |
235 void Picture::GatherPixelRefs( | 233 void Picture::GatherPixelRefs(const gfx::Size& tile_grid_size) { |
236 const SkTileGridFactory::TileGridInfo& tile_grid_info) { | |
237 TRACE_EVENT2("cc", "Picture::GatherPixelRefs", | 234 TRACE_EVENT2("cc", "Picture::GatherPixelRefs", |
238 "width", layer_rect_.width(), | 235 "width", layer_rect_.width(), |
239 "height", layer_rect_.height()); | 236 "height", layer_rect_.height()); |
240 | 237 |
241 DCHECK(picture_); | 238 DCHECK(picture_); |
242 DCHECK(pixel_refs_.empty()); | 239 DCHECK(pixel_refs_.empty()); |
243 if (!WillPlayBackBitmaps()) | 240 if (!WillPlayBackBitmaps()) |
244 return; | 241 return; |
245 cell_size_ = gfx::Size( | 242 cell_size_ = tile_grid_size; |
246 tile_grid_info.fTileInterval.width() + | |
247 2 * tile_grid_info.fMargin.width(), | |
248 tile_grid_info.fTileInterval.height() + | |
249 2 * tile_grid_info.fMargin.height()); | |
250 DCHECK_GT(cell_size_.width(), 0); | 243 DCHECK_GT(cell_size_.width(), 0); |
251 DCHECK_GT(cell_size_.height(), 0); | 244 DCHECK_GT(cell_size_.height(), 0); |
252 | 245 |
253 int min_x = std::numeric_limits<int>::max(); | 246 int min_x = std::numeric_limits<int>::max(); |
254 int min_y = std::numeric_limits<int>::max(); | 247 int min_y = std::numeric_limits<int>::max(); |
255 int max_x = 0; | 248 int max_x = 0; |
256 int max_y = 0; | 249 int max_y = 0; |
257 | 250 |
258 skia::DiscardablePixelRefList pixel_refs; | 251 skia::DiscardablePixelRefList pixel_refs; |
259 skia::PixelRefUtils::GatherDiscardablePixelRefs(picture_.get(), &pixel_refs); | 252 skia::PixelRefUtils::GatherDiscardablePixelRefs(picture_.get(), &pixel_refs); |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
470 TracedValue::SetIDRef(this, raster_data.get(), "picture_id"); | 463 TracedValue::SetIDRef(this, raster_data.get(), "picture_id"); |
471 raster_data->SetDouble("scale", scale); | 464 raster_data->SetDouble("scale", scale); |
472 return raster_data; | 465 return raster_data; |
473 } | 466 } |
474 | 467 |
475 scoped_refptr<base::debug::ConvertableToTraceFormat> | 468 scoped_refptr<base::debug::ConvertableToTraceFormat> |
476 Picture::AsTraceableRecordData() const { | 469 Picture::AsTraceableRecordData() const { |
477 scoped_refptr<base::debug::TracedValue> record_data = | 470 scoped_refptr<base::debug::TracedValue> record_data = |
478 new base::debug::TracedValue(); | 471 new base::debug::TracedValue(); |
479 TracedValue::SetIDRef(this, record_data.get(), "picture_id"); | 472 TracedValue::SetIDRef(this, record_data.get(), "picture_id"); |
480 record_data->BeginArray("layer_rect"); | 473 MathUtil::AddToTracedValue("layer_rect", layer_rect_, record_data.get()); |
481 MathUtil::AddToTracedValue(layer_rect_, record_data.get()); | |
482 record_data->EndArray(); | |
483 return record_data; | 474 return record_data; |
484 } | 475 } |
485 | 476 |
486 } // namespace cc | 477 } // namespace cc |
OLD | NEW |