diff options
author | 2018-03-09 13:40:31 -0500 | |
---|---|---|
committer | 2018-03-09 19:43:41 +0000 | |
commit | 37886ce8cd7ff7ab9ac7f6440bd31abfd39955e5 (patch) | |
tree | ef2f462295f5f214e75bf431d2aede181e8d31aa /include | |
parent | e5daecd5c3d6a62cff065266cc40e5373bc5a473 (diff) |
Shim to enforce that canvas virtuals are overridden
Change-Id: Iad70d449bbc43195baefd70d20c41996a8435e6e
Reviewed-on: https://skia-review.googlesource.com/113320
Reviewed-by: Mike Reed <reed@google.com>
Reviewed-by: Florin Malita <fmalita@chromium.org>
Commit-Queue: Brian Osman <brianosman@google.com>
Diffstat (limited to 'include')
-rw-r--r-- | include/core/SkCanvas.h | 47 | ||||
-rw-r--r-- | include/core/SkCanvasVirtualEnforcer.h | 85 | ||||
-rw-r--r-- | include/core/SkOverdrawCanvas.h | 8 | ||||
-rw-r--r-- | include/utils/SkNWayCanvas.h | 5 | ||||
-rw-r--r-- | include/utils/SkNoDrawCanvas.h | 7 | ||||
-rw-r--r-- | include/utils/SkPaintFilterCanvas.h | 7 |
6 files changed, 128 insertions, 31 deletions
diff --git a/include/core/SkCanvas.h b/include/core/SkCanvas.h index a9adc48722..f1081bfa83 100644 --- a/include/core/SkCanvas.h +++ b/include/core/SkCanvas.h @@ -2476,48 +2476,41 @@ protected: this->didConcat(SkMatrix::MakeTrans(dx, dy)); } - virtual void onDrawAnnotation(const SkRect& rect, const char key[], SkData* value); + // NOTE: If you are adding a new onDraw virtual to SkCanvas, PLEASE add an override to + // SkCanvasVirtualEnforcer (in SkCanvasVirtualEnforcer.h). This ensures that subclasses using + // that mechanism will be required to implement the new function. + virtual void onDrawPaint(const SkPaint& paint); + virtual void onDrawRect(const SkRect& rect, const SkPaint& paint); + virtual void onDrawRRect(const SkRRect& rrect, const SkPaint& paint); virtual void onDrawDRRect(const SkRRect& outer, const SkRRect& inner, const SkPaint& paint); + virtual void onDrawOval(const SkRect& rect, const SkPaint& paint); + virtual void onDrawArc(const SkRect& rect, SkScalar startAngle, SkScalar sweepAngle, + bool useCenter, const SkPaint& paint); + virtual void onDrawPath(const SkPath& path, const SkPaint& paint); + virtual void onDrawRegion(const SkRegion& region, const SkPaint& paint); virtual void onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y, const SkPaint& paint); - virtual void onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[], const SkPaint& paint); - virtual void onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[], SkScalar constY, const SkPaint& paint); - virtual void onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path, const SkMatrix* matrix, const SkPaint& paint); virtual void onDrawTextRSXform(const void* text, size_t byteLength, const SkRSXform xform[], const SkRect* cullRect, const SkPaint& paint); - virtual void onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, const SkPaint& paint); virtual void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4], const SkPoint texCoords[4], SkBlendMode mode, const SkPaint& paint); - - virtual void onDrawDrawable(SkDrawable* drawable, const SkMatrix* matrix); - - virtual void onDrawPaint(const SkPaint& paint); - virtual void onDrawRect(const SkRect& rect, const SkPaint& paint); - virtual void onDrawRegion(const SkRegion& region, const SkPaint& paint); - virtual void onDrawOval(const SkRect& rect, const SkPaint& paint); - virtual void onDrawArc(const SkRect& rect, SkScalar startAngle, SkScalar sweepAngle, - bool useCenter, const SkPaint& paint); - virtual void onDrawRRect(const SkRRect& rrect, const SkPaint& paint); virtual void onDrawPoints(PointMode mode, size_t count, const SkPoint pts[], const SkPaint& paint); virtual void onDrawVerticesObject(const SkVertices* vertices, SkBlendMode mode, const SkPaint& paint); - virtual void onDrawAtlas(const SkImage* atlas, const SkRSXform xform[], const SkRect rect[], - const SkColor colors[], int count, SkBlendMode mode, - const SkRect* cull, const SkPaint* paint); - virtual void onDrawPath(const SkPath& path, const SkPaint& paint); + virtual void onDrawImage(const SkImage* image, SkScalar dx, SkScalar dy, const SkPaint* paint); virtual void onDrawImageRect(const SkImage* image, const SkRect* src, const SkRect& dst, const SkPaint* paint, SrcRectConstraint constraint); @@ -2534,8 +2527,18 @@ protected: const SkPaint* paint); virtual void onDrawBitmapLattice(const SkBitmap& bitmap, const Lattice& lattice, const SkRect& dst, const SkPaint* paint); + + virtual void onDrawAtlas(const SkImage* atlas, const SkRSXform xform[], const SkRect rect[], + const SkColor colors[], int count, SkBlendMode mode, + const SkRect* cull, const SkPaint* paint); + + virtual void onDrawAnnotation(const SkRect& rect, const char key[], SkData* value); virtual void onDrawShadowRec(const SkPath&, const SkDrawShadowRec&); + virtual void onDrawDrawable(SkDrawable* drawable, const SkMatrix* matrix); + virtual void onDrawPicture(const SkPicture* picture, const SkMatrix* matrix, + const SkPaint* paint); + enum ClipEdgeStyle { kHard_ClipEdgeStyle, kSoft_ClipEdgeStyle @@ -2548,9 +2551,6 @@ protected: virtual void onDiscard(); - virtual void onDrawPicture(const SkPicture* picture, const SkMatrix* matrix, - const SkPaint* paint); - // Clip rectangle bounds. Called internally by saveLayer. // returns false if the entire rectangle is entirely clipped out // If non-NULL, The imageFilter parameter will be used to expand the clip @@ -2673,7 +2673,10 @@ private: kDefault_InitFlags = 0, kConservativeRasterClip_InitFlag = 1 << 0, }; +protected: + // For use by SkNoDrawCanvas (via SkCanvasVirtualEnforcer, which can't be a friend) SkCanvas(const SkIRect& bounds, InitFlags); +private: SkCanvas(SkBaseDevice* device, InitFlags); SkCanvas(const SkBitmap&, std::unique_ptr<SkRasterHandleAllocator>, SkRasterHandleAllocator::Handle); diff --git a/include/core/SkCanvasVirtualEnforcer.h b/include/core/SkCanvasVirtualEnforcer.h new file mode 100644 index 0000000000..1999802170 --- /dev/null +++ b/include/core/SkCanvasVirtualEnforcer.h @@ -0,0 +1,85 @@ +/* + * 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 SkCanvasVirtualEnforcer_DEFINED +#define SkCanvasVirtualEnforcer_DEFINED + +#include "SkCanvas.h" + +// If you would ordinarily want to inherit from Base (eg SkCanvas, SkNWayCanvas), instead +// inherit from SkCanvasVirtualEnforcer<Base>, which will make the build fail if you forget +// to override one of SkCanvas' key virtual hooks. +template <typename Base> +class SkCanvasVirtualEnforcer : public Base { +public: + using Base::Base; + +protected: + void onDrawPaint(const SkPaint& paint) override = 0; + void onDrawRect(const SkRect& rect, const SkPaint& paint) override = 0; + void onDrawRRect(const SkRRect& rrect, const SkPaint& paint) override = 0; + void onDrawDRRect(const SkRRect& outer, const SkRRect& inner, + const SkPaint& paint) override = 0; + void onDrawOval(const SkRect& rect, const SkPaint& paint) override = 0; + void onDrawArc(const SkRect& rect, SkScalar startAngle, SkScalar sweepAngle, bool useCenter, + const SkPaint& paint) override = 0; + void onDrawPath(const SkPath& path, const SkPaint& paint) override = 0; + void onDrawRegion(const SkRegion& region, const SkPaint& paint) override = 0; + + void onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y, + const SkPaint& paint) override = 0; + void onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[], + const SkPaint& paint) override = 0; + void onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[], + SkScalar constY, const SkPaint& paint) override = 0; + void onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path, + const SkMatrix* matrix, const SkPaint& paint) override = 0; + void onDrawTextRSXform(const void* text, size_t byteLength, const SkRSXform xform[], + const SkRect* cullRect, const SkPaint& paint) override = 0; + void onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, + const SkPaint& paint) override = 0; + + void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4], + const SkPoint texCoords[4], SkBlendMode mode, + const SkPaint& paint) override = 0; + void onDrawPoints(SkCanvas::PointMode mode, size_t count, const SkPoint pts[], + const SkPaint& paint) override = 0; + void onDrawVerticesObject(const SkVertices* vertices, SkBlendMode mode, + const SkPaint& paint) override = 0; + + void onDrawImage(const SkImage* image, SkScalar dx, SkScalar dy, + const SkPaint* paint) override = 0; + void onDrawImageRect(const SkImage* image, const SkRect* src, const SkRect& dst, + const SkPaint* paint, SkCanvas::SrcRectConstraint constraint) override = 0; + void onDrawImageNine(const SkImage* image, const SkIRect& center, const SkRect& dst, + const SkPaint* paint) override = 0; + void onDrawImageLattice(const SkImage* image, const SkCanvas::Lattice& lattice, + const SkRect& dst, const SkPaint* paint) override = 0; + + void onDrawBitmap(const SkBitmap& bitmap, SkScalar dx, SkScalar dy, + const SkPaint* paint) override = 0; + void onDrawBitmapRect(const SkBitmap& bitmap, const SkRect* src, const SkRect& dst, + const SkPaint* paint, + SkCanvas::SrcRectConstraint constraint) override = 0; + void onDrawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, const SkRect& dst, + const SkPaint* paint) override = 0; + void onDrawBitmapLattice(const SkBitmap& bitmap, const SkCanvas::Lattice& lattice, + const SkRect& dst, const SkPaint* paint) override = 0; + + void onDrawAtlas(const SkImage* atlas, const SkRSXform xform[], const SkRect rect[], + const SkColor colors[], int count, SkBlendMode mode, const SkRect* cull, + const SkPaint* paint) override = 0; + + void onDrawAnnotation(const SkRect& rect, const char key[], SkData* value) override = 0; + void onDrawShadowRec(const SkPath&, const SkDrawShadowRec&) override = 0; + + void onDrawDrawable(SkDrawable* drawable, const SkMatrix* matrix) override = 0; + void onDrawPicture(const SkPicture* picture, const SkMatrix* matrix, + const SkPaint* paint) override = 0; +}; + +#endif diff --git a/include/core/SkOverdrawCanvas.h b/include/core/SkOverdrawCanvas.h index 284fe6cd97..47b5e04872 100644 --- a/include/core/SkOverdrawCanvas.h +++ b/include/core/SkOverdrawCanvas.h @@ -8,6 +8,7 @@ #ifndef SkOverdrawCanvas_DEFINED #define SkOverdrawCanvas_DEFINED +#include "SkCanvasVirtualEnforcer.h" #include "SkNWayCanvas.h" /** @@ -15,7 +16,7 @@ * increments the alpha channel of each pixel every time it would have been touched * by a draw call. This is useful for detecting overdraw. */ -class SK_API SkOverdrawCanvas : public SkNWayCanvas { +class SK_API SkOverdrawCanvas : public SkCanvasVirtualEnforcer<SkNWayCanvas> { public: /* Does not take ownership of canvas */ SkOverdrawCanvas(SkCanvas*); @@ -56,6 +57,9 @@ public: void onDrawDrawable(SkDrawable*, const SkMatrix*) override; void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) override; + void onDrawAnnotation(const SkRect&, const char key[], SkData* value) override; + void onDrawShadowRec(const SkPath&, const SkDrawShadowRec&) override; + private: void drawPosTextCommon(const void*, size_t, const SkScalar[], int, const SkPoint&, const SkPaint&); @@ -64,7 +68,7 @@ private: SkPaint fPaint; - typedef SkNWayCanvas INHERITED; + typedef SkCanvasVirtualEnforcer<SkNWayCanvas> INHERITED; }; #endif diff --git a/include/utils/SkNWayCanvas.h b/include/utils/SkNWayCanvas.h index ca57e59f58..e6a6b9962e 100644 --- a/include/utils/SkNWayCanvas.h +++ b/include/utils/SkNWayCanvas.h @@ -10,9 +10,10 @@ #define SkNWayCanvas_DEFINED #include "../private/SkTDArray.h" +#include "SkCanvasVirtualEnforcer.h" #include "SkNoDrawCanvas.h" -class SK_API SkNWayCanvas : public SkNoDrawCanvas { +class SK_API SkNWayCanvas : public SkCanvasVirtualEnforcer<SkNoDrawCanvas> { public: SkNWayCanvas(int width, int height); ~SkNWayCanvas() override; @@ -96,7 +97,7 @@ protected: class Iter; private: - typedef SkNoDrawCanvas INHERITED; + typedef SkCanvasVirtualEnforcer<SkNoDrawCanvas> INHERITED; }; diff --git a/include/utils/SkNoDrawCanvas.h b/include/utils/SkNoDrawCanvas.h index a261e4a2fa..7475956704 100644 --- a/include/utils/SkNoDrawCanvas.h +++ b/include/utils/SkNoDrawCanvas.h @@ -9,6 +9,7 @@ #define SkNoDrawCanvas_DEFINED #include "SkCanvas.h" +#include "SkCanvasVirtualEnforcer.h" #include "SkVertices.h" struct SkIRect; @@ -21,7 +22,7 @@ struct SkIRect; // * not backed by any device/pixels // * conservative clipping (clipping calls only use rectangles) // -class SK_API SkNoDrawCanvas : public SkCanvas { +class SK_API SkNoDrawCanvas : public SkCanvasVirtualEnforcer<SkCanvas> { public: SkNoDrawCanvas(int width, int height); @@ -37,6 +38,7 @@ protected: SaveLayerStrategy getSaveLayerStrategy(const SaveLayerRec& rec) override; // No-op overrides for aborting rasterization earlier than SkNullBlitter. + void onDrawAnnotation(const SkRect&, const char[], SkData*) override {} void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) override {} void onDrawDrawable(SkDrawable*, const SkMatrix*) override {} void onDrawText(const void*, size_t, SkScalar, SkScalar, const SkPaint&) override {} @@ -75,9 +77,10 @@ protected: void onDrawAtlas(const SkImage*, const SkRSXform[], const SkRect[], const SkColor[], int, SkBlendMode, const SkRect*, const SkPaint*) override {} void onDrawShadowRec(const SkPath&, const SkDrawShadowRec&) override {} + void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) override {} private: - typedef SkCanvas INHERITED; + typedef SkCanvasVirtualEnforcer<SkCanvas> INHERITED; }; #endif // SkNoDrawCanvas_DEFINED diff --git a/include/utils/SkPaintFilterCanvas.h b/include/utils/SkPaintFilterCanvas.h index 29727a74c9..72c9784725 100644 --- a/include/utils/SkPaintFilterCanvas.h +++ b/include/utils/SkPaintFilterCanvas.h @@ -8,6 +8,7 @@ #ifndef SkPaintFilterCanvas_DEFINED #define SkPaintFilterCanvas_DEFINED +#include "SkCanvasVirtualEnforcer.h" #include "SkNWayCanvas.h" #include "SkTLazy.h" @@ -15,7 +16,7 @@ A utility proxy base class for implementing draw/paint filters. */ -class SK_API SkPaintFilterCanvas : public SkNWayCanvas { +class SK_API SkPaintFilterCanvas : public SkCanvasVirtualEnforcer<SkNWayCanvas> { public: /** * The new SkPaintFilterCanvas is configured for forwarding to the @@ -108,6 +109,8 @@ protected: const SkPaint& paint) override; void onDrawAtlas(const SkImage*, const SkRSXform[], const SkRect[], const SkColor[], int, SkBlendMode, const SkRect*, const SkPaint*) override; + void onDrawAnnotation(const SkRect& rect, const char key[], SkData* value) override; + void onDrawShadowRec(const SkPath& path, const SkDrawShadowRec& rec) override; // Forwarded to the wrapped canvas. sk_sp<SkSurface> onNewSurface(const SkImageInfo&, const SkSurfaceProps&) override; @@ -120,8 +123,6 @@ private: class AutoPaintFilter; SkCanvas* proxy() const { SkASSERT(fList.count() == 1); return fList[0]; } - - typedef SkNWayCanvas INHERITED; }; #endif |