Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(311)

Unified Diff: skia/ext/cdl_canvas.cc

Issue 2523673004: [NOT FOR COMMIT] Fully replace SkCanvas uses.
Patch Set: Support Android build. Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « skia/ext/cdl_canvas.h ('k') | skia/ext/cdl_common.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: skia/ext/cdl_canvas.cc
diff --git a/skia/ext/cdl_canvas.cc b/skia/ext/cdl_canvas.cc
new file mode 100644
index 0000000000000000000000000000000000000000..4b5b81039104c8909d7f047787a68922e816c190
--- /dev/null
+++ b/skia/ext/cdl_canvas.cc
@@ -0,0 +1,636 @@
+/*
+ * Copyright 2016 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "cdl_canvas.h"
+
+#if CDL_ENABLED
+
+#include "base/memory/ptr_util.h"
+#include "cdl_no_draw_canvas.h"
+#include "cdl_paint.h"
+#include "cdl_picture.h"
+#include "third_party/skia/include/core/SkCanvas.h"
+#include "third_party/skia/include/core/SkSurface.h"
+#include "third_party/skia/include/utils/SkNoDrawCanvas.h"
+#include "third_party/skia/include/utils/SkNWayCanvas.h"
+
+// TODO(cdl) LIST
+// SkRecordNoopSaveLayerDrawRestores
+
+#define RETURN_ON_NULL(ptr) \
+ do { \
+ if (nullptr == (ptr)) \
+ return; \
+ } while (0)
+
+CdlNoDrawCanvas::CdlNoDrawCanvas(int width, int height)
+ : CdlCanvas(width, height) {}
+CdlNoDrawCanvas::~CdlNoDrawCanvas() {}
+
+sk_sp<CdlCanvas> CdlCanvas::Make(SkCanvas* canvas) {
+ return sk_sp<CdlCanvas>(new CdlCanvas(canvas));
+}
+
+CdlCanvas::CdlCanvas(SkCanvas* canvas) : canvas_(canvas) {}
+
+CdlCanvas::CdlCanvas(SkBaseDevice* device) {
+ owned_canvas_ = base::MakeUnique<SkCanvas>(device);
+ canvas_ = owned_canvas_.get();
+}
+
+CdlCanvas::CdlCanvas(const SkBitmap& bitmap) {
+ owned_canvas_ = base::MakeUnique<SkCanvas>(bitmap);
+ canvas_ = owned_canvas_.get();
+}
+
+CdlCanvas::CdlCanvas(const SkBitmap& bitmap, const SkSurfaceProps& props) {
+ owned_canvas_ = base::MakeUnique<SkCanvas>(bitmap, props);
+ canvas_ = owned_canvas_.get();
+}
+
+CdlCanvas::CdlCanvas(int width, int height)
+ : owned_canvas_(new SkNoDrawCanvas(width, height)),
+ canvas_(owned_canvas_.get()) {}
+
+CdlCanvas::~CdlCanvas() {}
+
+///////////////////////////////////////////////////////////////////////////////
+// Save / Restore
+int CdlCanvas::save() {
+ return this->onSave();
+}
+
+int CdlCanvas::onSave() {
+ return canvas_->save();
+}
+
+int CdlCanvas::saveLayer(const SkRect* bounds, const CdlPaint* paint) {
+ return this->saveLayer(SaveLayerRec(bounds, paint, 0));
+}
+
+int CdlCanvas::saveLayer(const SaveLayerRec& rec) {
+ return this->onSaveLayer(rec);
+}
+
+int CdlCanvas::onSaveLayer(const SaveLayerRec& rec) {
+ SkPaint sk_paint;
+ if (rec.fPaint)
+ sk_paint = rec.fPaint->toSkPaint();
+
+ SkCanvas::SaveLayerRec sk_rec(rec.fBounds, rec.fPaint ? &sk_paint : nullptr,
+ rec.fBackdrop, rec.fSaveLayerFlags);
+ return canvas_->saveLayer(sk_rec);
+}
+
+int CdlCanvas::saveLayerAlpha(const SkRect* bounds, U8CPU alpha) {
+ if (0xFF == alpha) {
+ return this->saveLayer(bounds, nullptr);
+ } else {
+ CdlPaint tmpPaint;
+ tmpPaint.setAlpha(alpha);
+ return this->saveLayer(bounds, &tmpPaint);
+ }
+}
+
+int CdlCanvas::saveLayerPreserveLCDTextRequests(const SkRect* bounds,
+ const CdlPaint* paint) {
+ return this->saveLayer(
+ SaveLayerRec(bounds, paint, SkCanvas::kPreserveLCDText_SaveLayerFlag));
+}
+
+void CdlCanvas::restore() {
+ this->onRestore();
+}
+
+void CdlCanvas::onRestore() {
+ canvas_->restore();
+}
+
+int CdlCanvas::getSaveCount() const {
+ return canvas_->getSaveCount();
+}
+
+void CdlCanvas::restoreToCount(int count) {
+ // sanity check
+ if (count < 1) {
+ count = 1;
+ }
+
+ int n = this->getSaveCount() - count;
+ for (int i = 0; i < n; ++i) {
+ this->restore();
+ }
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// Transform
+void CdlCanvas::concat(const SkMatrix& matrix) {
+ if (matrix.isIdentity()) {
+ return;
+ }
+ this->onConcat(matrix);
+}
+
+void CdlCanvas::rotate(SkScalar degrees) {
+ SkMatrix m;
+ m.setRotate(degrees);
+ this->concat(m);
+}
+
+void CdlCanvas::scale(SkScalar sx, SkScalar sy) {
+ SkMatrix m;
+ m.setScale(sx, sy);
+ this->concat(m);
+}
+
+void CdlCanvas::translate(SkScalar dx, SkScalar dy) {
+ if (dx || dy) {
+ this->onTranslate(dx, dy);
+ }
+}
+
+void CdlCanvas::resetMatrix() {
+ this->onSetMatrix(SkMatrix::I());
+}
+
+void CdlCanvas::setMatrix(const SkMatrix& matrix) {
+ this->onSetMatrix(matrix);
+}
+
+const SkMatrix& CdlCanvas::getTotalMatrix() const {
+ return canvas_->getTotalMatrix();
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// Clip
+SkISize CdlCanvas::getBaseLayerSize() const {
+ return canvas_->getBaseLayerSize();
+}
+
+bool CdlCanvas::getClipBounds(SkRect* bounds) const {
+ return canvas_->getClipBounds(bounds);
+}
+
+bool CdlCanvas::getClipDeviceBounds(SkIRect* bounds) const {
+ return canvas_->getClipDeviceBounds(bounds);
+}
+
+const SkClipStack* CdlCanvas::getClipStack() const {
+ return canvas_->getClipStack();
+}
+
+bool CdlCanvas::isClipEmpty() const {
+ return canvas_->isClipEmpty();
+}
+
+bool CdlCanvas::isClipRect() const {
+ return canvas_->isClipRect();
+}
+
+bool CdlCanvas::quickReject(const SkRect& src) const {
+ return canvas_->quickReject(src);
+}
+
+void CdlCanvas::clipRect(const SkRect& rect, SkCanvas::ClipOp op, bool doAA) {
+ ClipEdgeStyle edgeStyle = doAA ? kSoft_ClipEdgeStyle : kHard_ClipEdgeStyle;
+ this->onClipRect(rect, op, edgeStyle);
+}
+
+void CdlCanvas::clipRRect(const SkRRect& rrect,
+ SkCanvas::ClipOp op,
+ bool doAA) {
+ ClipEdgeStyle edgeStyle = doAA ? kSoft_ClipEdgeStyle : kHard_ClipEdgeStyle;
+ if (rrect.isRect()) {
+ this->onClipRect(rrect.getBounds(), op, edgeStyle);
+ } else {
+ this->onClipRRect(rrect, op, edgeStyle);
+ }
+}
+
+void CdlCanvas::clipPath(const SkPath& path, SkCanvas::ClipOp op, bool doAA) {
+ ClipEdgeStyle edgeStyle = doAA ? kSoft_ClipEdgeStyle : kHard_ClipEdgeStyle;
+
+ if (!path.isInverseFillType() && canvas_->getTotalMatrix().rectStaysRect()) {
+ SkRect r;
+ if (path.isRect(&r)) {
+ this->onClipRect(r, op, edgeStyle);
+ return;
+ }
+ SkRRect rrect;
+ if (path.isOval(&r)) {
+ rrect.setOval(r);
+ this->onClipRRect(rrect, op, edgeStyle);
+ return;
+ }
+ if (path.isRRect(&rrect)) {
+ this->onClipRRect(rrect, op, edgeStyle);
+ return;
+ }
+ }
+
+ this->onClipPath(path, op, edgeStyle);
+}
+
+void CdlCanvas::clipRegion(const SkRegion& rgn, SkCanvas::ClipOp op) {
+ this->onClipRegion(rgn, op);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// Draw
+void CdlCanvas::drawColor(SkColor color, SkBlendMode mode) {
+ CdlPaint paint;
+ paint.setColor(color);
+ paint.setBlendMode(mode);
+ this->drawPaint(paint);
+}
+
+void CdlCanvas::drawPaint(const CdlPaint& paint) {
+ this->onDrawPaint(paint);
+}
+
+void CdlCanvas::drawPoint(SkScalar x, SkScalar y, const CdlPaint& paint) {
+ SkPoint pt;
+
+ pt.set(x, y);
+ this->drawPoints(SkCanvas::kPoints_PointMode, 1, &pt, paint);
+}
+
+void CdlCanvas::drawPoint(SkScalar x, SkScalar y, SkColor color) {
+ SkPoint pt;
+ CdlPaint paint;
+
+ pt.set(x, y);
+ paint.setColor(color);
+ this->drawPoints(SkCanvas::kPoints_PointMode, 1, &pt, paint);
+}
+
+void CdlCanvas::drawPoints(SkCanvas::PointMode mode,
+ size_t count,
+ const SkPoint pts[],
+ const CdlPaint& paint) {
+ this->onDrawPoints(mode, count, pts, paint);
+}
+
+void CdlCanvas::drawLine(SkScalar x0,
+ SkScalar y0,
+ SkScalar x1,
+ SkScalar y1,
+ const CdlPaint& paint) {
+ SkPoint pts[2];
+
+ pts[0].set(x0, y0);
+ pts[1].set(x1, y1);
+ this->drawPoints(SkCanvas::kLines_PointMode, 2, pts, paint);
+}
+
+void CdlCanvas::drawCircle(SkScalar cx,
+ SkScalar cy,
+ SkScalar radius,
+ const CdlPaint& paint) {
+ if (radius < 0) {
+ radius = 0;
+ }
+
+ SkRect r;
+ r.set(cx - radius, cy - radius, cx + radius, cy + radius);
+ this->drawOval(r, paint);
+}
+
+void CdlCanvas::drawOval(const SkRect& r, const CdlPaint& paint) {
+ this->onDrawOval(r, paint);
+}
+
+void CdlCanvas::drawRect(const SkRect& r, const CdlPaint& paint) {
+ onDrawRect(r, paint);
+}
+
+void CdlCanvas::drawRoundRect(const SkRect& r,
+ SkScalar rx,
+ SkScalar ry,
+ const CdlPaint& paint) {
+ if (rx > 0 && ry > 0) {
+ SkRRect rrect;
+ rrect.setRectXY(r, rx, ry);
+ this->drawRRect(rrect, paint);
+ } else {
+ this->drawRect(r, paint);
+ }
+}
+
+void CdlCanvas::drawRectCoords(SkScalar left,
+ SkScalar top,
+ SkScalar right,
+ SkScalar bottom,
+ const CdlPaint& paint) {
+ SkRect r;
+ r.set(left, top, right, bottom);
+ this->drawRect(r, paint);
+}
+
+void CdlCanvas::drawRRect(const SkRRect& rrect, const CdlPaint& paint) {
+ this->onDrawRRect(rrect, paint);
+}
+
+void CdlCanvas::drawDRRect(const SkRRect& outer,
+ const SkRRect& inner,
+ const CdlPaint& paint) {
+ if (outer.isEmpty()) {
+ return;
+ }
+ if (inner.isEmpty()) {
+ this->drawRRect(outer, paint);
+ return;
+ }
+
+ this->onDrawDRRect(outer, inner, paint);
+}
+
+void CdlCanvas::drawPath(const SkPath& path, const CdlPaint& paint) {
+ this->onDrawPath(path, paint);
+}
+
+void CdlCanvas::drawBitmap(const SkBitmap& bitmap,
+ SkScalar dx,
+ SkScalar dy,
+ const CdlPaint* paint) {
+ if (bitmap.drawsNothing()) {
+ return;
+ }
+ this->onDrawImage(SkImage::MakeFromBitmap(bitmap).get(), dx, dy, paint);
+}
+
+void CdlCanvas::drawImage(const SkImage* image,
+ SkScalar x,
+ SkScalar y,
+ const CdlPaint* paint) {
+ RETURN_ON_NULL(image);
+ this->onDrawImage(image, x, y, paint);
+}
+
+void CdlCanvas::drawImageRect(const SkImage* image,
+ const SkRect& src,
+ const SkRect& dst,
+ const CdlPaint* paint,
+ SkCanvas::SrcRectConstraint constraint) {
+ RETURN_ON_NULL(image);
+ if (dst.isEmpty() || src.isEmpty()) {
+ return;
+ }
+ this->onDrawImageRect(image, &src, dst, paint, constraint);
+}
+
+void CdlCanvas::drawImageRect(const SkImage* image,
+ const SkRect& dst,
+ const CdlPaint* paint,
+ SkCanvas::SrcRectConstraint constraint) {
+ RETURN_ON_NULL(image);
+ this->drawImageRect(image, SkRect::MakeIWH(image->width(), image->height()),
+ dst, paint, constraint);
+}
+
+void CdlCanvas::drawText(const void* text,
+ size_t byteLength,
+ SkScalar x,
+ SkScalar y,
+ const CdlPaint& paint) {
+ this->onDrawText(text, byteLength, x, y, paint);
+}
+
+void CdlCanvas::drawPosText(const void* text,
+ size_t byteLength,
+ const SkPoint pos[],
+ const CdlPaint& paint) {
+ if (byteLength) {
+ this->onDrawPosText(text, byteLength, pos, paint);
+ }
+}
+
+void CdlCanvas::drawTextBlob(const SkTextBlob* blob,
+ SkScalar x,
+ SkScalar y,
+ const CdlPaint& paint) {
+ RETURN_ON_NULL(blob);
+ this->onDrawTextBlob(blob, x, y, paint);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// Misc
+void CdlCanvas::flush() {
+ canvas_->flush();
+}
+
+bool CdlCanvas::readPixels(SkBitmap* bitmap, int srcX, int srcY) {
+ return canvas_->readPixels(bitmap, srcX, srcY);
+}
+
+bool CdlCanvas::writePixels(const SkImageInfo& origInfo,
+ const void* pixels,
+ size_t rowBytes,
+ int x,
+ int y) {
+ return canvas_->writePixels(origInfo, pixels, rowBytes, x, y);
+}
+
+bool CdlCanvas::writePixels(const SkBitmap& bitmap, int x, int y) {
+ return canvas_->writePixels(bitmap, x, y);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// Default pass-through implementation
+void CdlCanvas::onConcat(SkMatrix const& matrix) {
+ canvas_->concat(matrix);
+}
+
+void CdlCanvas::onSetMatrix(SkMatrix const& matrix) {
+ canvas_->setMatrix(matrix);
+}
+
+void CdlCanvas::onTranslate(float dx, float dy) {
+ canvas_->translate(dx, dy);
+}
+
+void CdlCanvas::onClipRect(SkRect const& r,
+ SkRegion::Op op,
+ CdlCanvas::ClipEdgeStyle style) {
+ canvas_->clipRect(r, op, style == kSoft_ClipEdgeStyle);
+}
+void CdlCanvas::onClipRRect(SkRRect const& r,
+ SkRegion::Op op,
+ CdlCanvas::ClipEdgeStyle style) {
+ canvas_->clipRRect(r, op, style == kSoft_ClipEdgeStyle);
+}
+void CdlCanvas::onClipPath(SkPath const& p,
+ SkRegion::Op op,
+ CdlCanvas::ClipEdgeStyle style) {
+ canvas_->clipPath(p, op, style == kSoft_ClipEdgeStyle);
+}
+void CdlCanvas::onClipRegion(SkRegion const& r, SkRegion::Op op) {
+ canvas_->clipRegion(r, op);
+}
+void CdlCanvas::onDiscard() {
+ canvas_->discard();
+}
+void CdlCanvas::onDrawPaint(CdlPaint const& paint) {
+ canvas_->drawPaint(paint.toSkPaint());
+}
+void CdlCanvas::onDrawPath(SkPath const& p, CdlPaint const& paint) {
+ canvas_->drawPath(p, paint.toSkPaint());
+}
+void CdlCanvas::onDrawRect(SkRect const& r, CdlPaint const& paint) {
+ canvas_->drawRect(r, paint.toSkPaint());
+}
+void CdlCanvas::onDrawOval(SkRect const& r, CdlPaint const& paint) {
+ canvas_->drawOval(r, paint.toSkPaint());
+}
+
+void CdlCanvas::onDrawRRect(SkRRect const& r, CdlPaint const& paint) {
+ canvas_->drawRRect(r, paint.toSkPaint());
+}
+void CdlCanvas::onDrawDRRect(const SkRRect& outer,
+ const SkRRect& inner,
+ const CdlPaint& paint) {
+ canvas_->drawDRRect(outer, inner, paint.toSkPaint());
+}
+
+void CdlCanvas::drawPicture(const CdlPicture* picture,
+ const SkMatrix* matrix,
+ const CdlPaint* paint) {
+ RETURN_ON_NULL(picture);
+
+ if (matrix && matrix->isIdentity()) {
+ matrix = nullptr;
+ }
+
+ this->onDrawPicture(picture, matrix, paint);
+}
+
+class CdlAutoCanvasMatrixPaint {
+ public:
+ CdlAutoCanvasMatrixPaint(CdlCanvas* canvas,
+ const SkMatrix* matrix,
+ const CdlPaint* paint,
+ const SkRect& bounds)
+ : fCanvas(canvas), fSaveCount(canvas->getSaveCount()) {
+ if (paint) {
+ SkRect newBounds = bounds;
+ if (matrix) {
+ matrix->mapRect(&newBounds);
+ }
+ canvas->saveLayer(&newBounds, paint);
+ } else if (matrix) {
+ canvas->save();
+ }
+
+ if (matrix) {
+ canvas->concat(*matrix);
+ }
+ }
+
+ ~CdlAutoCanvasMatrixPaint() { fCanvas->restoreToCount(fSaveCount); }
+
+ private:
+ CdlCanvas* fCanvas;
+ int fSaveCount;
+};
+
+void CdlCanvas::onDrawPicture(const CdlPicture* picture,
+ const SkMatrix* matrix,
+ const CdlPaint* paint) {
+ if (!paint || paint->canComputeFastBounds()) {
+ SkRect bounds = picture->cullRect();
+
+ if (paint) {
+ paint->computeFastBounds(bounds, &bounds);
+ }
+ if (matrix) {
+ matrix->mapRect(&bounds);
+ }
+ if (this->quickReject(bounds)) {
+ return;
+ }
+ }
+
+ CdlAutoCanvasMatrixPaint acmp(this, matrix, paint, picture->cullRect());
+ picture->playback(this);
+}
+
+void CdlCanvas::onDrawAnnotation(SkRect const& r, char const* c, SkData* d) {
+ canvas_->drawAnnotation(r, c, d);
+}
+
+void CdlCanvas::onDrawText(const void* text,
+ size_t byteLength,
+ SkScalar x,
+ SkScalar y,
+ const CdlPaint& paint) {
+ canvas_->drawText(text, byteLength, x, y, paint.toSkPaint());
+}
+
+void CdlCanvas::onDrawPosText(const void* text,
+ size_t byteLength,
+ const SkPoint pos[],
+ const CdlPaint& paint) {
+ canvas_->drawPosText(text, byteLength, pos, paint.toSkPaint());
+}
+
+void CdlCanvas::onDrawTextBlob(const SkTextBlob* blob,
+ SkScalar x,
+ SkScalar y,
+ const CdlPaint& paint) {
+ canvas_->drawTextBlob(blob, x, y, paint.toSkPaint());
+}
+
+void CdlCanvas::onDrawImage(const SkImage* image,
+ SkScalar x,
+ SkScalar y,
+ const CdlPaint* paint) {
+ SkPaint sk_paint;
+ if (paint)
+ sk_paint = paint->toSkPaint();
+ canvas_->drawImage(image, x, y, paint ? &sk_paint : nullptr);
+}
+
+void CdlCanvas::onDrawImageRect(const SkImage* image,
+ const SkRect* src,
+ const SkRect& dst,
+ const CdlPaint* paint,
+ SkCanvas::SrcRectConstraint constraint) {
+ SkPaint sk_paint;
+ if (paint)
+ sk_paint = paint->toSkPaint();
+ canvas_->drawImageRect(image, *src, dst, paint ? &sk_paint : nullptr,
+ constraint);
+}
+
+void CdlCanvas::onDrawPoints(SkCanvas::PointMode mode,
+ size_t count,
+ const SkPoint pts[],
+ const CdlPaint& paint) {
+ canvas_->drawPoints(mode, count, pts, paint.toSkPaint());
+}
+
+CdlPassThroughCanvas::CdlPassThroughCanvas(SkCanvas* canvas)
+ : CdlCanvas(canvas) {}
+CdlPassThroughCanvas::~CdlPassThroughCanvas() {}
+
+#else // CDL_ENABLED
+
+#include "third_party/skia/include/utils/SkNWayCanvas.h"
+
+CdlPassThroughCanvas::CdlPassThroughCanvas(SkCanvas* canvas)
+ : SkNWayCanvas(canvas->getBaseLayerSize().width(),
+ canvas->getBaseLayerSize().height()) {
+ SkIRect raster_bounds;
+ canvas->getClipDeviceBounds(&raster_bounds);
+ this->clipRect(SkRect::MakeFromIRect(raster_bounds));
+ this->setMatrix(canvas->getTotalMatrix());
+ this->addCanvas(canvas);
+}
+
+CdlPassThroughCanvas::~CdlPassThroughCanvas() {}
+
+#endif // CDL_ENABLED
« no previous file with comments | « skia/ext/cdl_canvas.h ('k') | skia/ext/cdl_common.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698