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

Side by Side Diff: src/core/SkPictureShader.cpp

Issue 261773005: Remove SkShader virtual method validContext (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: correctly call shaderA/B in composeshader Created 6 years, 7 months 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 | Annotate | Revision Log
« no previous file with comments | « src/core/SkPictureShader.h ('k') | src/core/SkShader.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2014 Google Inc. 2 * Copyright 2014 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkPictureShader.h" 8 #include "SkPictureShader.h"
9 9
10 #include "SkBitmap.h" 10 #include "SkBitmap.h"
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 fCachedBitmapShader.reset(CreateBitmapShader(bm, fTmx, fTmy, &shaderMatr ix)); 103 fCachedBitmapShader.reset(CreateBitmapShader(bm, fTmx, fTmy, &shaderMatr ix));
104 } 104 }
105 105
106 // Increment the ref counter inside the mutex to ensure the returned pointer is still valid. 106 // Increment the ref counter inside the mutex to ensure the returned pointer is still valid.
107 // Otherwise, the pointer may have been overwritten on a different thread be fore the object's 107 // Otherwise, the pointer may have been overwritten on a different thread be fore the object's
108 // ref count was incremented. 108 // ref count was incremented.
109 fCachedBitmapShader.get()->ref(); 109 fCachedBitmapShader.get()->ref();
110 return fCachedBitmapShader; 110 return fCachedBitmapShader;
111 } 111 }
112 112
113 SkShader* SkPictureShader::validInternal(const ContextRec& rec, SkMatrix* totalI nverse) const {
114 if (!this->INHERITED::validContext(rec, totalInverse)) {
115 return NULL;
116 }
117
118 SkAutoTUnref<SkShader> bitmapShader(this->refBitmapShader(*rec.fMatrix));
119 if (!bitmapShader || !bitmapShader->validContext(rec)) {
120 return NULL;
121 }
122
123 return bitmapShader.detach();
124 }
125
126 bool SkPictureShader::validContext(const ContextRec& rec, SkMatrix* totalInverse ) const {
127 SkAutoTUnref<SkShader> shader(this->validInternal(rec, totalInverse));
128 return shader != NULL;
129 }
130
131 SkShader::Context* SkPictureShader::createContext(const ContextRec& rec, void* s torage) const {
132 SkAutoTUnref<SkShader> bitmapShader(this->validInternal(rec, NULL));
133 if (!bitmapShader) {
134 return NULL;
135 }
136
137 return SkNEW_PLACEMENT_ARGS(storage, PictureShaderContext, (*this, rec, bitm apShader.detach()));
138 }
139
140 size_t SkPictureShader::contextSize() const { 113 size_t SkPictureShader::contextSize() const {
141 return sizeof(PictureShaderContext); 114 return sizeof(PictureShaderContext);
142 } 115 }
143 116
117 SkShader::Context* SkPictureShader::onCreateContext(const ContextRec& rec, void* storage) const {
118 SkAutoTUnref<SkShader> bitmapShader(this->refBitmapShader(*rec.fMatrix));
119 if (NULL == bitmapShader.get()) {
120 return NULL;
121 }
122 return PictureShaderContext::Create(storage, *this, rec, bitmapShader.detach ());
123 }
124
125 //////////////////////////////////////////////////////////////////////////////// /////////
126
127 SkShader::Context* SkPictureShader::PictureShaderContext::Create(void* storage,
128 const SkPictureShader& shader, const ContextRec& rec, SkShade r* bitmapShader) {
129 PictureShaderContext* ctx = SkNEW_PLACEMENT_ARGS(storage, PictureShaderConte xt,
130 (shader, rec, bitmapShader) );
131 if (NULL == ctx->fBitmapShaderContext) {
132 ctx->~PictureShaderContext();
133 ctx = NULL;
134 }
135 return ctx;
136 }
137
144 SkPictureShader::PictureShaderContext::PictureShaderContext( 138 SkPictureShader::PictureShaderContext::PictureShaderContext(
145 const SkPictureShader& shader, const ContextRec& rec, SkShader* bitmapSh ader) 139 const SkPictureShader& shader, const ContextRec& rec, SkShader* bitmapSh ader)
146 : INHERITED(shader, rec) 140 : INHERITED(shader, rec)
147 , fBitmapShader(bitmapShader) 141 , fBitmapShader(SkRef(bitmapShader))
148 { 142 {
149 SkASSERT(fBitmapShader); 143 fBitmapShaderContextStorage = sk_malloc_throw(bitmapShader->contextSize());
150 fBitmapShaderContextStorage = sk_malloc_throw(fBitmapShader->contextSize()); 144 fBitmapShaderContext = bitmapShader->createContext(rec, fBitmapShaderContext Storage);
151 fBitmapShaderContext = fBitmapShader->createContext(rec, fBitmapShaderContex tStorage); 145 //if fBitmapShaderContext is null, we are invalid
152 SkASSERT(fBitmapShaderContext);
153 } 146 }
154 147
155 SkPictureShader::PictureShaderContext::~PictureShaderContext() { 148 SkPictureShader::PictureShaderContext::~PictureShaderContext() {
156 fBitmapShaderContext->~Context(); 149 if (fBitmapShaderContext) {
150 fBitmapShaderContext->~Context();
151 }
157 sk_free(fBitmapShaderContextStorage); 152 sk_free(fBitmapShaderContextStorage);
158 } 153 }
159 154
160 uint32_t SkPictureShader::PictureShaderContext::getFlags() const { 155 uint32_t SkPictureShader::PictureShaderContext::getFlags() const {
156 SkASSERT(fBitmapShaderContext);
161 return fBitmapShaderContext->getFlags(); 157 return fBitmapShaderContext->getFlags();
162 } 158 }
163 159
164 SkShader::Context::ShadeProc SkPictureShader::PictureShaderContext::asAShadeProc (void** ctx) { 160 SkShader::Context::ShadeProc SkPictureShader::PictureShaderContext::asAShadeProc (void** ctx) {
161 SkASSERT(fBitmapShaderContext);
165 return fBitmapShaderContext->asAShadeProc(ctx); 162 return fBitmapShaderContext->asAShadeProc(ctx);
166 } 163 }
167 164
168 void SkPictureShader::PictureShaderContext::shadeSpan(int x, int y, SkPMColor ds tC[], int count) { 165 void SkPictureShader::PictureShaderContext::shadeSpan(int x, int y, SkPMColor ds tC[], int count) {
169 SkASSERT(fBitmapShaderContext); 166 SkASSERT(fBitmapShaderContext);
170 fBitmapShaderContext->shadeSpan(x, y, dstC, count); 167 fBitmapShaderContext->shadeSpan(x, y, dstC, count);
171 } 168 }
172 169
173 void SkPictureShader::PictureShaderContext::shadeSpan16(int x, int y, uint16_t d stC[], int count) { 170 void SkPictureShader::PictureShaderContext::shadeSpan16(int x, int y, uint16_t d stC[], int count) {
174 SkASSERT(fBitmapShaderContext); 171 SkASSERT(fBitmapShaderContext);
(...skipping 18 matching lines...) Expand all
193 190
194 #if SK_SUPPORT_GPU 191 #if SK_SUPPORT_GPU
195 GrEffectRef* SkPictureShader::asNewEffect(GrContext* context, const SkPaint& pai nt) const { 192 GrEffectRef* SkPictureShader::asNewEffect(GrContext* context, const SkPaint& pai nt) const {
196 SkAutoTUnref<SkShader> bitmapShader(this->refBitmapShader(context->getMatrix ())); 193 SkAutoTUnref<SkShader> bitmapShader(this->refBitmapShader(context->getMatrix ()));
197 if (!bitmapShader) { 194 if (!bitmapShader) {
198 return NULL; 195 return NULL;
199 } 196 }
200 return bitmapShader->asNewEffect(context, paint); 197 return bitmapShader->asNewEffect(context, paint);
201 } 198 }
202 #endif 199 #endif
OLDNEW
« no previous file with comments | « src/core/SkPictureShader.h ('k') | src/core/SkShader.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698