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

Unified Diff: cc/resources/picture.cc

Issue 802533005: use new PixelSerializer API, remove legacy flag (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years 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 side-by-side diff with in-line comments
Download patch
Index: cc/resources/picture.cc
diff --git a/cc/resources/picture.cc b/cc/resources/picture.cc
index 64f29e4cfacb52c2fbd99a3d239fbc278832118c..a9e7a8b12fd8040459ef09f4c6f4a11ec7cccfc7 100644
--- a/cc/resources/picture.cc
+++ b/cc/resources/picture.cc
@@ -23,6 +23,7 @@
#include "third_party/skia/include/core/SkData.h"
#include "third_party/skia/include/core/SkPaint.h"
#include "third_party/skia/include/core/SkPictureRecorder.h"
+#include "third_party/skia/include/core/SkPixelSerializer.h"
#include "third_party/skia/include/core/SkStream.h"
#include "third_party/skia/include/utils/SkNullCanvas.h"
#include "third_party/skia/include/utils/SkPictureUtils.h"
@@ -35,36 +36,44 @@ namespace cc {
namespace {
-SkData* EncodeBitmap(size_t* offset, const SkBitmap& bm) {
- const int kJpegQuality = 80;
- std::vector<unsigned char> data;
-
- // If bitmap is opaque, encode as JPEG.
- // Otherwise encode as PNG.
- bool encoding_succeeded = false;
- if (bm.isOpaque()) {
- SkAutoLockPixels lock_bitmap(bm);
- if (bm.empty())
- return NULL;
-
- encoding_succeeded = gfx::JPEGCodec::Encode(
- reinterpret_cast<unsigned char*>(bm.getAddr32(0, 0)),
- gfx::JPEGCodec::FORMAT_SkBitmap,
- bm.width(),
- bm.height(),
- bm.rowBytes(),
- kJpegQuality,
- &data);
- } else {
- encoding_succeeded = gfx::PNGCodec::EncodeBGRASkBitmap(bm, false, &data);
+class BitmapSerializer : public SkPixelSerializer {
+ protected:
+ bool onUseEncodedData(const void* data, size_t len) override {
+ // For now, always force our onEncodePixels by returning false.
+ // If we have way to sniff the data to see that it is already PNG or JPEG
+ // we could return true to skip re-encoding it.
+ return false;
scroggo 2014/12/19 20:02:18 This is a change in behavior. The old SkWriteBuffe
enne (OOO) 2014/12/19 21:15:13 If this can be done better, that'd be nice, but th
reed1 2014/12/19 21:30:01 Done.
reed1 2014/12/19 21:30:02 Acknowledged.
}
- if (encoding_succeeded) {
- *offset = 0;
- return SkData::NewWithCopy(&data.front(), data.size());
+ SkData* onEncodePixels(const SkImageInfo& info,
+ void* pixels,
scroggo 2014/12/19 20:02:18 Once https://codereview.chromium.org/788143007/ la
reed1 2014/12/19 21:30:02 Acknowledged.
+ size_t rowBytes) override {
enne (OOO) 2014/12/19 21:15:13 row_bytes
reed1 2014/12/19 21:30:01 Done.
+ const int kJpegQuality = 80;
+ std::vector<unsigned char> data;
+
+ // If bitmap is opaque, encode as JPEG.
+ // Otherwise encode as PNG.
+ bool encoding_succeeded = false;
+ if (info.isOpaque()) {
+ encoding_succeeded =
+ gfx::JPEGCodec::Encode(reinterpret_cast<unsigned char*>(pixels),
+ gfx::JPEGCodec::FORMAT_SkBitmap, info.width(),
+ info.height(), rowBytes, kJpegQuality, &data);
+ } else {
+ SkBitmap bm;
+ // The cast is ok, since we only read the bm.
+ if (!bm.installPixels(info, const_cast<void*>(pixels), rowBytes)) {
+ return NULL;
enne (OOO) 2014/12/19 21:15:13 nullptr
reed1 2014/12/19 21:30:02 Done.
+ }
+ encoding_succeeded = gfx::PNGCodec::EncodeBGRASkBitmap(bm, false, &data);
+ }
+
+ if (encoding_succeeded) {
+ return SkData::NewWithCopy(&data.front(), data.size());
+ }
+ return NULL;
}
- return NULL;
-}
+};
bool DecodeBitmap(const void* buffer, size_t size, SkBitmap* bm) {
const unsigned char* data = static_cast<const unsigned char *>(buffer);
@@ -367,7 +376,8 @@ void Picture::Replay(SkCanvas* canvas) {
scoped_ptr<base::Value> Picture::AsValue() const {
SkDynamicMemoryWStream stream;
- picture_->serialize(&stream, &EncodeBitmap);
+ BitmapSerializer serializer;
+ picture_->serialize(&stream, &serializer);
// Encode the picture as base64.
scoped_ptr<base::DictionaryValue> res(new base::DictionaryValue());
« no previous file with comments | « no previous file | content/renderer/gpu/gpu_benchmarking_extension.cc » ('j') | content/renderer/gpu/gpu_benchmarking_extension.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698