aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--fuzz/FuzzCanvas.cpp3
-rw-r--r--fuzz/fuzz.cpp4
-rw-r--r--include/core/SkPicture.h66
-rw-r--r--src/core/SkPicture.cpp16
-rw-r--r--src/core/SkPictureData.cpp5
-rw-r--r--src/core/SkPicturePriv.h39
-rw-r--r--src/core/SkReadBuffer.h2
-rw-r--r--src/core/SkWriteBuffer.h2
-rw-r--r--src/effects/SkPictureImageFilter.cpp5
-rw-r--r--src/shaders/SkPictureShader.cpp6
-rw-r--r--tests/PictureTest.cpp4
-rw-r--r--tests/SerializationTest.cpp5
-rw-r--r--tools/DumpRecord.cpp3
13 files changed, 93 insertions, 67 deletions
diff --git a/fuzz/FuzzCanvas.cpp b/fuzz/FuzzCanvas.cpp
index 7ca14d2223..903eb29858 100644
--- a/fuzz/FuzzCanvas.cpp
+++ b/fuzz/FuzzCanvas.cpp
@@ -18,6 +18,7 @@
#include "SkMaskFilter.h"
#include "SkNullCanvas.h"
#include "SkPathEffect.h"
+#include "SkPicturePriv.h"
#include "SkPictureRecorder.h"
#include "SkPoint3.h"
#include "SkRSXform.h"
@@ -1734,7 +1735,7 @@ DEF_FUZZ(RasterN32CanvasViaSerialization, fuzz) {
sk_sp<SkData> data = pic->serialize();
if (!data) { fuzz->signalBug(); }
SkReadBuffer rb(data->data(), data->size());
- auto deserialized = SkPicture::MakeFromBuffer(rb);
+ auto deserialized = SkPicturePriv::MakeFromBuffer(rb);
if (!deserialized) { fuzz->signalBug(); }
auto surface = SkSurface::MakeRasterN32Premul(kCanvasSize.width(), kCanvasSize.height());
SkASSERT(surface && surface->getCanvas());
diff --git a/fuzz/fuzz.cpp b/fuzz/fuzz.cpp
index ce0119c1a9..96d2a25daa 100644
--- a/fuzz/fuzz.cpp
+++ b/fuzz/fuzz.cpp
@@ -17,7 +17,7 @@
#include "SkOSPath.h"
#include "SkPaint.h"
#include "SkPath.h"
-#include "SkPicture.h"
+#include "SkPicturePriv.h"
#include "SkPipe.h"
#include "SkReadBuffer.h"
#include "SkStream.h"
@@ -604,7 +604,7 @@ static void fuzz_img(sk_sp<SkData> bytes, uint8_t scale, uint8_t mode) {
static void fuzz_skp(sk_sp<SkData> bytes) {
SkReadBuffer buf(bytes->data(), bytes->size());
SkDebugf("Decoding\n");
- sk_sp<SkPicture> pic(SkPicture::MakeFromBuffer(buf));
+ sk_sp<SkPicture> pic(SkPicturePriv::MakeFromBuffer(buf));
if (!pic) {
SkDebugf("[terminated] Couldn't decode as a picture.\n");
return;
diff --git a/include/core/SkPicture.h b/include/core/SkPicture.h
index 3693a45d8a..1a9fe04f5c 100644
--- a/include/core/SkPicture.h
+++ b/include/core/SkPicture.h
@@ -12,20 +12,13 @@
#include "SkRect.h"
#include "SkTypes.h"
-class SkBigPicture;
class SkCanvas;
class SkData;
struct SkDeserialProcs;
class SkImage;
-class SkPictureData;
-class SkReadBuffer;
-class SkRefCntSet;
struct SkSerialProcs;
class SkStream;
-class SkTypefacePlayback;
class SkWStream;
-class SkWriteBuffer;
-struct SkPictInfo;
/** \class SkPicture
@@ -38,20 +31,12 @@ public:
* Recreate a picture that was serialized into a stream or data.
*/
- static sk_sp<SkPicture> MakeFromStream(SkStream*, const SkDeserialProcs* = nullptr);
- static sk_sp<SkPicture> MakeFromData(const SkData* data, const SkDeserialProcs* = nullptr);
+ static sk_sp<SkPicture> MakeFromStream(SkStream* stream,
+ const SkDeserialProcs* procs = nullptr);
+ static sk_sp<SkPicture> MakeFromData(const SkData* data,
+ const SkDeserialProcs* procs = nullptr);
static sk_sp<SkPicture> MakeFromData(const void* data, size_t size,
- const SkDeserialProcs* = nullptr);
-
- /**
- * Recreate a picture that was serialized into a buffer. If the creation requires bitmap
- * decoding, the decoder must be set on the SkReadBuffer parameter by calling
- * SkReadBuffer::setBitmapDecoder() before calling SkPicture::MakeFromBuffer().
- * @param SkReadBuffer Serialized picture data.
- * @return A new SkPicture representing the serialized data, or NULL if the buffer is
- * invalid.
- */
- static sk_sp<SkPicture> MakeFromBuffer(SkReadBuffer&);
+ const SkDeserialProcs* procs = nullptr);
/**
* Subclasses of this can be passed to playback(). During the playback
@@ -77,7 +62,7 @@ public:
@param canvas the canvas receiving the drawing commands.
@param callback a callback that allows interruption of playback
*/
- virtual void playback(SkCanvas*, AbortCallback* = nullptr) const = 0;
+ virtual void playback(SkCanvas* canvas, AbortCallback* callback = nullptr) const = 0;
/** Return a cull rect for this picture.
Ops recorded into this picture that attempt to draw outside the cull might not be drawn.
@@ -87,8 +72,8 @@ public:
/** Returns a non-zero value unique among all pictures. */
uint32_t uniqueID() const;
- sk_sp<SkData> serialize(const SkSerialProcs* = nullptr) const;
- void serialize(SkWStream*, const SkSerialProcs* = nullptr) const;
+ sk_sp<SkData> serialize(const SkSerialProcs* procs = nullptr) const;
+ void serialize(SkWStream* stream, const SkSerialProcs* procs = nullptr) const;
/**
* Return a placeholder SkPicture.
@@ -98,11 +83,6 @@ public:
*/
static sk_sp<SkPicture> MakePlaceholder(SkRect cull);
- /**
- * Serialize to a buffer.
- */
- void flatten(SkWriteBuffer&) const;
-
/** Return the approximate number of operations in this picture. This
* number may be greater or less than the number of SkCanvas calls
* recorded: some calls may be recorded as more than one operation, or some
@@ -113,18 +93,17 @@ public:
/** Returns the approximate byte size of this picture, not including large ref'd objects. */
virtual size_t approximateBytesUsed() const = 0;
- // Returns NULL if this is not an SkBigPicture.
- virtual const SkBigPicture* asSkBigPicture() const { return nullptr; }
-
private:
// Subclass whitelist.
SkPicture();
friend class SkBigPicture;
friend class SkEmptyPicture;
+ friend class SkPicturePriv;
template <typename> friend class SkMiniPicture;
- void serialize(SkWStream*, const SkSerialProcs*, SkRefCntSet* typefaces) const;
- static sk_sp<SkPicture> MakeFromStream(SkStream*, const SkDeserialProcs*, SkTypefacePlayback*);
+ void serialize(SkWStream*, const SkSerialProcs*, class SkRefCntSet* typefaces) const;
+ static sk_sp<SkPicture> MakeFromStream(SkStream*, const SkDeserialProcs*,
+ class SkTypefacePlayback*);
friend class SkPictureData;
/** Return true if the SkStream/Buffer represents a serialized picture, and
@@ -135,9 +114,12 @@ private:
intended for stand alone tools.
If false is returned, SkPictInfo is unmodified.
*/
- static bool StreamIsSKP(SkStream*, SkPictInfo*);
- static bool BufferIsSKP(SkReadBuffer*, SkPictInfo*);
- friend bool SkPicture_StreamIsSKP(SkStream*, SkPictInfo*);
+ static bool StreamIsSKP(SkStream*, struct SkPictInfo*);
+ static bool BufferIsSKP(class SkReadBuffer*, struct SkPictInfo*);
+ friend bool SkPicture_StreamIsSKP(SkStream*, struct SkPictInfo*);
+
+ // Returns NULL if this is not an SkBigPicture.
+ virtual const class SkBigPicture* asSkBigPicture() const { return nullptr; }
friend struct SkPathCounter;
@@ -177,13 +159,13 @@ private:
static_assert(MIN_PICTURE_VERSION <= 62, "Remove kFontAxes_bad from SkFontDescriptor.cpp");
- static bool IsValidPictInfo(const SkPictInfo& info);
- static sk_sp<SkPicture> Forwardport(const SkPictInfo&,
- const SkPictureData*,
- SkReadBuffer* buffer);
+ static bool IsValidPictInfo(const struct SkPictInfo& info);
+ static sk_sp<SkPicture> Forwardport(const struct SkPictInfo&,
+ const class SkPictureData*,
+ class SkReadBuffer* buffer);
- SkPictInfo createHeader() const;
- SkPictureData* backport() const;
+ struct SkPictInfo createHeader() const;
+ class SkPictureData* backport() const;
mutable uint32_t fUniqueID;
};
diff --git a/src/core/SkPicture.cpp b/src/core/SkPicture.cpp
index 2325fde864..34fa558ef5 100644
--- a/src/core/SkPicture.cpp
+++ b/src/core/SkPicture.cpp
@@ -8,10 +8,10 @@
#include "SkAtomics.h"
#include "SkImageGenerator.h"
#include "SkMathPriv.h"
-#include "SkPicture.h"
#include "SkPictureCommon.h"
#include "SkPictureData.h"
#include "SkPicturePlayback.h"
+#include "SkPicturePriv.h"
#include "SkPictureRecord.h"
#include "SkPictureRecorder.h"
#include "SkSerialProcs.h"
@@ -198,9 +198,9 @@ sk_sp<SkPicture> SkPicture::MakeFromStream(SkStream* stream, const SkDeserialPro
return nullptr;
}
-sk_sp<SkPicture> SkPicture::MakeFromBuffer(SkReadBuffer& buffer) {
+sk_sp<SkPicture> SkPicturePriv::MakeFromBuffer(SkReadBuffer& buffer) {
SkPictInfo info;
- if (!BufferIsSKP(&buffer, &info)) {
+ if (!SkPicture::BufferIsSKP(&buffer, &info)) {
return nullptr;
}
// size should be 0, 1, or negative
@@ -218,7 +218,7 @@ sk_sp<SkPicture> SkPicture::MakeFromBuffer(SkReadBuffer& buffer) {
return nullptr;
}
std::unique_ptr<SkPictureData> data(SkPictureData::CreateFromBuffer(buffer, info));
- return Forwardport(info, data.get(), &buffer);
+ return SkPicture::Forwardport(info, data.get(), &buffer);
}
SkPictureData* SkPicture::backport() const {
@@ -296,15 +296,15 @@ void SkPicture::serialize(SkWStream* stream, const SkSerialProcs* procsPtr,
}
}
-void SkPicture::flatten(SkWriteBuffer& buffer) const {
- SkPictInfo info = this->createHeader();
- std::unique_ptr<SkPictureData> data(this->backport());
+void SkPicturePriv::Flatten(const sk_sp<const SkPicture> picture, SkWriteBuffer& buffer) {
+ SkPictInfo info = picture->createHeader();
+ std::unique_ptr<SkPictureData> data(picture->backport());
buffer.writeByteArray(&info.fMagic, sizeof(info.fMagic));
buffer.writeUInt(info.getVersion());
buffer.writeRect(info.fCullRect);
- if (auto custom = custom_serialize(this, buffer.fProcs)) {
+ if (auto custom = custom_serialize(picture.get(), buffer.fProcs)) {
int32_t size = SkToS32(custom->size());
buffer.write32(-size); // negative for custom format
buffer.writePad32(custom->data(), size);
diff --git a/src/core/SkPictureData.cpp b/src/core/SkPictureData.cpp
index 4d927380cc..3d34b27bf6 100644
--- a/src/core/SkPictureData.cpp
+++ b/src/core/SkPictureData.cpp
@@ -12,6 +12,7 @@
#include "SkMakeUnique.h"
#include "SkPictureData.h"
#include "SkPictureRecord.h"
+#include "SkPicturePriv.h"
#include "SkReadBuffer.h"
#include "SkTextBlob.h"
#include "SkTypeface.h"
@@ -232,7 +233,7 @@ void SkPictureData::flatten(SkWriteBuffer& buffer) const {
if (!fPictures.empty()) {
write_tag_size(buffer, SK_PICT_PICTURE_TAG, fPictures.count());
for (const auto& pic : fPictures) {
- pic->flatten(buffer);
+ SkPicturePriv::Flatten(pic, buffer);
}
}
@@ -440,7 +441,7 @@ void SkPictureData::parseBufferTag(SkReadBuffer& buffer, uint32_t tag, uint32_t
fOpData = std::move(data);
} break;
case SK_PICT_PICTURE_TAG:
- new_array_from_buffer(buffer, size, fPictures, SkPicture::MakeFromBuffer);
+ new_array_from_buffer(buffer, size, fPictures, SkPicturePriv::MakeFromBuffer);
break;
case SK_PICT_DRAWABLE_TAG:
new_array_from_buffer(buffer, size, fDrawables, create_drawable_from_buffer);
diff --git a/src/core/SkPicturePriv.h b/src/core/SkPicturePriv.h
new file mode 100644
index 0000000000..5c772fc9df
--- /dev/null
+++ b/src/core/SkPicturePriv.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2018 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef SkPicturePriv_DEFINED
+#define SkPicturePriv_DEFINED
+
+#include "SkPicture.h"
+
+class SkReadBuffer;
+class SkWriteBuffer;
+
+class SkPicturePriv {
+public:
+ /**
+ * Recreate a picture that was serialized into a buffer. If the creation requires bitmap
+ * decoding, the decoder must be set on the SkReadBuffer parameter by calling
+ * SkReadBuffer::setBitmapDecoder() before calling SkPicture::MakeFromBuffer().
+ * @param buffer Serialized picture data.
+ * @return A new SkPicture representing the serialized data, or NULL if the buffer is
+ * invalid.
+ */
+ static sk_sp<SkPicture> MakeFromBuffer(SkReadBuffer& buffer);
+
+ /**
+ * Serialize to a buffer.
+ */
+ static void Flatten(const sk_sp<const SkPicture> , SkWriteBuffer& buffer);
+
+ // Returns NULL if this is not an SkBigPicture.
+ static const SkBigPicture* AsSkBigPicture(const sk_sp<const SkPicture> picture) {
+ return picture->asSkBigPicture();
+ }
+};
+
+#endif
diff --git a/src/core/SkReadBuffer.h b/src/core/SkReadBuffer.h
index 5f459cecef..baf8ea143f 100644
--- a/src/core/SkReadBuffer.h
+++ b/src/core/SkReadBuffer.h
@@ -292,7 +292,7 @@ private:
SkTHashMap<SkString, SkFlattenable::Factory> fCustomFactory;
SkDeserialProcs fProcs;
- friend class SkPicture;
+ friend class SkPicturePriv;
#ifdef DEBUG_NON_DETERMINISTIC_ASSERT
// Debugging counter to keep track of how many bitmaps we
diff --git a/src/core/SkWriteBuffer.h b/src/core/SkWriteBuffer.h
index c3d6f570bf..7be1794c2d 100644
--- a/src/core/SkWriteBuffer.h
+++ b/src/core/SkWriteBuffer.h
@@ -67,7 +67,7 @@ protected:
SkDeduper* fDeduper = nullptr;
SkSerialProcs fProcs;
- friend class SkPicture; // fProcs
+ friend class SkPicturePriv; // fProcs
};
/**
diff --git a/src/effects/SkPictureImageFilter.cpp b/src/effects/SkPictureImageFilter.cpp
index df11e6c0df..b9c298dbac 100644
--- a/src/effects/SkPictureImageFilter.cpp
+++ b/src/effects/SkPictureImageFilter.cpp
@@ -12,6 +12,7 @@
#include "SkColorSpaceXformer.h"
#include "SkFlattenablePriv.h"
#include "SkImageSource.h"
+#include "SkPicturePriv.h"
#include "SkReadBuffer.h"
#include "SkSpecialImage.h"
#include "SkSpecialSurface.h"
@@ -58,7 +59,7 @@ sk_sp<SkFlattenable> SkPictureImageFilter::CreateProc(SkReadBuffer& buffer) {
SkRect cropRect;
if (buffer.readBool()) {
- picture = SkPicture::MakeFromBuffer(buffer);
+ picture = SkPicturePriv::MakeFromBuffer(buffer);
}
buffer.readRect(&cropRect);
@@ -77,7 +78,7 @@ void SkPictureImageFilter::flatten(SkWriteBuffer& buffer) const {
bool hasPicture = (fPicture != nullptr);
buffer.writeBool(hasPicture);
if (hasPicture) {
- fPicture->flatten(buffer);
+ SkPicturePriv::Flatten(fPicture, buffer);
}
buffer.writeRect(fCropRect);
}
diff --git a/src/shaders/SkPictureShader.cpp b/src/shaders/SkPictureShader.cpp
index 576598bfe6..6ff4a0eb12 100644
--- a/src/shaders/SkPictureShader.cpp
+++ b/src/shaders/SkPictureShader.cpp
@@ -15,7 +15,7 @@
#include "SkImage.h"
#include "SkImageShader.h"
#include "SkMatrixUtils.h"
-#include "SkPicture.h"
+#include "SkPicturePriv.h"
#include "SkPictureImageGenerator.h"
#include "SkReadBuffer.h"
#include "SkResourceCache.h"
@@ -157,7 +157,7 @@ sk_sp<SkFlattenable> SkPictureShader::CreateProc(SkReadBuffer& buffer) {
bool didSerialize = buffer.readBool();
if (didSerialize) {
- picture = SkPicture::MakeFromBuffer(buffer);
+ picture = SkPicturePriv::MakeFromBuffer(buffer);
}
return SkPictureShader::Make(picture, mx, my, &lm, &tile);
}
@@ -169,7 +169,7 @@ void SkPictureShader::flatten(SkWriteBuffer& buffer) const {
buffer.writeRect(fTile);
buffer.writeBool(true);
- fPicture->flatten(buffer);
+ SkPicturePriv::Flatten(fPicture, buffer);
}
// Returns a cached image shader, which wraps a single picture tile at the given
diff --git a/tests/PictureTest.cpp b/tests/PictureTest.cpp
index 084b8616b7..d7ff8a4a82 100644
--- a/tests/PictureTest.cpp
+++ b/tests/PictureTest.cpp
@@ -20,7 +20,7 @@
#include "SkMiniRecorder.h"
#include "SkPaint.h"
#include "SkPath.h"
-#include "SkPicture.h"
+#include "SkPicturePriv.h"
#include "SkPictureRecorder.h"
#include "SkPixelRef.h"
#include "SkRandom.h"
@@ -452,7 +452,7 @@ static void test_cull_rect_reset(skiatest::Reporter* reporter) {
canvas->drawRect(bounds, paint);
canvas->drawRect(bounds, paint);
sk_sp<SkPicture> p(recorder.finishRecordingAsPictureWithCull(bounds));
- const SkBigPicture* picture = p->asSkBigPicture();
+ const SkBigPicture* picture = SkPicturePriv::AsSkBigPicture(p);
REPORTER_ASSERT(reporter, picture);
SkRect finalCullRect = picture->cullRect();
diff --git a/tests/SerializationTest.cpp b/tests/SerializationTest.cpp
index c6d529b0cb..5de77cd9fb 100644
--- a/tests/SerializationTest.cpp
+++ b/tests/SerializationTest.cpp
@@ -18,6 +18,7 @@
#include "SkMatrixPriv.h"
#include "SkOSFile.h"
#include "SkReadBuffer.h"
+#include "SkPicturePriv.h"
#include "SkPictureRecorder.h"
#include "SkShaderBase.h"
#include "SkTableColorFilter.h"
@@ -544,14 +545,14 @@ DEF_TEST(Serialization, reporter) {
// Serialize picture
SkBinaryWriteBuffer writer;
- pict->flatten(writer);
+ SkPicturePriv::Flatten(pict, writer);
size_t size = writer.bytesWritten();
SkAutoTMalloc<unsigned char> data(size);
writer.writeToMemory(static_cast<void*>(data.get()));
// Deserialize picture
SkReadBuffer reader(static_cast<void*>(data.get()), size);
- sk_sp<SkPicture> readPict(SkPicture::MakeFromBuffer(reader));
+ sk_sp<SkPicture> readPict(SkPicturePriv::MakeFromBuffer(reader));
REPORTER_ASSERT(reporter, reader.isValid());
REPORTER_ASSERT(reporter, readPict.get());
}
diff --git a/tools/DumpRecord.cpp b/tools/DumpRecord.cpp
index e9374fd41a..4c9b1f3b46 100644
--- a/tools/DumpRecord.cpp
+++ b/tools/DumpRecord.cpp
@@ -7,6 +7,7 @@
#include <stdio.h>
+#include "SkPicturePriv.h"
#include "SkRecord.h"
#include "SkRecordDraw.h"
@@ -63,7 +64,7 @@ public:
void print(const SkRecords::DrawPicture& command, double ns) {
this->printNameAndTime(command, ns);
- if (auto bp = command.picture->asSkBigPicture()) {
+ if (auto bp = SkPicturePriv::AsSkBigPicture(command.picture)) {
++fIndent;
const SkRecord& record = *bp->record();