Add refcnt'ed immutable vertices class for SkCanvas::drawVertices.
Change-Id: I44a62f5efc674d0adbbf4a33690c3ded9fab3803
Reviewed-on: https://skia-review.googlesource.com/8040
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index 41c5116..eb81bd7 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -49,6 +49,7 @@
#endif
#include "SkClipOpPriv.h"
+#include "SkVertices.h"
#define RETURN_ON_NULL(ptr) do { if (nullptr == (ptr)) return; } while (0)
@@ -1857,8 +1858,14 @@
void SkCanvas::drawVertices(VertexMode vmode, int vertexCount, const SkPoint vertices[],
const SkPoint texs[], const SkColor colors[], SkBlendMode bmode,
const uint16_t indices[], int indexCount, const SkPaint& paint) {
- this->onDrawVertices(vmode, vertexCount, vertices, texs, colors, bmode,
- indices, indexCount, paint);
+ this->onDrawVertices(vmode, vertexCount, std::move(vertices), texs, colors, bmode, indices,
+ indexCount, paint);
+}
+
+void SkCanvas::drawVertices(sk_sp<SkVertices> vertices, SkBlendMode mode, const SkPaint& paint,
+ uint32_t flags) {
+ RETURN_ON_NULL(vertices);
+ this->onDrawVerticesObject(std::move(vertices), mode, paint, flags);
}
void SkCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
@@ -2815,6 +2822,28 @@
LOOPER_END
}
+void SkCanvas::onDrawVerticesObject(sk_sp<SkVertices> vertices, SkBlendMode bmode,
+ const SkPaint& paint, uint32_t flags) {
+ TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawVertices()");
+ LOOPER_BEGIN(paint, SkDrawFilter::kPath_Type, nullptr)
+
+ while (iter.next()) {
+ // In the common case of one iteration we could std::move vertices here.
+ iter.fDevice->drawVerticesObject(iter, vertices, bmode, looper.paint(), flags);
+ }
+
+ LOOPER_END
+}
+
+void SkCanvas::onDrawVerticesObjectFallback(sk_sp<SkVertices> vertices, SkBlendMode mode,
+ const SkPaint& paint, uint32_t flags) {
+ const SkPoint* texs =
+ (flags & SkCanvas::kIgnoreTexCoords_VerticesFlag) ? nullptr : vertices->texCoords();
+ const SkColor* colors = (flags & kIgnoreColors_VerticesFlag) ? nullptr : vertices->colors();
+ this->onDrawVertices(vertices->mode(), vertices->vertexCount(), vertices->positions(), texs,
+ colors, mode, vertices->indices(), vertices->indexCount(), paint);
+}
+
void SkCanvas::drawPatch(const SkPoint cubics[12], const SkColor colors[4],
const SkPoint texCoords[4], SkBlendMode bmode,
const SkPaint& paint) {
diff --git a/src/core/SkDevice.cpp b/src/core/SkDevice.cpp
index 8042c16..07b9c23 100644
--- a/src/core/SkDevice.cpp
+++ b/src/core/SkDevice.cpp
@@ -5,26 +5,27 @@
* found in the LICENSE file.
*/
-#include "SkColorFilter.h"
#include "SkDevice.h"
+#include "SkColorFilter.h"
#include "SkDraw.h"
#include "SkDrawFilter.h"
-#include "SkImage_Base.h"
#include "SkImageCacherator.h"
#include "SkImageFilter.h"
#include "SkImageFilterCache.h"
#include "SkImagePriv.h"
+#include "SkImage_Base.h"
#include "SkLatticeIter.h"
#include "SkPatchUtils.h"
-#include "SkPathPriv.h"
#include "SkPathMeasure.h"
-#include "SkRasterClip.h"
+#include "SkPathPriv.h"
#include "SkRSXform.h"
+#include "SkRasterClip.h"
#include "SkShader.h"
#include "SkSpecialImage.h"
+#include "SkTLazy.h"
#include "SkTextBlobRunIterator.h"
#include "SkTextToPathIter.h"
-#include "SkTLazy.h"
+#include "SkVertices.h"
SkBaseDevice::SkBaseDevice(const SkImageInfo& info, const SkSurfaceProps& surfaceProps)
: fInfo(info)
@@ -309,6 +310,16 @@
}
}
+void SkBaseDevice::drawVerticesObject(const SkDraw& draw, sk_sp<SkVertices> vertices,
+ SkBlendMode mode, const SkPaint& paint, uint32_t flags) {
+ const SkPoint* texs =
+ (flags & SkCanvas::kIgnoreTexCoords_VerticesFlag) ? nullptr : vertices->texCoords();
+ const SkColor* colors =
+ (flags & SkCanvas::kIgnoreColors_VerticesFlag) ? nullptr : vertices->colors();
+ this->drawVertices(draw, vertices->mode(), vertices->vertexCount(), vertices->positions(), texs,
+ colors, mode, vertices->indices(), vertices->indexCount(), paint);
+}
+
///////////////////////////////////////////////////////////////////////////////////////////////////
void SkBaseDevice::drawSpecial(const SkDraw&, SkSpecialImage*, int x, int y, const SkPaint&) {}
diff --git a/src/core/SkDevice.h b/src/core/SkDevice.h
index ab0fdbd..9239672 100644
--- a/src/core/SkDevice.h
+++ b/src/core/SkDevice.h
@@ -198,6 +198,8 @@
const SkColor colors[], SkBlendMode,
const uint16_t indices[], int indexCount,
const SkPaint& paint) = 0;
+ virtual void drawVerticesObject(const SkDraw&, sk_sp<SkVertices>, SkBlendMode, const SkPaint&,
+ uint32_t flags);
// default implementation unrolls the blob runs.
virtual void drawTextBlob(const SkDraw&, const SkTextBlob*, SkScalar x, SkScalar y,
const SkPaint& paint, SkDrawFilter* drawFilter);
diff --git a/src/core/SkPictureRecord.h b/src/core/SkPictureRecord.h
index 9339d12..587233c 100644
--- a/src/core/SkPictureRecord.h
+++ b/src/core/SkPictureRecord.h
@@ -15,6 +15,7 @@
#include "SkTArray.h"
#include "SkTDArray.h"
#include "SkTHash.h"
+#include "SkVertices.h"
#include "SkWriter32.h"
// These macros help with packing and unpacking a single byte value and
@@ -203,6 +204,10 @@
const SkColor colors[], SkBlendMode,
const uint16_t indices[], int indexCount,
const SkPaint&) override;
+ void onDrawVerticesObject(sk_sp<SkVertices> vertices, SkBlendMode mode, const SkPaint& paint,
+ uint32_t flags) override {
+ this->onDrawVerticesObjectFallback(std::move(vertices), mode, paint, flags);
+ }
void onClipRect(const SkRect&, SkClipOp, ClipEdgeStyle) override;
void onClipRRect(const SkRRect&, SkClipOp, ClipEdgeStyle) override;