diff options
-rw-r--r-- | debugger/QT/SkDebuggerGUI.cpp | 5 | ||||
-rw-r--r-- | include/core/SkImageEncoder.h | 8 | ||||
-rw-r--r-- | src/image/SkImage.cpp | 33 | ||||
-rw-r--r-- | src/images/SkImageEncoder.cpp | 33 | ||||
-rw-r--r-- | tests/PictureTest.cpp | 5 | ||||
-rw-r--r-- | tools/sk_tool_utils.h | 12 |
6 files changed, 43 insertions, 53 deletions
diff --git a/debugger/QT/SkDebuggerGUI.cpp b/debugger/QT/SkDebuggerGUI.cpp index 0d009b3ffa..4422334496 100644 --- a/debugger/QT/SkDebuggerGUI.cpp +++ b/debugger/QT/SkDebuggerGUI.cpp @@ -281,9 +281,8 @@ void SkDebuggerGUI::saveToFile(const SkString& filename) { SkFILEWStream file(filename.c_str()); SkAutoTUnref<SkPicture> copy(fDebugger.copyPicture()); - SkAutoTUnref<SkPixelSerializer> serializer( - SkImageEncoder::CreatePixelSerializer()); - copy->serialize(&file, serializer); + sk_tool_utils::PngPixelSerializer serializer; + copy->serialize(&file, &serializer); } void SkDebuggerGUI::loadFile(QListWidgetItem *item) { diff --git a/include/core/SkImageEncoder.h b/include/core/SkImageEncoder.h index bb3341f836..fc999dcc18 100644 --- a/include/core/SkImageEncoder.h +++ b/include/core/SkImageEncoder.h @@ -12,8 +12,6 @@ #include "SkTRegistry.h" class SkBitmap; -class SkPixelSerializer; -class SkPixmap; class SkData; class SkWStream; @@ -66,17 +64,11 @@ public: Type, int quality); static SkData* EncodeData(const SkBitmap&, Type, int quality); - static SkData* EncodeData(const SkPixmap&, Type, int quality); - static bool EncodeFile(const char file[], const SkBitmap&, Type, int quality); static bool EncodeStream(SkWStream*, const SkBitmap&, Type, int quality); - /** Uses SkImageEncoder to serialize images that are not already - encoded as SkImageEncoder::kPNG_Type images. */ - static SkPixelSerializer* CreatePixelSerializer(); - protected: /** * Encode bitmap 'bm' in the desired format, writing results to diff --git a/src/image/SkImage.cpp b/src/image/SkImage.cpp index 338ab09130..7db5b4e0a8 100644 --- a/src/image/SkImage.cpp +++ b/src/image/SkImage.cpp @@ -9,7 +9,6 @@ #include "SkBitmapCache.h" #include "SkCanvas.h" #include "SkData.h" -#include "SkImageEncoder.h" #include "SkImageGenerator.h" #include "SkImagePriv.h" #include "SkImageShader.h" @@ -179,14 +178,32 @@ SkData* SkImage::encode(SkImageEncoder::Type type, int quality) const { return nullptr; } -SkData* SkImage::encode(SkPixelSerializer* serializer) const { - SkAutoTUnref<SkPixelSerializer> defaultSerializer; - SkPixelSerializer* effectiveSerializer = serializer; - if (!effectiveSerializer) { - defaultSerializer.reset(SkImageEncoder::CreatePixelSerializer()); - SkASSERT(defaultSerializer.get()); - effectiveSerializer = defaultSerializer.get(); +namespace { + +class DefaultSerializer : public SkPixelSerializer { +protected: + bool onUseEncodedData(const void *data, size_t len) override { + return true; + } + SkData* onEncode(const SkPixmap& pixmap) override { + SkBitmap bm; + if (!bm.installPixels(pixmap.info(), + const_cast<void*>(pixmap.addr()), + pixmap.rowBytes(), + pixmap.ctable(), + nullptr, nullptr)) { + return nullptr; + } + return SkImageEncoder::EncodeData(bm, SkImageEncoder::kPNG_Type, 100); } +}; + +} // anonymous namespace + +SkData* SkImage::encode(SkPixelSerializer* serializer) const { + DefaultSerializer defaultSerializer; + SkPixelSerializer* effectiveSerializer = serializer ? serializer : &defaultSerializer; + SkAutoTUnref<SkData> encoded(this->refEncoded()); if (encoded && effectiveSerializer->useEncodedData(encoded->data(), encoded->size())) { return encoded.detach(); diff --git a/src/images/SkImageEncoder.cpp b/src/images/SkImageEncoder.cpp index cea567816b..cc1b73baa5 100644 --- a/src/images/SkImageEncoder.cpp +++ b/src/images/SkImageEncoder.cpp @@ -7,8 +7,6 @@ #include "SkImageEncoder.h" #include "SkBitmap.h" -#include "SkPixelSerializer.h" -#include "SkPixmap.h" #include "SkStream.h" #include "SkTemplates.h" @@ -59,33 +57,6 @@ SkData* SkImageEncoder::EncodeData(const SkImageInfo& info, const void* pixels, if (!bm.installPixels(info, const_cast<void*>(pixels), rowBytes)) { return nullptr; } - bm.setImmutable(); - return SkImageEncoder::EncodeData(bm, t, quality); -} - -SkData* SkImageEncoder::EncodeData(const SkPixmap& pixmap, - Type t, int quality) { - SkBitmap bm; - if (!bm.installPixels(pixmap.info(), - const_cast<void*>(pixmap.addr()), - pixmap.rowBytes(), - pixmap.ctable(), nullptr, nullptr)) { - return nullptr; - } - bm.setImmutable(); - return SkImageEncoder::EncodeData(bm, t, quality); -} - -namespace { -class ImageEncoderPixelSerializer final : public SkPixelSerializer { -protected: - bool onUseEncodedData(const void*, size_t) override { return true; } - SkData* onEncode(const SkPixmap& pmap) override { - return SkImageEncoder::EncodeData(pmap, SkImageEncoder::kPNG_Type, 100); - } -}; -} // namespace - -SkPixelSerializer* SkImageEncoder::CreatePixelSerializer() { - return new ImageEncoderPixelSerializer; + SkAutoTDelete<SkImageEncoder> enc(SkImageEncoder::Create(t)); + return enc.get() ? enc.get()->encodeData(bm, quality) : nullptr; } diff --git a/tests/PictureTest.cpp b/tests/PictureTest.cpp index a81733e38a..1575456491 100644 --- a/tests/PictureTest.cpp +++ b/tests/PictureTest.cpp @@ -851,9 +851,8 @@ static SkData* serialized_picture_from_bitmap(const SkBitmap& bitmap) { SkAutoTUnref<SkPicture> picture(recorder.endRecording()); SkDynamicMemoryWStream wStream; - SkAutoTUnref<SkPixelSerializer> serializer( - SkImageEncoder::CreatePixelSerializer()); - picture->serialize(&wStream, serializer); + sk_tool_utils::PngPixelSerializer serializer; + picture->serialize(&wStream, &serializer); return wStream.copyToData(); } diff --git a/tools/sk_tool_utils.h b/tools/sk_tool_utils.h index dab42e31fd..67fd869a87 100644 --- a/tools/sk_tool_utils.h +++ b/tools/sk_tool_utils.h @@ -114,6 +114,18 @@ namespace sk_tool_utils { SkBitmap create_string_bitmap(int w, int h, SkColor c, int x, int y, int textSize, const char* str); + // Encodes to PNG, unless there is already encoded data, in which case that gets + // used. + class PngPixelSerializer : public SkPixelSerializer { + public: + bool onUseEncodedData(const void*, size_t) override { return true; } + SkData* onEncodePixels(const SkImageInfo& info, const void* pixels, + size_t rowBytes) override { + return SkImageEncoder::EncodeData(info, pixels, rowBytes, + SkImageEncoder::kPNG_Type, 100); + } + }; + // A helper for inserting a drawtext call into a SkTextBlobBuilder void add_to_text_blob(SkTextBlobBuilder* builder, const char* text, const SkPaint& origPaint, SkScalar x, SkScalar y); |