aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--bench/nanobench.cpp11
-rw-r--r--include/core/SkPicture.h16
-rw-r--r--src/core/SkBigPicture.cpp1
-rw-r--r--src/core/SkBigPicture.h1
-rw-r--r--src/core/SkCanvas.cpp18
-rw-r--r--src/core/SkMiniRecorder.cpp2
-rw-r--r--src/core/SkPicturePriv.h28
-rw-r--r--src/core/SkRecordedDrawable.cpp3
-rw-r--r--src/core/SkRecorder.cpp4
-rw-r--r--src/effects/SkPictureImageFilter.cpp3
-rw-r--r--src/shaders/SkPictureShader.cpp4
-rw-r--r--tests/ImageTest.cpp2
-rw-r--r--tests/PictureTest.cpp25
-rw-r--r--tests/SerializationTest.cpp3
-rw-r--r--tools/DumpRecord.cpp3
15 files changed, 52 insertions, 72 deletions
diff --git a/bench/nanobench.cpp b/bench/nanobench.cpp
index b9ecfa7b51..1f275d8cc3 100644
--- a/bench/nanobench.cpp
+++ b/bench/nanobench.cpp
@@ -38,6 +38,7 @@
#include "SkLeanWindows.h"
#include "SkOSFile.h"
#include "SkOSPath.h"
+#include "SkPicturePriv.h"
#include "SkPictureRecorder.h"
#include "SkSVGDOM.h"
#include "SkScan.h"
@@ -738,8 +739,7 @@ public:
SkString name = SkOSPath::Basename(path.c_str());
fSourceType = "skp";
fBenchType = "recording";
- fSKPBytes = static_cast<double>(pic->approximateBytesUsed());
- fSKPOps = pic->approximateOpCount();
+ fSKPBytes = static_cast<double>(SkPicturePriv::ApproxBytesUsed(pic.get()));
return new RecordingBench(name.c_str(), pic.get(), FLAGS_bbh, FLAGS_lite);
}
@@ -753,8 +753,7 @@ public:
SkString name = SkOSPath::Basename(path.c_str());
fSourceType = "skp";
fBenchType = "piping";
- fSKPBytes = static_cast<double>(pic->approximateBytesUsed());
- fSKPOps = pic->approximateOpCount();
+ fSKPBytes = static_cast<double>(SkPicturePriv::ApproxBytesUsed(pic.get()));
return new PipingBench(name.c_str(), pic.get());
}
@@ -769,7 +768,6 @@ public:
fSourceType = "skp";
fBenchType = "deserial";
fSKPBytes = static_cast<double>(data->size());
- fSKPOps = 0;
return new DeserializePictureBench(name.c_str(), std::move(data));
}
@@ -1063,7 +1061,6 @@ public:
}
if (0 == strcmp(fBenchType, "recording")) {
log->metric("bytes", fSKPBytes);
- log->metric("ops", fSKPOps);
}
}
@@ -1093,7 +1090,7 @@ private:
SkScalar fZoomMax;
double fZoomPeriodMs;
- double fSKPBytes, fSKPOps;
+ double fSKPBytes;
const char* fSourceType; // What we're benching: bench, GM, SKP, ...
const char* fBenchType; // How we bench it: micro, recording, playback, ...
diff --git a/include/core/SkPicture.h b/include/core/SkPicture.h
index 4887db928f..d505a0a364 100644
--- a/include/core/SkPicture.h
+++ b/include/core/SkPicture.h
@@ -90,18 +90,7 @@ public:
sk_sp<SkData> serialize(const SkSerialProcs* = nullptr) const;
void serialize(SkWStream*, const SkSerialProcs* = nullptr) const;
- /**
- * 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
- * calls may be optimized away.
- */
- virtual int approximateOpCount() const = 0;
-
+protected:
/** Returns the approximate byte size of this picture, not including large ref'd objects. */
virtual size_t approximateBytesUsed() const = 0;
@@ -113,6 +102,8 @@ private:
SkPicture();
friend class SkBigPicture;
friend class SkEmptyPicture;
+ friend class SkPicturePriv;
+ friend class SkPictureRecorder;
template <typename> friend class SkMiniPicture;
void serialize(SkWStream*, const SkSerialProcs*, SkRefCntSet* typefaces) const;
@@ -172,6 +163,7 @@ private:
SkPictInfo createHeader() const;
SkPictureData* backport() const;
+ void flatten(SkWriteBuffer&) const;
mutable uint32_t fUniqueID;
};
diff --git a/src/core/SkBigPicture.cpp b/src/core/SkBigPicture.cpp
index 2ae9248d47..e91f897525 100644
--- a/src/core/SkBigPicture.cpp
+++ b/src/core/SkBigPicture.cpp
@@ -54,7 +54,6 @@ void SkBigPicture::partialPlayback(SkCanvas* canvas,
}
SkRect SkBigPicture::cullRect() const { return fCullRect; }
-int SkBigPicture::approximateOpCount() const { return fRecord->count(); }
size_t SkBigPicture::approximateBytesUsed() const {
size_t bytes = sizeof(*this) + fRecord->bytesUsed() + fApproxBytesUsedBySubPictures;
if (fBBH) { bytes += fBBH->bytesUsed(); }
diff --git a/src/core/SkBigPicture.h b/src/core/SkBigPicture.h
index cbe492cc22..3fc7071cf0 100644
--- a/src/core/SkBigPicture.h
+++ b/src/core/SkBigPicture.h
@@ -43,7 +43,6 @@ public:
// SkPicture overrides
void playback(SkCanvas*, AbortCallback*) const override;
SkRect cullRect() const override;
- int approximateOpCount() const override;
size_t approximateBytesUsed() const override;
const SkBigPicture* asSkBigPicture() const override { return this; }
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index 49da8eb3a7..4f43a936fa 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -28,7 +28,7 @@
#include "SkNx.h"
#include "SkPaintPriv.h"
#include "SkPatchUtils.h"
-#include "SkPicture.h"
+#include "SkPicturePriv.h"
#include "SkRasterClip.h"
#include "SkRasterHandleAllocator.h"
#include "SkRRect.h"
@@ -2786,15 +2786,6 @@ void SkCanvas::drawTextOnPathHV(const void* text, size_t byteLength,
///////////////////////////////////////////////////////////////////////////////
-/**
- * This constant is trying to balance the speed of ref'ing a subpicture into a parent picture,
- * against the playback cost of recursing into the subpicture to get at its actual ops.
- *
- * For now we pick a conservatively small value, though measurement (and other heuristics like
- * the type of ops contained) may justify changing this value.
- */
-#define kMaxPictureOpsToUnrollInsteadOfRef 1
-
void SkCanvas::drawPicture(const SkPicture* picture, const SkMatrix* matrix, const SkPaint* paint) {
TRACE_EVENT0("skia", TRACE_FUNC);
RETURN_ON_NULL(picture);
@@ -2802,12 +2793,7 @@ void SkCanvas::drawPicture(const SkPicture* picture, const SkMatrix* matrix, con
if (matrix && matrix->isIdentity()) {
matrix = nullptr;
}
- if (picture->approximateOpCount() <= kMaxPictureOpsToUnrollInsteadOfRef) {
- SkAutoCanvasMatrixPaint acmp(this, matrix, paint, picture->cullRect());
- picture->playback(this);
- } else {
- this->onDrawPicture(picture, matrix, paint);
- }
+ this->onDrawPicture(picture, matrix, paint);
}
void SkCanvas::onDrawPicture(const SkPicture* picture, const SkMatrix* matrix,
diff --git a/src/core/SkMiniRecorder.cpp b/src/core/SkMiniRecorder.cpp
index 6a2edf1f12..22b45fd0a9 100644
--- a/src/core/SkMiniRecorder.cpp
+++ b/src/core/SkMiniRecorder.cpp
@@ -22,7 +22,6 @@ public:
void playback(SkCanvas*, AbortCallback*) const override { }
size_t approximateBytesUsed() const override { return sizeof(*this); }
- int approximateOpCount() const override { return 0; }
SkRect cullRect() const override { return SkRect::MakeEmpty(); }
};
@@ -55,7 +54,6 @@ public:
}
size_t approximateBytesUsed() const override { return sizeof(*this); }
- int approximateOpCount() const override { return 1; }
SkRect cullRect() const override { return fCull; }
private:
diff --git a/src/core/SkPicturePriv.h b/src/core/SkPicturePriv.h
new file mode 100644
index 0000000000..5da3feaaa1
--- /dev/null
+++ b/src/core/SkPicturePriv.h
@@ -0,0 +1,28 @@
+/*
+ * 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 SkWriteBuffer;
+
+class SkPicturePriv {
+public:
+ static size_t ApproxBytesUsed(const SkPicture* pic) {
+ return pic->approximateBytesUsed();
+ }
+ static const SkBigPicture* AsBigPicture(const SkPicture* pic) {
+ return pic->asSkBigPicture();
+ }
+ static void Flatten(SkWriteBuffer& buffer, const SkPicture* pic) {
+ pic->flatten(buffer);
+ }
+};
+
+#endif
diff --git a/src/core/SkRecordedDrawable.cpp b/src/core/SkRecordedDrawable.cpp
index be8a2cb07e..bead309118 100644
--- a/src/core/SkRecordedDrawable.cpp
+++ b/src/core/SkRecordedDrawable.cpp
@@ -8,6 +8,7 @@
#include "SkMatrix.h"
#include "SkPictureData.h"
#include "SkPicturePlayback.h"
+#include "SkPicturePriv.h"
#include "SkPictureRecord.h"
#include "SkPictureRecorder.h"
#include "SkRecordedDrawable.h"
@@ -33,7 +34,7 @@ SkPicture* SkRecordedDrawable::onNewPictureSnapshot() {
size_t subPictureBytes = 0;
for (int i = 0; pictList && i < pictList->count(); i++) {
- subPictureBytes += pictList->begin()[i]->approximateBytesUsed();
+ subPictureBytes += SkPicturePriv::ApproxBytesUsed(pictList->begin()[i]);
}
// SkBigPicture will take ownership of a ref on both fRecord and fBBH.
// We're not willing to give up our ownership, so we must ref them for SkPicture.
diff --git a/src/core/SkRecorder.cpp b/src/core/SkRecorder.cpp
index 9374b60264..302b938f6c 100644
--- a/src/core/SkRecorder.cpp
+++ b/src/core/SkRecorder.cpp
@@ -9,7 +9,7 @@
#include "SkCanvasPriv.h"
#include "SkImage.h"
#include "SkPatchUtils.h"
-#include "SkPicture.h"
+#include "SkPicturePriv.h"
#include "SkRecorder.h"
#include "SkSurface.h"
@@ -302,7 +302,7 @@ void SkRecorder::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
void SkRecorder::onDrawPicture(const SkPicture* pic, const SkMatrix* matrix, const SkPaint* paint) {
if (fDrawPictureMode == Record_DrawPictureMode) {
- fApproxBytesUsedBySubPictures += pic->approximateBytesUsed();
+ fApproxBytesUsedBySubPictures += SkPicturePriv::ApproxBytesUsed(pic);
APPEND(DrawPicture, this->copy(paint), sk_ref_sp(pic), matrix ? *matrix : SkMatrix::I());
} else {
SkASSERT(fDrawPictureMode == Playback_DrawPictureMode);
diff --git a/src/effects/SkPictureImageFilter.cpp b/src/effects/SkPictureImageFilter.cpp
index 304b91cf3c..d0ea6f3d66 100644
--- a/src/effects/SkPictureImageFilter.cpp
+++ b/src/effects/SkPictureImageFilter.cpp
@@ -11,6 +11,7 @@
#include "SkColorSpaceXformCanvas.h"
#include "SkColorSpaceXformer.h"
#include "SkImageSource.h"
+#include "SkPicturePriv.h"
#include "SkReadBuffer.h"
#include "SkSpecialImage.h"
#include "SkSpecialSurface.h"
@@ -76,7 +77,7 @@ void SkPictureImageFilter::flatten(SkWriteBuffer& buffer) const {
bool hasPicture = (fPicture != nullptr);
buffer.writeBool(hasPicture);
if (hasPicture) {
- fPicture->flatten(buffer);
+ SkPicturePriv::Flatten(buffer, fPicture.get());
}
buffer.writeRect(fCropRect);
}
diff --git a/src/shaders/SkPictureShader.cpp b/src/shaders/SkPictureShader.cpp
index 21bd5a531c..fb15f6603b 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"
@@ -176,7 +176,7 @@ void SkPictureShader::flatten(SkWriteBuffer& buffer) const {
buffer.writeRect(fTile);
buffer.writeBool(true);
- fPicture->flatten(buffer);
+ SkPicturePriv::Flatten(buffer, fPicture.get());
}
sk_sp<SkShader> SkPictureShader::refBitmapShader(const SkMatrix& viewMatrix, const SkMatrix* localM,
diff --git a/tests/ImageTest.cpp b/tests/ImageTest.cpp
index 6cc0fee4d9..3efb72e919 100644
--- a/tests/ImageTest.cpp
+++ b/tests/ImageTest.cpp
@@ -233,7 +233,6 @@ DEF_TEST(Image_Serialize_Encoding_Failure, reporter) {
canvas->drawImage(image, 0, 0);
sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
REPORTER_ASSERT(reporter, picture);
- REPORTER_ASSERT(reporter, picture->approximateOpCount() > 0);
bool was_called = false;
SkSerialProcs procs;
@@ -250,7 +249,6 @@ DEF_TEST(Image_Serialize_Encoding_Failure, reporter) {
auto deserialized = SkPicture::MakeFromData(data->data(), data->size());
REPORTER_ASSERT(reporter, deserialized);
- REPORTER_ASSERT(reporter, deserialized->approximateOpCount() > 0);
}
// Test that a draw that only partially covers the drawing surface isn't
diff --git a/tests/PictureTest.cpp b/tests/PictureTest.cpp
index 714338f9d1..4eeec35497 100644
--- a/tests/PictureTest.cpp
+++ b/tests/PictureTest.cpp
@@ -19,7 +19,7 @@
#include "SkMD5.h"
#include "SkMiniRecorder.h"
#include "SkPaint.h"
-#include "SkPicture.h"
+#include "SkPicturePriv.h"
#include "SkPictureRecorder.h"
#include "SkPixelRef.h"
#include "SkRectPriv.h"
@@ -446,7 +446,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::AsBigPicture(p.get());
REPORTER_ASSERT(reporter, picture);
SkRect finalCullRect = picture->cullRect();
@@ -813,24 +813,3 @@ DEF_TEST(Picture_UpdatedCull_2, r) {
REPORTER_ASSERT(r, pic->cullRect() == SkRectPriv::MakeLargest());
}
-DEF_TEST(Picture_RecordsFlush, r) {
- SkPictureRecorder recorder;
-
- auto canvas = recorder.beginRecording(SkRect::MakeWH(100,100));
- for (int i = 0; i < 10; i++) {
- canvas->clear(0);
- for (int j = 0; j < 10; j++) {
- canvas->drawRect(SkRect::MakeXYWH(i*10,j*10,10,10), SkPaint());
- }
- canvas->flush();
- }
-
- // Did we record the flushes?
- auto pic = recorder.finishRecordingAsPicture();
- REPORTER_ASSERT(r, pic->approximateOpCount() == 120); // 10 clears, 100 draws, 10 flushes
-
- // Do we serialize and deserialize flushes?
- auto skp = pic->serialize();
- auto back = SkPicture::MakeFromData(skp->data(), skp->size());
- REPORTER_ASSERT(r, back->approximateOpCount() == pic->approximateOpCount());
-}
diff --git a/tests/SerializationTest.cpp b/tests/SerializationTest.cpp
index 2543870667..b9c8a378ff 100644
--- a/tests/SerializationTest.cpp
+++ b/tests/SerializationTest.cpp
@@ -17,6 +17,7 @@
#include "SkMatrixPriv.h"
#include "SkOSFile.h"
#include "SkReadBuffer.h"
+#include "SkPicturePriv.h"
#include "SkPictureRecorder.h"
#include "SkShaderBase.h"
#include "SkTableColorFilter.h"
@@ -542,7 +543,7 @@ DEF_TEST(Serialization, reporter) {
// Serialize picture
SkBinaryWriteBuffer writer;
- pict->flatten(writer);
+ SkPicturePriv::Flatten(writer, pict.get());
size_t size = writer.bytesWritten();
SkAutoTMalloc<unsigned char> data(size);
writer.writeToMemory(static_cast<void*>(data.get()));
diff --git a/tools/DumpRecord.cpp b/tools/DumpRecord.cpp
index e9374fd41a..dfe196832b 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::AsBigPicture(command.picture.get())) {
++fIndent;
const SkRecord& record = *bp->record();