Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(62)

Side by Side Diff: cc/resources/picture.cc

Issue 851503003: Update from https://crrev.com/311076 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/resources/drawing_display_item.cc ('k') | cc/resources/picture_layer_tiling.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/traced_picture.h" 18 #include "cc/debug/traced_picture.h"
18 #include "cc/debug/traced_value.h" 19 #include "cc/debug/traced_value.h"
19 #include "cc/layers/content_layer_client.h" 20 #include "cc/layers/content_layer_client.h"
20 #include "skia/ext/pixel_ref_utils.h" 21 #include "skia/ext/pixel_ref_utils.h"
21 #include "third_party/skia/include/core/SkBBHFactory.h" 22 #include "third_party/skia/include/core/SkBBHFactory.h"
22 #include "third_party/skia/include/core/SkCanvas.h" 23 #include "third_party/skia/include/core/SkCanvas.h"
23 #include "third_party/skia/include/core/SkData.h"
24 #include "third_party/skia/include/core/SkDrawPictureCallback.h" 24 #include "third_party/skia/include/core/SkDrawPictureCallback.h"
25 #include "third_party/skia/include/core/SkPaint.h" 25 #include "third_party/skia/include/core/SkPaint.h"
26 #include "third_party/skia/include/core/SkPictureRecorder.h" 26 #include "third_party/skia/include/core/SkPictureRecorder.h"
27 #include "third_party/skia/include/core/SkPixelSerializer.h"
28 #include "third_party/skia/include/core/SkStream.h" 27 #include "third_party/skia/include/core/SkStream.h"
29 #include "third_party/skia/include/utils/SkNullCanvas.h" 28 #include "third_party/skia/include/utils/SkNullCanvas.h"
30 #include "third_party/skia/include/utils/SkPictureUtils.h" 29 #include "third_party/skia/include/utils/SkPictureUtils.h"
31 #include "ui/gfx/codec/jpeg_codec.h" 30 #include "ui/gfx/codec/jpeg_codec.h"
32 #include "ui/gfx/codec/png_codec.h" 31 #include "ui/gfx/codec/png_codec.h"
33 #include "ui/gfx/geometry/rect_conversions.h" 32 #include "ui/gfx/geometry/rect_conversions.h"
34 #include "ui/gfx/skia_util.h" 33 #include "ui/gfx/skia_util.h"
35 34
36 namespace cc { 35 namespace cc {
37 36
38 namespace { 37 namespace {
39 38
40 class BitmapSerializer : public SkPixelSerializer {
41 protected:
42 bool onUseEncodedData(const void* data, size_t len) override { return true; }
43
44 SkData* onEncodePixels(const SkImageInfo& info,
45 const void* pixels,
46 size_t row_bytes) override {
47 const int kJpegQuality = 80;
48 std::vector<unsigned char> data;
49
50 // If bitmap is opaque, encode as JPEG.
51 // Otherwise encode as PNG.
52 bool encoding_succeeded = false;
53 if (info.isOpaque()) {
54 encoding_succeeded =
55 gfx::JPEGCodec::Encode(reinterpret_cast<const unsigned char*>(pixels),
56 gfx::JPEGCodec::FORMAT_SkBitmap, info.width(),
57 info.height(), row_bytes, kJpegQuality, &data);
58 } else {
59 SkBitmap bm;
60 // The cast is ok, since we only read the bm.
61 if (!bm.installPixels(info, const_cast<void*>(pixels), row_bytes)) {
62 return nullptr;
63 }
64 encoding_succeeded = gfx::PNGCodec::EncodeBGRASkBitmap(bm, false, &data);
65 }
66
67 if (encoding_succeeded) {
68 return SkData::NewWithCopy(&data.front(), data.size());
69 }
70 return nullptr;
71 }
72 };
73
74 bool DecodeBitmap(const void* buffer, size_t size, SkBitmap* bm) { 39 bool DecodeBitmap(const void* buffer, size_t size, SkBitmap* bm) {
75 const unsigned char* data = static_cast<const unsigned char *>(buffer); 40 const unsigned char* data = static_cast<const unsigned char *>(buffer);
76 41
77 // Try PNG first. 42 // Try PNG first.
78 if (gfx::PNGCodec::Decode(data, size, bm)) 43 if (gfx::PNGCodec::Decode(data, size, bm))
79 return true; 44 return true;
80 45
81 // Try JPEG. 46 // Try JPEG.
82 scoped_ptr<SkBitmap> decoded_jpeg(gfx::JPEGCodec::Decode(data, size)); 47 scoped_ptr<SkBitmap> decoded_jpeg(gfx::JPEGCodec::Decode(data, size));
83 if (decoded_jpeg) { 48 if (decoded_jpeg) {
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 const gfx::Rect& layer_rect, 135 const gfx::Rect& layer_rect,
171 const PixelRefMap& pixel_refs) : 136 const PixelRefMap& pixel_refs) :
172 layer_rect_(layer_rect), 137 layer_rect_(layer_rect),
173 picture_(picture), 138 picture_(picture),
174 pixel_refs_(pixel_refs), 139 pixel_refs_(pixel_refs),
175 cell_size_(layer_rect.size()) { 140 cell_size_(layer_rect.size()) {
176 } 141 }
177 142
178 Picture::~Picture() { 143 Picture::~Picture() {
179 TRACE_EVENT_OBJECT_DELETED_WITH_ID( 144 TRACE_EVENT_OBJECT_DELETED_WITH_ID(
180 TRACE_DISABLED_BY_DEFAULT("cc.debug"), "cc::Picture", this); 145 TRACE_DISABLED_BY_DEFAULT("cc.debug.picture"), "cc::Picture", this);
181 } 146 }
182 147
183 bool Picture::IsSuitableForGpuRasterization(const char** reason) const { 148 bool Picture::IsSuitableForGpuRasterization(const char** reason) const {
184 DCHECK(picture_); 149 DCHECK(picture_);
185 150
186 // TODO(hendrikw): SkPicture::suitableForGpuRasterization takes a GrContext. 151 // TODO(hendrikw): SkPicture::suitableForGpuRasterization takes a GrContext.
187 // Currently the GrContext isn't used, and should probably be removed from 152 // Currently the GrContext isn't used, and should probably be removed from
188 // skia. 153 // skia.
189 return picture_->suitableForGpuRasterization(nullptr, reason); 154 return picture_->suitableForGpuRasterization(nullptr, reason);
190 } 155 }
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 TRACE_EVENT_BEGIN0("cc", "Picture::Replay"); 329 TRACE_EVENT_BEGIN0("cc", "Picture::Replay");
365 DCHECK(picture_); 330 DCHECK(picture_);
366 picture_->playback(canvas); 331 picture_->playback(canvas);
367 SkIRect bounds; 332 SkIRect bounds;
368 canvas->getClipDeviceBounds(&bounds); 333 canvas->getClipDeviceBounds(&bounds);
369 TRACE_EVENT_END1("cc", "Picture::Replay", 334 TRACE_EVENT_END1("cc", "Picture::Replay",
370 "num_pixels_replayed", bounds.width() * bounds.height()); 335 "num_pixels_replayed", bounds.width() * bounds.height());
371 } 336 }
372 337
373 scoped_ptr<base::Value> Picture::AsValue() const { 338 scoped_ptr<base::Value> Picture::AsValue() const {
374 SkDynamicMemoryWStream stream;
375 BitmapSerializer serializer;
376 picture_->serialize(&stream, &serializer);
377
378 // Encode the picture as base64. 339 // Encode the picture as base64.
379 scoped_ptr<base::DictionaryValue> res(new base::DictionaryValue()); 340 scoped_ptr<base::DictionaryValue> res(new base::DictionaryValue());
380 res->Set("params.layer_rect", MathUtil::AsValue(layer_rect_).release()); 341 res->Set("params.layer_rect", MathUtil::AsValue(layer_rect_).release());
381
382 size_t serialized_size = stream.bytesWritten();
383 scoped_ptr<char[]> serialized_picture(new char[serialized_size]);
384 stream.copyTo(serialized_picture.get());
385 std::string b64_picture; 342 std::string b64_picture;
386 base::Base64Encode(std::string(serialized_picture.get(), serialized_size), 343 PictureDebugUtil::SerializeAsBase64(picture_.get(), &b64_picture);
387 &b64_picture);
388 res->SetString("skp64", b64_picture); 344 res->SetString("skp64", b64_picture);
389 return res.Pass(); 345 return res.Pass();
390 } 346 }
391 347
392 void Picture::EmitTraceSnapshot() const { 348 void Picture::EmitTraceSnapshot() const {
393 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID( 349 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(
394 TRACE_DISABLED_BY_DEFAULT("cc.debug") "," TRACE_DISABLED_BY_DEFAULT( 350 TRACE_DISABLED_BY_DEFAULT("cc.debug.picture") ","
395 "devtools.timeline.picture"), 351 TRACE_DISABLED_BY_DEFAULT("devtools.timeline.picture"),
396 "cc::Picture", 352 "cc::Picture",
397 this, 353 this,
398 TracedPicture::AsTraceablePicture(this)); 354 TracedPicture::AsTraceablePicture(this));
399 } 355 }
400 356
401 void Picture::EmitTraceSnapshotAlias(Picture* original) const { 357 void Picture::EmitTraceSnapshotAlias(Picture* original) const {
402 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID( 358 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(
403 TRACE_DISABLED_BY_DEFAULT("cc.debug") "," TRACE_DISABLED_BY_DEFAULT( 359 TRACE_DISABLED_BY_DEFAULT("cc.debug.picture") ","
404 "devtools.timeline.picture"), 360 TRACE_DISABLED_BY_DEFAULT("devtools.timeline.picture"),
405 "cc::Picture", 361 "cc::Picture",
406 this, 362 this,
407 TracedPicture::AsTraceablePictureAlias(original)); 363 TracedPicture::AsTraceablePictureAlias(original));
408 } 364 }
409 365
410 base::LazyInstance<Picture::PixelRefs> 366 base::LazyInstance<Picture::PixelRefs>
411 Picture::PixelRefIterator::empty_pixel_refs_; 367 Picture::PixelRefIterator::empty_pixel_refs_;
412 368
413 Picture::PixelRefIterator::PixelRefIterator() 369 Picture::PixelRefIterator::PixelRefIterator()
414 : picture_(NULL), 370 : picture_(NULL),
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
521 scoped_refptr<base::debug::TracedValue> record_data = 477 scoped_refptr<base::debug::TracedValue> record_data =
522 new base::debug::TracedValue(); 478 new base::debug::TracedValue();
523 TracedValue::SetIDRef(this, record_data.get(), "picture_id"); 479 TracedValue::SetIDRef(this, record_data.get(), "picture_id");
524 record_data->BeginArray("layer_rect"); 480 record_data->BeginArray("layer_rect");
525 MathUtil::AddToTracedValue(layer_rect_, record_data.get()); 481 MathUtil::AddToTracedValue(layer_rect_, record_data.get());
526 record_data->EndArray(); 482 record_data->EndArray();
527 return record_data; 483 return record_data;
528 } 484 }
529 485
530 } // namespace cc 486 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/drawing_display_item.cc ('k') | cc/resources/picture_layer_tiling.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698