Commit e78fb732 authored by Mike Reed's avatar Mike Reed Committed by Commit Bot

SkPixelSerializer is deprecated, update call-sites

Skia's default serialization behavior is to encode "bare" images via PNG.
For these utilities, we can just rely on that (except in the case of the
command-line option).

Bug: 
Cq-Include-Trybots: master.tryserver.blink:linux_trusty_blink_rel;master.tryserver.chromium.android:android_optional_gpu_tests_rel
Change-Id: I439786209a59d5604a53d362e64703af430a8056
Reviewed-on: https://chromium-review.googlesource.com/824443Reviewed-by: default avatarFlorin Malita <fmalita@chromium.org>
Reviewed-by: default avatarvmpstr <vmpstr@chromium.org>
Commit-Queue: Mike Reed <reed@chromium.org>
Cr-Commit-Position: refs/heads/master@{#523826}
parent b48592c0
...@@ -12,65 +12,19 @@ ...@@ -12,65 +12,19 @@
#include "base/base64.h" #include "base/base64.h"
#include "base/logging.h" #include "base/logging.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "third_party/skia/include/core/SkData.h" #include "third_party/skia/include/core/SkData.h"
#include "third_party/skia/include/core/SkImageInfo.h"
#include "third_party/skia/include/core/SkPicture.h" #include "third_party/skia/include/core/SkPicture.h"
#include "third_party/skia/include/core/SkPixelSerializer.h"
#include "third_party/skia/include/core/SkStream.h"
#include "ui/gfx/codec/jpeg_codec.h" #include "ui/gfx/codec/jpeg_codec.h"
#include "ui/gfx/codec/png_codec.h" #include "ui/gfx/codec/png_codec.h"
namespace {
class BitmapSerializer : public SkPixelSerializer {
protected:
bool onUseEncodedData(const void* data, size_t len) override { return true; }
SkData* onEncode(const SkPixmap& pixmap) override {
std::vector<unsigned char> data;
// If bitmap is opaque, encode as JPEG.
// Otherwise encode as PNG.
bool encoding_succeeded = false;
if (pixmap.isOpaque()) {
constexpr int kJpegQuality = 80;
encoding_succeeded = gfx::JPEGCodec::Encode(pixmap, kJpegQuality, &data);
} else {
const SkImageInfo& info = pixmap.info();
const void* pixels = pixmap.addr();
size_t row_bytes = pixmap.rowBytes();
SkBitmap bm;
// The cast is ok, since we only read the bm.
if (!bm.installPixels(info, const_cast<void*>(pixels), row_bytes)) {
return nullptr;
}
encoding_succeeded = gfx::PNGCodec::EncodeBGRASkBitmap(bm, false, &data);
}
if (encoding_succeeded) {
return SkData::MakeWithCopy(&data.front(), data.size()).release();
}
return nullptr;
}
};
} // namespace
namespace cc { namespace cc {
void PictureDebugUtil::SerializeAsBase64(const SkPicture* picture, void PictureDebugUtil::SerializeAsBase64(const SkPicture* picture,
std::string* output) { std::string* output) {
SkDynamicMemoryWStream stream; sk_sp<SkData> data = picture->serialize();
BitmapSerializer serializer;
picture->serialize(&stream, &serializer);
size_t serialized_size = stream.bytesWritten();
std::unique_ptr<char[]> serialized_picture(new char[serialized_size]);
stream.copyTo(serialized_picture.get());
base::Base64Encode( base::Base64Encode(
base::StringPiece(serialized_picture.get(), serialized_size), output); base::StringPiece(static_cast<const char*>(data->data()), data->size()),
output);
} }
} // namespace cc } // namespace cc
...@@ -54,14 +54,12 @@ ...@@ -54,14 +54,12 @@
#include "third_party/skia/include/core/SkGraphics.h" #include "third_party/skia/include/core/SkGraphics.h"
#include "third_party/skia/include/core/SkPicture.h" #include "third_party/skia/include/core/SkPicture.h"
#include "third_party/skia/include/core/SkPictureRecorder.h" #include "third_party/skia/include/core/SkPictureRecorder.h"
#include "third_party/skia/include/core/SkPixelRef.h" #include "third_party/skia/include/core/SkSerialProcs.h"
#include "third_party/skia/include/core/SkPixelSerializer.h"
#include "third_party/skia/include/core/SkStream.h" #include "third_party/skia/include/core/SkStream.h"
// Note that headers in third_party/skia/src are fragile. This is // Note that headers in third_party/skia/src are fragile. This is
// an experimental, fragile, and diagnostic-only document type. // an experimental, fragile, and diagnostic-only document type.
#include "third_party/skia/src/utils/SkMultiPictureDocument.h" #include "third_party/skia/src/utils/SkMultiPictureDocument.h"
#include "ui/events/base_event_utils.h" #include "ui/events/base_event_utils.h"
#include "ui/gfx/codec/png_codec.h"
#include "v8/include/v8.h" #include "v8/include/v8.h"
#if defined(OS_WIN) && !defined(NDEBUG) #if defined(OS_WIN) && !defined(NDEBUG)
...@@ -80,59 +78,6 @@ using blink::WebView; ...@@ -80,59 +78,6 @@ using blink::WebView;
namespace content { namespace content {
namespace { namespace {
class EncodingSerializer : public SkPixelSerializer {
protected:
bool onUseEncodedData(const void* data, size_t len) override { return true; }
SkData* onEncode(const SkPixmap& pixmap) override {
std::vector<uint8_t> vector;
const base::CommandLine& commandLine =
*base::CommandLine::ForCurrentProcess();
if (commandLine.HasSwitch(switches::kSkipReencodingOnSKPCapture)) {
// In this case, we just want to store some useful information
// about the image to replace the missing encoded data.
// First make sure that the data does not accidentally match any
// image signatures.
vector.push_back(0xFF);
vector.push_back(0xFF);
vector.push_back(0xFF);
vector.push_back(0xFF);
// Save the width and height.
uint32_t width = pixmap.width();
uint32_t height = pixmap.height();
vector.push_back(width & 0xFF);
vector.push_back((width >> 8) & 0xFF);
vector.push_back((width >> 16) & 0xFF);
vector.push_back((width >> 24) & 0xFF);
vector.push_back(height & 0xFF);
vector.push_back((height >> 8) & 0xFF);
vector.push_back((height >> 16) & 0xFF);
vector.push_back((height >> 24) & 0xFF);
// Save any additional information about the bitmap that may be
// interesting.
vector.push_back(pixmap.colorType());
vector.push_back(pixmap.alphaType());
return SkData::MakeWithCopy(&vector.front(), vector.size()).release();
} else {
SkBitmap bm;
// The const_cast is fine, since we only read from the bitmap.
if (bm.installPixels(pixmap.info(),
const_cast<void*>(pixmap.addr()),
pixmap.rowBytes())) {
if (gfx::PNGCodec::EncodeBGRASkBitmap(bm, false, &vector)) {
return SkData::MakeWithCopy(&vector.front(), vector.size()).release();
}
}
}
return nullptr;
}
};
class SkPictureSerializer { class SkPictureSerializer {
public: public:
explicit SkPictureSerializer(const base::FilePath& dirpath) explicit SkPictureSerializer(const base::FilePath& dirpath)
...@@ -163,8 +108,21 @@ class SkPictureSerializer { ...@@ -163,8 +108,21 @@ class SkPictureSerializer {
SkFILEWStream file(filepath.c_str()); SkFILEWStream file(filepath.c_str());
DCHECK(file.isValid()); DCHECK(file.isValid());
EncodingSerializer serializer; SkSerialProcs procs;
picture->serialize(&file, &serializer); procs.fImageProc = [](SkImage* image, void*) {
auto data = image->refEncodedData();
if (!data) {
const base::CommandLine& commandLine =
*base::CommandLine::ForCurrentProcess();
if (commandLine.HasSwitch(switches::kSkipReencodingOnSKPCapture)) {
data = SkData::MakeEmpty();
}
// else data is null, which triggers skia's default PNG encode
}
return data;
};
auto data = picture->serialize(procs);
file.write(data->data(), data->size());
file.fsync(); file.fsync();
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment