Index: src/utils/SkDeferredCanvas.h |
diff --git a/include/utils/SkNWayCanvas.h b/src/utils/SkDeferredCanvas.h |
similarity index 57% |
copy from include/utils/SkNWayCanvas.h |
copy to src/utils/SkDeferredCanvas.h |
index a4b9c594122e6d1a51e46c4f77d9db67a245fa5d..6400734deffba0da5530edc35ff7df2453ddb475 100644 |
--- a/include/utils/SkNWayCanvas.h |
+++ b/src/utils/SkDeferredCanvas.h |
@@ -1,35 +1,39 @@ |
/* |
- * Copyright 2011 Google Inc. |
+ * Copyright 2016 Google Inc. |
* |
* Use of this source code is governed by a BSD-style license that can be |
* found in the LICENSE file. |
*/ |
-#ifndef SkNWayCanvas_DEFINED |
-#define SkNWayCanvas_DEFINED |
+#ifndef SkDeferredCanvas_DEFINED |
+#define SkDeferredCanvas_DEFINED |
#include "../private/SkTDArray.h" |
#include "SkCanvas.h" |
-class SK_API SkNWayCanvas : public SkCanvas { |
+class SK_API SkDeferredCanvas : public SkCanvas { |
public: |
- SkNWayCanvas(int width, int height); |
- virtual ~SkNWayCanvas(); |
- |
- virtual void addCanvas(SkCanvas*); |
- virtual void removeCanvas(SkCanvas*); |
- virtual void removeAll(); |
- |
- /////////////////////////////////////////////////////////////////////////// |
- // These are forwarded to the N canvases we're referencing |
+ SkDeferredCanvas(SkCanvas*); |
+ ~SkDeferredCanvas() override; |
#ifdef SK_SUPPORT_LEGACY_DRAWFILTER |
SkDrawFilter* setDrawFilter(SkDrawFilter*) override; |
#endif |
protected: |
- SkTDArray<SkCanvas*> fList; |
+ sk_sp<SkSurface> onNewSurface(const SkImageInfo&, const SkSurfaceProps&) override; |
+ SkISize getBaseLayerSize() const override; |
+ bool getClipBounds(SkRect* bounds) const override; |
+ bool getClipDeviceBounds(SkIRect* bounds) const override; |
+ bool isClipEmpty() const override; |
+ bool isClipRect() const override; |
+ bool onPeekPixels(SkPixmap*) override; |
+ bool onAccessTopLayerPixels(SkPixmap*) override; |
+ SkImageInfo onImageInfo() const override; |
+ bool onGetProps(SkSurfaceProps*) const override; |
+ void onFlush() override; |
+// SkCanvas* canvasForDrawIter() override; |
void willSave() override; |
SaveLayerStrategy getSaveLayerStrategy(const SaveLayerRec&) override; |
@@ -47,10 +51,10 @@ protected: |
SkScalar constY, const SkPaint&) override; |
virtual void onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path, |
const SkMatrix* matrix, const SkPaint&) override; |
+ void onDrawTextRSXform(const void* text, size_t byteLength, const SkRSXform[], |
+ const SkRect* cullRect, const SkPaint&) override; |
virtual void onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, |
const SkPaint& paint) override; |
- void onDrawTextRSXform(const void* text, size_t byteLength, const SkRSXform xform[], |
- const SkRect* cull, const SkPaint& paint) override; |
virtual void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4], |
const SkPoint texCoords[4], SkXfermode* xmode, |
const SkPaint& paint) override; |
@@ -69,23 +73,73 @@ protected: |
const SkPaint*, SrcRectConstraint) override; |
void onDrawBitmapNine(const SkBitmap&, const SkIRect& center, const SkRect& dst, |
const SkPaint*) override; |
+ void onDrawImageNine(const SkImage* image, const SkIRect& center, |
+ const SkRect& dst, const SkPaint*) override; |
void onDrawVertices(VertexMode vmode, int vertexCount, |
const SkPoint vertices[], const SkPoint texs[], |
const SkColor colors[], SkXfermode* xmode, |
const uint16_t indices[], int indexCount, |
const SkPaint&) override; |
+ void onDrawAtlas(const SkImage* image, const SkRSXform xform[], |
+ const SkRect rects[], const SkColor colors[], |
+ int count, SkXfermode::Mode mode, |
+ const SkRect* cull, const SkPaint* paint) override; |
void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) override; |
void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) override; |
void onClipPath(const SkPath&, SkRegion::Op, ClipEdgeStyle) override; |
void onClipRegion(const SkRegion&, SkRegion::Op) override; |
+ void onDrawDrawable(SkDrawable*, const SkMatrix*) override; |
void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) override; |
void onDrawAnnotation(const SkRect&, const char[], SkData*) override; |
class Iter; |
private: |
+ SkCanvas* fCanvas; |
+ |
+ enum Type { |
+ kSave_Type, |
+ kClipRect_Type, |
+ kTrans_Type, |
+ kScaleTrans_Type, |
+ }; |
+ struct Rec { |
+ Type fType; |
+ union { |
+ SkRect fBounds; |
+ SkVector fTranslate; |
+ struct { |
+ SkVector fScale; |
+ SkVector fTrans; // post translate |
+ } fScaleTrans; |
+ } fData; |
+ |
+ bool isConcat(SkMatrix*) const; |
+ void getConcat(SkMatrix* mat) const { |
+ SkDEBUGCODE(bool isconcat = ) this->isConcat(mat); |
+ SkASSERT(isconcat); |
+ } |
+ void setConcat(const SkMatrix&); |
+ }; |
+ SkTDArray<Rec> fRecs; |
+ |
+ void push_save(); |
+ void push_cliprect(const SkRect&); |
+ bool push_concat(const SkMatrix&); |
+ |
+ void emit(const Rec& rec); |
+ |
+ void flush_all(); |
+ void flush_before_saves(); |
+ void flush_le(int index); |
+ void flush_translate(SkScalar* x, SkScalar* y, const SkPaint&); |
+ void flush_translate(SkScalar* x, SkScalar* y, const SkRect& bounds, const SkPaint* = nullptr); |
+ void flush_check(SkRect* bounds, const SkPaint*, unsigned flags = 0); |
+ |
+ void internal_flush_translate(SkScalar* x, SkScalar* y, const SkRect* boundsOrNull); |
+ |
typedef SkCanvas INHERITED; |
}; |