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

Side by Side 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 unified diff | Download patch
« no previous file with comments | « skia/ext/cdl_shader.h ('k') | skia/ext/cdl_surface.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 /*
2 * Copyright 2016 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8 #include "cdl_shader.h"
9
10 #if CDL_ENABLED
11
12 #include "base/synchronization/lock.h"
13 #include "skia/ext/cdl_picture.h"
14 #include "third_party/skia/include/core/SkMatrix.h"
15 #include "third_party/skia/include/core/SkPicture.h"
16 #include "third_party/skia/include/core/SkShader.h"
17
18 CdlShader::CdlShader(const SkMatrix* local_matrix) {
19 if (local_matrix) {
20 local_matrix_ = *local_matrix;
21 } else {
22 local_matrix_.reset();
23 }
24 // Pre-cache so future calls to local_matrix_.getType() are threadsafe.
25 (void)local_matrix_.getType();
26 }
27
28 CdlShader::~CdlShader() {}
29
30 bool CdlShader::isOpaque() const {
31 return false;
32 }
33
34 ////////////////////////////////////////////////////////////////////////////////
35
36 class CdlWrapSkShader : public CdlShader {
37 public:
38 CdlWrapSkShader(sk_sp<SkShader> shader) : shader_(std::move(shader)) {}
39
40 sk_sp<SkShader> createSkShader() override { return shader_; }
41
42 bool isOpaque() const override { return shader_->isOpaque(); }
43
44 private:
45 sk_sp<SkShader> shader_;
46 };
47
48 sk_sp<CdlShader> CdlShader::WrapSkShader(sk_sp<SkShader> shader) {
49 return sk_make_sp<CdlWrapSkShader>(std::move(shader));
50 }
51
52 ////////////////////////////////////////////////////////////////////////////////
53
54 class CdlImageShader : public CdlShader {
55 public:
56 CdlImageShader(sk_sp<SkImage> image,
57 SkShader::TileMode tmx,
58 SkShader::TileMode tmy,
59 const SkMatrix* local_matrix)
60 : CdlShader(local_matrix),
61 image_(std::move(image)),
62 tmx_(tmx),
63 tmy_(tmy) {}
64
65 sk_sp<SkShader> createSkShader() override {
66 base::AutoLock hold(shader_lock_);
67 if (shader_.get())
68 return shader_;
69
70 return shader_ = image_->makeShader(tmx_, tmy_, &getLocalMatrix());
71 }
72
73 bool isOpaque() const override { return image_->isOpaque(); }
74
75 private:
76 sk_sp<SkImage> image_;
77 SkShader::TileMode tmx_, tmy_;
78
79 base::Lock shader_lock_;
80 sk_sp<SkShader> shader_;
81 };
82
83 sk_sp<CdlShader> CdlShader::MakeImageShader(sk_sp<SkImage> image,
84 SkShader::TileMode tmx,
85 SkShader::TileMode tmy,
86 const SkMatrix* local_matrix) {
87 return sk_sp<CdlShader>(new CdlImageShader(image, tmx, tmy, local_matrix));
88 }
89
90 ////////////////////////////////////////////////////////////////////////////////
91
92 class CdlPictureShader : public CdlShader {
93 public:
94 CdlPictureShader(sk_sp<CdlPicture> picture,
95 SkShader::TileMode tmx,
96 SkShader::TileMode tmy,
97 const SkMatrix* local_matrix,
98 const SkRect* tile)
99 : CdlShader(local_matrix),
100 picture_(std::move(picture)),
101 tile_(tile ? *tile : picture_->cullRect()),
102 tmx_(tmx),
103 tmy_(tmy) {}
104
105 sk_sp<SkShader> createSkShader() override {
106 base::AutoLock hold(shader_lock_);
107 if (shader_.get())
108 return shader_;
109
110 return shader_ = SkShader::MakePictureShader(
111 picture_->toSkPicture(), tmx_, tmy_, &getLocalMatrix(), &tile_);
112 }
113
114 private:
115 sk_sp<CdlPicture> picture_;
116 SkRect tile_;
117 SkShader::TileMode tmx_, tmy_;
118
119 base::Lock shader_lock_;
120 sk_sp<SkShader> shader_;
121 };
122
123 sk_sp<CdlShader> CdlShader::MakePictureShader(sk_sp<CdlPicture> picture,
124 SkShader::TileMode tmx,
125 SkShader::TileMode tmy,
126 const SkMatrix* local_matrix,
127 const SkRect* tile) {
128 return sk_sp<CdlShader>(
129 new CdlPictureShader(picture, tmx, tmy, local_matrix, tile));
130 }
131
132 #endif // CDL_ENABLED
OLDNEW
« 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