Explicitly serialize SkImages to PNG when printing
Skia is changing the default behavior of SKP serialization. https://skia-review.googlesource.com/c/skia/+/759936 This preserves the existing functionality by explicitly encoding/decoding using the PNG codec. Bug: chromium:1485891 Change-Id: Id54c7935a667e936acd289d9bf1cca801ec5f07b Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4887593 Reviewed-by: Lei Zhang <thestig@chromium.org> Commit-Queue: Kevin Lubick <kjlubick@chromium.org> Cr-Commit-Position: refs/heads/main@{#1202603}
This commit is contained in:

committed by
Chromium LUCI CQ

parent
d4688331e4
commit
27953e9d3c
@ -4,22 +4,29 @@
|
||||
|
||||
#include "printing/common/metafile_utils.h"
|
||||
|
||||
#include "base/check.h"
|
||||
#include "base/strings/string_piece.h"
|
||||
#include "base/strings/stringprintf.h"
|
||||
#include "base/time/time.h"
|
||||
#include "printing/buildflags/buildflags.h"
|
||||
#include "third_party/skia/include/codec/SkPngDecoder.h"
|
||||
#include "third_party/skia/include/core/SkCanvas.h"
|
||||
#include "third_party/skia/include/core/SkImage.h"
|
||||
#include "third_party/skia/include/core/SkPicture.h"
|
||||
#include "third_party/skia/include/core/SkPictureRecorder.h"
|
||||
#include "third_party/skia/include/core/SkStream.h"
|
||||
#include "third_party/skia/include/core/SkString.h"
|
||||
#include "third_party/skia/include/core/SkTypeface.h"
|
||||
#include "third_party/skia/include/docs/SkPDFDocument.h"
|
||||
#include "third_party/skia/include/encode/SkPngEncoder.h"
|
||||
#include "third_party/skia/include/private/chromium/SkImageChromium.h"
|
||||
#include "ui/accessibility/ax_node.h"
|
||||
#include "ui/accessibility/ax_role_properties.h"
|
||||
#include "ui/accessibility/ax_tree.h"
|
||||
#include "ui/accessibility/ax_tree_update.h"
|
||||
|
||||
#include <variant>
|
||||
|
||||
namespace {
|
||||
|
||||
// Table 333 in PDF 32000-1:2008 spec, section 14.8.4.2
|
||||
@ -315,9 +322,32 @@ sk_sp<SkTypeface> DeserializeOopTypeface(const void* data,
|
||||
return typeface;
|
||||
}
|
||||
|
||||
sk_sp<SkData> SerializeRasterImage(SkImage* img, void*) {
|
||||
if (!img) {
|
||||
return nullptr;
|
||||
}
|
||||
// TODO(crbug.com/1486503)
|
||||
DUMP_WILL_BE_CHECK(!img->isTextureBacked());
|
||||
if (img->isTextureBacked()) {
|
||||
GrDirectContext* ctx = SkImages::GetContext(img);
|
||||
return SkPngEncoder::Encode(ctx, img, SkPngEncoder::Options{});
|
||||
}
|
||||
return SkPngEncoder::Encode(nullptr, img, SkPngEncoder::Options{});
|
||||
}
|
||||
|
||||
sk_sp<SkImage> DeserializeRasterImage(const void* bytes, size_t length, void*) {
|
||||
auto data = SkData::MakeWithoutCopy(bytes, length);
|
||||
auto codec = SkPngDecoder::Decode(data, nullptr);
|
||||
if (codec) {
|
||||
return std::get<0>(codec->getImage());
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
SkSerialProcs SerializationProcs(PictureSerializationContext* picture_ctx,
|
||||
TypefaceSerializationContext* typeface_ctx) {
|
||||
SkSerialProcs procs;
|
||||
procs.fImageProc = SerializeRasterImage;
|
||||
procs.fPictureProc = SerializeOopPicture;
|
||||
procs.fPictureCtx = picture_ctx;
|
||||
procs.fTypefaceProc = SerializeOopTypeface;
|
||||
@ -329,6 +359,7 @@ SkDeserialProcs DeserializationProcs(
|
||||
PictureDeserializationContext* picture_ctx,
|
||||
TypefaceDeserializationContext* typeface_ctx) {
|
||||
SkDeserialProcs procs;
|
||||
procs.fImageProc = DeserializeRasterImage;
|
||||
procs.fPictureProc = DeserializeOopPicture;
|
||||
procs.fPictureCtx = picture_ctx;
|
||||
procs.fTypefaceProc = DeserializeOopTypeface;
|
||||
|
Reference in New Issue
Block a user