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

Unified Diff: skia/ext/cdl_shader.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_shader.h ('k') | skia/ext/cdl_surface.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: skia/ext/cdl_shader.cc
diff --git a/skia/ext/cdl_shader.cc b/skia/ext/cdl_shader.cc
new file mode 100644
index 0000000000000000000000000000000000000000..a8419928ce7f4f18af5a7dac0f6c10f267c48c69
--- /dev/null
+++ b/skia/ext/cdl_shader.cc
@@ -0,0 +1,132 @@
+/*
+ * 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_shader.h"
+
+#if CDL_ENABLED
+
+#include "base/synchronization/lock.h"
+#include "skia/ext/cdl_picture.h"
+#include "third_party/skia/include/core/SkMatrix.h"
+#include "third_party/skia/include/core/SkPicture.h"
+#include "third_party/skia/include/core/SkShader.h"
+
+CdlShader::CdlShader(const SkMatrix* local_matrix) {
+ if (local_matrix) {
+ local_matrix_ = *local_matrix;
+ } else {
+ local_matrix_.reset();
+ }
+ // Pre-cache so future calls to local_matrix_.getType() are threadsafe.
+ (void)local_matrix_.getType();
+}
+
+CdlShader::~CdlShader() {}
+
+bool CdlShader::isOpaque() const {
+ return false;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+class CdlWrapSkShader : public CdlShader {
+ public:
+ CdlWrapSkShader(sk_sp<SkShader> shader) : shader_(std::move(shader)) {}
+
+ sk_sp<SkShader> createSkShader() override { return shader_; }
+
+ bool isOpaque() const override { return shader_->isOpaque(); }
+
+ private:
+ sk_sp<SkShader> shader_;
+};
+
+sk_sp<CdlShader> CdlShader::WrapSkShader(sk_sp<SkShader> shader) {
+ return sk_make_sp<CdlWrapSkShader>(std::move(shader));
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+class CdlImageShader : public CdlShader {
+ public:
+ CdlImageShader(sk_sp<SkImage> image,
+ SkShader::TileMode tmx,
+ SkShader::TileMode tmy,
+ const SkMatrix* local_matrix)
+ : CdlShader(local_matrix),
+ image_(std::move(image)),
+ tmx_(tmx),
+ tmy_(tmy) {}
+
+ sk_sp<SkShader> createSkShader() override {
+ base::AutoLock hold(shader_lock_);
+ if (shader_.get())
+ return shader_;
+
+ return shader_ = image_->makeShader(tmx_, tmy_, &getLocalMatrix());
+ }
+
+ bool isOpaque() const override { return image_->isOpaque(); }
+
+ private:
+ sk_sp<SkImage> image_;
+ SkShader::TileMode tmx_, tmy_;
+
+ base::Lock shader_lock_;
+ sk_sp<SkShader> shader_;
+};
+
+sk_sp<CdlShader> CdlShader::MakeImageShader(sk_sp<SkImage> image,
+ SkShader::TileMode tmx,
+ SkShader::TileMode tmy,
+ const SkMatrix* local_matrix) {
+ return sk_sp<CdlShader>(new CdlImageShader(image, tmx, tmy, local_matrix));
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+class CdlPictureShader : public CdlShader {
+ public:
+ CdlPictureShader(sk_sp<CdlPicture> picture,
+ SkShader::TileMode tmx,
+ SkShader::TileMode tmy,
+ const SkMatrix* local_matrix,
+ const SkRect* tile)
+ : CdlShader(local_matrix),
+ picture_(std::move(picture)),
+ tile_(tile ? *tile : picture_->cullRect()),
+ tmx_(tmx),
+ tmy_(tmy) {}
+
+ sk_sp<SkShader> createSkShader() override {
+ base::AutoLock hold(shader_lock_);
+ if (shader_.get())
+ return shader_;
+
+ return shader_ = SkShader::MakePictureShader(
+ picture_->toSkPicture(), tmx_, tmy_, &getLocalMatrix(), &tile_);
+ }
+
+ private:
+ sk_sp<CdlPicture> picture_;
+ SkRect tile_;
+ SkShader::TileMode tmx_, tmy_;
+
+ base::Lock shader_lock_;
+ sk_sp<SkShader> shader_;
+};
+
+sk_sp<CdlShader> CdlShader::MakePictureShader(sk_sp<CdlPicture> picture,
+ SkShader::TileMode tmx,
+ SkShader::TileMode tmy,
+ const SkMatrix* local_matrix,
+ const SkRect* tile) {
+ return sk_sp<CdlShader>(
+ new CdlPictureShader(picture, tmx, tmy, local_matrix, tile));
+}
+
+#endif // CDL_ENABLED
« no previous file with comments | « skia/ext/cdl_shader.h ('k') | skia/ext/cdl_surface.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698