11db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger/*
21db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger * Copyright (C) 2015 The Android Open Source Project
31db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger *
41db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger * Licensed under the Apache License, Version 2.0 (the "License");
51db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger * you may not use this file except in compliance with the License.
61db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger * You may obtain a copy of the License at
71db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger *
81db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger *      http://www.apache.org/licenses/LICENSE-2.0
91db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger *
101db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger * Unless required by applicable law or agreed to in writing, software
111db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger * distributed under the License is distributed on an "AS IS" BASIS,
121db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger * See the License for the specific language governing permissions and
141db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger * limitations under the License.
151db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger */
161db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
171db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger#ifndef SkiaCanvasProxy_DEFINED
181db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger#define SkiaCanvasProxy_DEFINED
191db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
201db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger#include <cutils/compiler.h>
211db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger#include <SkCanvas.h>
221db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
23dccca44ffda4836b56a21da95a046c9708ffd49csergeyv#include "hwui/Canvas.h"
241db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
251db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergernamespace android {
261db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergernamespace uirenderer {
271db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
281db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger/**
291db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger * This class serves as a proxy between Skia's SkCanvas and Android Framework's
30b1476ae7d515d6c406b4367cfb4ada8ce2d116e1Tom Hudson * Canvas.  The class does not maintain any draw-related state and will pass
31b1476ae7d515d6c406b4367cfb4ada8ce2d116e1Tom Hudson * through most requests directly to the Canvas provided in the constructor.
321db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger *
331db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger * Upon construction it is expected that the provided Canvas has already been
341db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger * prepared for recording and will continue to be in the recording state while
351db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger * this proxy class is being used.
36b1476ae7d515d6c406b4367cfb4ada8ce2d116e1Tom Hudson *
37b1476ae7d515d6c406b4367cfb4ada8ce2d116e1Tom Hudson * If filterHwuiCalls is true, the proxy silently ignores away draw calls that
38b1476ae7d515d6c406b4367cfb4ada8ce2d116e1Tom Hudson * aren't supported by HWUI.
391db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger */
401db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergerclass ANDROID_API SkiaCanvasProxy : public SkCanvas {
411db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergerpublic:
42faecb78a6b11c780db47bc940ca7662899ab5d5eChih-Hung Hsieh    explicit SkiaCanvasProxy(Canvas* canvas, bool filterHwuiCalls = false);
431db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    virtual ~SkiaCanvasProxy() {}
441db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
451db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergerprotected:
461db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
4779fc3b1f1675364dbb739ffa511a68ed5a80f357Matt Sarett    virtual sk_sp<SkSurface> onNewSurface(const SkImageInfo&, const SkSurfaceProps&) override;
481db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
491db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    virtual void willSave() override;
505518e7cbd4e8d7a7cb3d60a4251eccc3b7fb82dbLeon Scroggins III    virtual SaveLayerStrategy getSaveLayerStrategy(const SaveLayerRec&) override;
511db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    virtual void willRestore() override;
521db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
531db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    virtual void didConcat(const SkMatrix&) override;
541db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    virtual void didSetMatrix(const SkMatrix&) override;
551db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
561db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    virtual void onDrawPaint(const SkPaint& paint) override;
571db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    virtual void onDrawPoints(PointMode, size_t count, const SkPoint pts[],
581db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger                              const SkPaint&) override;
591db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    virtual void onDrawOval(const SkRect&, const SkPaint&) override;
601db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    virtual void onDrawRect(const SkRect&, const SkPaint&) override;
611db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    virtual void onDrawRRect(const SkRRect&, const SkPaint&) override;
621db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    virtual void onDrawPath(const SkPath& path, const SkPaint&) override;
639969111d9c8017cdd439edbb2c54ef9678b24a59Yuqian Li    virtual void onDrawArc(const SkRect&, SkScalar startAngle, SkScalar sweepAngle, bool useCenter,
649969111d9c8017cdd439edbb2c54ef9678b24a59Yuqian Li                           const SkPaint&) override;
651db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    virtual void onDrawBitmap(const SkBitmap&, SkScalar left, SkScalar top,
661db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger                              const SkPaint*) override;
671db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    virtual void onDrawBitmapRect(const SkBitmap&, const SkRect* src, const SkRect& dst,
68f35b989d26bb98900f6c5fa2e586326b30b6e161Leon Scroggins III                                  const SkPaint* paint, SrcRectConstraint) override;
691db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    virtual void onDrawBitmapNine(const SkBitmap& bitmap, const SkIRect& center,
701db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger                                  const SkRect& dst, const SkPaint*) override;
71770e0b500793bce45442b5f403913d14017df4e8Stan Iliev    virtual void onDrawImage(const SkImage*, SkScalar dx, SkScalar dy, const SkPaint*);
72770e0b500793bce45442b5f403913d14017df4e8Stan Iliev    virtual void onDrawImageRect(const SkImage*, const SkRect*, const SkRect&, const SkPaint*,
73770e0b500793bce45442b5f403913d14017df4e8Stan Iliev            SrcRectConstraint);
74770e0b500793bce45442b5f403913d14017df4e8Stan Iliev    virtual void onDrawImageNine(const SkImage*, const SkIRect& center, const SkRect& dst,
75770e0b500793bce45442b5f403913d14017df4e8Stan Iliev            const SkPaint*);
76770e0b500793bce45442b5f403913d14017df4e8Stan Iliev    virtual void onDrawImageLattice(const SkImage*, const Lattice& lattice, const SkRect& dst,
77770e0b500793bce45442b5f403913d14017df4e8Stan Iliev            const SkPaint*);
78871cd2dd6074544bd41a84ff38255d81a392546aMike Reed    virtual void onDrawVerticesObject(const SkVertices*, SkBlendMode, const SkPaint&) override;
791db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
801db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    virtual void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) override;
811db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
821db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    virtual void onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y,
831db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger                            const SkPaint&) override;
841db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    virtual void onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[],
851db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger                               const SkPaint&) override;
861db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    virtual void onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[],
871db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger                                SkScalar constY, const SkPaint&) override;
881db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    virtual void onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path,
891db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger                                  const SkMatrix* matrix, const SkPaint&) override;
90afc221499d943386256feb9db46c119ff834bf79Yuqian Li    virtual void onDrawTextRSXform(const void* text, size_t byteLength, const SkRSXform[],
91afc221499d943386256feb9db46c119ff834bf79Yuqian Li                                   const SkRect* cullRect, const SkPaint& paint);
921db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    virtual void onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
931db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger                                const SkPaint& paint) override;
941db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
951db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    virtual void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
96c2f31df8b3b9a237e9abffc59c61804ad8495073Mike Reed                             const SkPoint texCoords[4], SkBlendMode,
971db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger                             const SkPaint& paint) override;
981db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
996e49c9f007c879f05b035c40c0ba543c00f9d0d0Mike Reed    virtual void onClipRect(const SkRect&, SkClipOp, ClipEdgeStyle) override;
1006e49c9f007c879f05b035c40c0ba543c00f9d0d0Mike Reed    virtual void onClipRRect(const SkRRect&, SkClipOp, ClipEdgeStyle) override;
1016e49c9f007c879f05b035c40c0ba543c00f9d0d0Mike Reed    virtual void onClipPath(const SkPath&, SkClipOp, ClipEdgeStyle) override;
1021db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
1031db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergerprivate:
1041db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    Canvas* mCanvas;
105b1476ae7d515d6c406b4367cfb4ada8ce2d116e1Tom Hudson    bool mFilterHwuiCalls;
1061db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
1071db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    typedef SkCanvas INHERITED;
1081db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger};
1091db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
1101db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger}; // namespace uirenderer
1111db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger}; // namespace android
1121db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
1131db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger#endif // SkiaCanvasProxy_DEFINED
114