summaryrefslogtreecommitdiff
path: root/libs/hwui/RecordingCanvas.h
diff options
context:
space:
mode:
authorJohn Reck <jreck@google.com>2018-08-15 10:17:12 -0700
committerJohn Reck <jreck@google.com>2018-08-29 13:53:36 -0700
commit8f45d4afd95e73fab931722038fb411ab3f1603d (patch)
treef4bfbe131830757a25a56952c04ff9838c8053af /libs/hwui/RecordingCanvas.h
parent0ce807abd5216010a085db207ef7799d3e7f549c (diff)
New DisplayList v2
First step of many * Pulls SkLiteDL and SkLiteRecorder into HWUI * forceDark shifted to be a sync-time transformation instead of record time. No meaningful behavior change, but much more flexible heuristics are possible this way. Test: build, poked around with forceDark on Change-Id: I7b7cec5b7fd7c2b18823b4d92d821cf5898f9b88
Diffstat (limited to 'libs/hwui/RecordingCanvas.h')
-rw-r--r--libs/hwui/RecordingCanvas.h203
1 files changed, 203 insertions, 0 deletions
diff --git a/libs/hwui/RecordingCanvas.h b/libs/hwui/RecordingCanvas.h
new file mode 100644
index 000000000000..32ce1d333448
--- /dev/null
+++ b/libs/hwui/RecordingCanvas.h
@@ -0,0 +1,203 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "CanvasTransform.h"
+#include "hwui/Canvas.h"
+#include "utils/Macros.h"
+#include "utils/TypeLogic.h"
+
+#include "SkCanvas.h"
+#include "SkCanvasVirtualEnforcer.h"
+#include "SkDrawable.h"
+#include "SkNoDrawCanvas.h"
+#include "SkPaint.h"
+#include "SkPath.h"
+#include "SkRect.h"
+#include "SkTDArray.h"
+#include "SkTemplates.h"
+
+#include <vector>
+
+namespace android {
+namespace uirenderer {
+
+enum class DisplayListOpType : uint8_t {
+#define X(T) T,
+#include "DisplayListOps.in"
+#undef X
+};
+
+struct DisplayListOp {
+ const uint8_t type : 8;
+ const uint32_t skip : 24;
+};
+
+static_assert(sizeof(DisplayListOp) == 4);
+
+class RecordingCanvas;
+
+class DisplayListData final {
+public:
+ ~DisplayListData();
+
+ void draw(SkCanvas* canvas) const;
+
+ void reset();
+ bool empty() const { return fUsed == 0; }
+
+ void applyColorTransform(ColorTransform transform);
+
+private:
+ friend class RecordingCanvas;
+
+ void flush();
+
+ void save();
+ void saveLayer(const SkRect*, const SkPaint*, const SkImageFilter*, const SkImage*,
+ const SkMatrix*, SkCanvas::SaveLayerFlags);
+ void restore();
+
+ void concat(const SkMatrix&);
+ void setMatrix(const SkMatrix&);
+ void translate(SkScalar, SkScalar);
+ void translateZ(SkScalar);
+
+ void clipPath(const SkPath&, SkClipOp, bool aa);
+ void clipRect(const SkRect&, SkClipOp, bool aa);
+ void clipRRect(const SkRRect&, SkClipOp, bool aa);
+ void clipRegion(const SkRegion&, SkClipOp);
+
+ void drawPaint(const SkPaint&);
+ void drawPath(const SkPath&, const SkPaint&);
+ void drawRect(const SkRect&, const SkPaint&);
+ void drawRegion(const SkRegion&, const SkPaint&);
+ void drawOval(const SkRect&, const SkPaint&);
+ void drawArc(const SkRect&, SkScalar, SkScalar, bool, const SkPaint&);
+ void drawRRect(const SkRRect&, const SkPaint&);
+ void drawDRRect(const SkRRect&, const SkRRect&, const SkPaint&);
+
+ void drawAnnotation(const SkRect&, const char*, SkData*);
+ void drawDrawable(SkDrawable*, const SkMatrix*);
+ void drawPicture(const SkPicture*, const SkMatrix*, const SkPaint*);
+
+ void drawText(const void*, size_t, SkScalar, SkScalar, const SkPaint&);
+ void drawPosText(const void*, size_t, const SkPoint[], const SkPaint&);
+ void drawPosTextH(const void*, size_t, const SkScalar[], SkScalar, const SkPaint&);
+ void drawTextRSXform(const void*, size_t, const SkRSXform[], const SkRect*, const SkPaint&);
+ void drawTextBlob(const SkTextBlob*, SkScalar, SkScalar, const SkPaint&);
+
+ void drawImage(sk_sp<const SkImage>, SkScalar, SkScalar, const SkPaint*);
+ void drawImageNine(sk_sp<const SkImage>, const SkIRect&, const SkRect&, const SkPaint*);
+ void drawImageRect(sk_sp<const SkImage>, const SkRect*, const SkRect&, const SkPaint*,
+ SkCanvas::SrcRectConstraint);
+ void drawImageLattice(sk_sp<const SkImage>, const SkCanvas::Lattice&, const SkRect&,
+ const SkPaint*);
+
+ void drawPatch(const SkPoint[12], const SkColor[4], const SkPoint[4], SkBlendMode,
+ const SkPaint&);
+ void drawPoints(SkCanvas::PointMode, size_t, const SkPoint[], const SkPaint&);
+ void drawVertices(const SkVertices*, const SkVertices::Bone bones[], int boneCount, SkBlendMode,
+ const SkPaint&);
+ void drawAtlas(const SkImage*, const SkRSXform[], const SkRect[], const SkColor[], int,
+ SkBlendMode, const SkRect*, const SkPaint*);
+ void drawShadowRec(const SkPath&, const SkDrawShadowRec&);
+
+ template <typename T, typename... Args>
+ void* push(size_t, Args&&...);
+
+ template <typename Fn, typename... Args>
+ void map(const Fn[], Args...) const;
+
+ SkAutoTMalloc<uint8_t> fBytes;
+ size_t fUsed = 0;
+ size_t fReserved = 0;
+};
+
+class RecordingCanvas final : public SkCanvasVirtualEnforcer<SkNoDrawCanvas> {
+public:
+ RecordingCanvas();
+ void reset(DisplayListData*, const SkIRect& bounds);
+
+ sk_sp<SkSurface> onNewSurface(const SkImageInfo&, const SkSurfaceProps&) override;
+
+ void willSave() override;
+ SaveLayerStrategy getSaveLayerStrategy(const SaveLayerRec&) override;
+ void willRestore() override;
+
+ void onFlush() override;
+
+ void didConcat(const SkMatrix&) override;
+ void didSetMatrix(const SkMatrix&) override;
+ void didTranslate(SkScalar, SkScalar) override;
+
+ void onClipRect(const SkRect&, SkClipOp, ClipEdgeStyle) override;
+ void onClipRRect(const SkRRect&, SkClipOp, ClipEdgeStyle) override;
+ void onClipPath(const SkPath&, SkClipOp, ClipEdgeStyle) override;
+ void onClipRegion(const SkRegion&, SkClipOp) override;
+
+ void onDrawPaint(const SkPaint&) override;
+ void onDrawPath(const SkPath&, const SkPaint&) override;
+ void onDrawRect(const SkRect&, const SkPaint&) override;
+ void onDrawRegion(const SkRegion&, const SkPaint&) override;
+ void onDrawOval(const SkRect&, const SkPaint&) override;
+ void onDrawArc(const SkRect&, SkScalar, SkScalar, bool, const SkPaint&) override;
+ void onDrawRRect(const SkRRect&, const SkPaint&) override;
+ void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) override;
+
+ void onDrawDrawable(SkDrawable*, const SkMatrix*) override;
+ void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) override;
+ void onDrawAnnotation(const SkRect&, const char[], SkData*) override;
+
+ void onDrawText(const void*, size_t, SkScalar x, SkScalar y, const SkPaint&) override;
+ void onDrawPosText(const void*, size_t, const SkPoint[], const SkPaint&) override;
+ void onDrawPosTextH(const void*, size_t, const SkScalar[], SkScalar, const SkPaint&) override;
+
+ void onDrawTextRSXform(const void*, size_t, const SkRSXform[], const SkRect*,
+ const SkPaint&) override;
+ void onDrawTextBlob(const SkTextBlob*, SkScalar, SkScalar, const SkPaint&) override;
+
+ void onDrawBitmap(const SkBitmap&, SkScalar, SkScalar, const SkPaint*) override;
+ void onDrawBitmapLattice(const SkBitmap&, const Lattice&, const SkRect&,
+ const SkPaint*) override;
+ void onDrawBitmapNine(const SkBitmap&, const SkIRect&, const SkRect&, const SkPaint*) override;
+ void onDrawBitmapRect(const SkBitmap&, const SkRect*, const SkRect&, const SkPaint*,
+ SrcRectConstraint) override;
+
+ void onDrawImage(const SkImage*, SkScalar, SkScalar, const SkPaint*) override;
+ void onDrawImageLattice(const SkImage*, const Lattice&, const SkRect&, const SkPaint*) override;
+ void onDrawImageNine(const SkImage*, const SkIRect&, const SkRect&, const SkPaint*) override;
+ void onDrawImageRect(const SkImage*, const SkRect*, const SkRect&, const SkPaint*,
+ SrcRectConstraint) override;
+
+ void onDrawPatch(const SkPoint[12], const SkColor[4], const SkPoint[4], SkBlendMode,
+ const SkPaint&) override;
+ void onDrawPoints(PointMode, size_t count, const SkPoint pts[], const SkPaint&) override;
+ void onDrawVerticesObject(const SkVertices*, const SkVertices::Bone bones[], int boneCount,
+ SkBlendMode, const SkPaint&) override;
+ void onDrawAtlas(const SkImage*, const SkRSXform[], const SkRect[], const SkColor[], int,
+ SkBlendMode, const SkRect*, const SkPaint*) override;
+ void onDrawShadowRec(const SkPath&, const SkDrawShadowRec&) override;
+
+private:
+ typedef SkCanvasVirtualEnforcer<SkNoDrawCanvas> INHERITED;
+
+ DisplayListData* fDL;
+};
+
+}; // namespace uirenderer
+}; // namespace android \ No newline at end of file