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

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

Issue 264843006: create struct to hold all the params passed around for shader::context (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: address review comments 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/SkBitmapProcShader.h ('k') | src/core/SkBlitter.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 /* 2 /*
3 * Copyright 2011 Google Inc. 3 * Copyright 2011 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 #include "SkColorPriv.h" 8 #include "SkColorPriv.h"
9 #include "SkReadBuffer.h" 9 #include "SkReadBuffer.h"
10 #include "SkWriteBuffer.h" 10 #include "SkWriteBuffer.h"
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 if (kIndex_8_SkColorType == bm.colorType()) { 90 if (kIndex_8_SkColorType == bm.colorType()) {
91 // ugh, I have to lock-pixels to inspect the colortable 91 // ugh, I have to lock-pixels to inspect the colortable
92 SkAutoLockPixels alp(bm); 92 SkAutoLockPixels alp(bm);
93 if (!bm.getColorTable()) { 93 if (!bm.getColorTable()) {
94 return false; 94 return false;
95 } 95 }
96 } 96 }
97 return true; 97 return true;
98 } 98 }
99 99
100 bool SkBitmapProcShader::validInternal(const SkBitmap& device, 100 bool SkBitmapProcShader::validInternal(const ContextRec& rec, SkMatrix* totalInv erse,
101 const SkPaint& paint,
102 const SkMatrix& matrix,
103 SkMatrix* totalInverse,
104 SkBitmapProcState* state) const { 101 SkBitmapProcState* state) const {
105 if (!fRawBitmap.getTexture() && !valid_for_drawing(fRawBitmap)) { 102 if (!fRawBitmap.getTexture() && !valid_for_drawing(fRawBitmap)) {
106 return false; 103 return false;
107 } 104 }
108 105
109 // Make sure we can use totalInverse as a cache. 106 // Make sure we can use totalInverse as a cache.
110 SkMatrix totalInverseLocal; 107 SkMatrix totalInverseLocal;
111 if (NULL == totalInverse) { 108 if (NULL == totalInverse) {
112 totalInverse = &totalInverseLocal; 109 totalInverse = &totalInverseLocal;
113 } 110 }
114 111
115 // Do this first, so we know the matrix can be inverted. 112 // Do this first, so we know the matrix can be inverted.
116 if (!this->INHERITED::validContext(device, paint, matrix, totalInverse)) { 113 if (!this->INHERITED::validContext(rec, totalInverse)) {
117 return false; 114 return false;
118 } 115 }
119 116
120 SkASSERT(state); 117 SkASSERT(state);
121 state->fTileModeX = fTileModeX; 118 state->fTileModeX = fTileModeX;
122 state->fTileModeY = fTileModeY; 119 state->fTileModeY = fTileModeY;
123 state->fOrigBitmap = fRawBitmap; 120 state->fOrigBitmap = fRawBitmap;
124 return state->chooseProcs(*totalInverse, paint); 121 return state->chooseProcs(*totalInverse, *rec.fPaint);
125 } 122 }
126 123
127 bool SkBitmapProcShader::validContext(const SkBitmap& device, 124 bool SkBitmapProcShader::validContext(const ContextRec& rec, SkMatrix* totalInve rse) const {
128 const SkPaint& paint,
129 const SkMatrix& matrix,
130 SkMatrix* totalInverse) const {
131 SkBitmapProcState state; 125 SkBitmapProcState state;
132 return this->validInternal(device, paint, matrix, totalInverse, &state); 126 return this->validInternal(rec, totalInverse, &state);
133 } 127 }
134 128
135 SkShader::Context* SkBitmapProcShader::createContext(const SkBitmap& device, con st SkPaint& paint, 129 SkShader::Context* SkBitmapProcShader::createContext(const ContextRec& rec, void * storage) const {
136 const SkMatrix& matrix, voi d* storage) const {
137 void* stateStorage = (char*)storage + sizeof(BitmapProcShaderContext); 130 void* stateStorage = (char*)storage + sizeof(BitmapProcShaderContext);
138 SkBitmapProcState* state = SkNEW_PLACEMENT(stateStorage, SkBitmapProcState); 131 SkBitmapProcState* state = SkNEW_PLACEMENT(stateStorage, SkBitmapProcState);
139 if (!this->validInternal(device, paint, matrix, NULL, state)) { 132 if (!this->validInternal(rec, NULL, state)) {
140 state->~SkBitmapProcState(); 133 state->~SkBitmapProcState();
141 return NULL; 134 return NULL;
142 } 135 }
143 136
144 return SkNEW_PLACEMENT_ARGS(storage, BitmapProcShaderContext, 137 return SkNEW_PLACEMENT_ARGS(storage, BitmapProcShaderContext, (*this, rec, s tate));
145 (*this, device, paint, matrix, state));
146 } 138 }
147 139
148 size_t SkBitmapProcShader::contextSize() const { 140 size_t SkBitmapProcShader::contextSize() const {
149 // The SkBitmapProcState is stored outside of the context object, with the c ontext holding 141 // The SkBitmapProcState is stored outside of the context object, with the c ontext holding
150 // a pointer to it. 142 // a pointer to it.
151 return sizeof(BitmapProcShaderContext) + sizeof(SkBitmapProcState); 143 return sizeof(BitmapProcShaderContext) + sizeof(SkBitmapProcState);
152 } 144 }
153 145
154 SkBitmapProcShader::BitmapProcShaderContext::BitmapProcShaderContext( 146 SkBitmapProcShader::BitmapProcShaderContext::BitmapProcShaderContext(
155 const SkBitmapProcShader& shader, const SkBitmap& device, 147 const SkBitmapProcShader& shader, const ContextRec& rec, SkBitmapProcSta te* state)
156 const SkPaint& paint, const SkMatrix& matrix, SkBitmapProcState* state) 148 : INHERITED(shader, rec)
157 : INHERITED(shader, device, paint, matrix)
158 , fState(state) 149 , fState(state)
159 { 150 {
160 const SkBitmap& bitmap = *fState->fBitmap; 151 const SkBitmap& bitmap = *fState->fBitmap;
161 bool bitmapIsOpaque = bitmap.isOpaque(); 152 bool bitmapIsOpaque = bitmap.isOpaque();
162 153
163 // update fFlags 154 // update fFlags
164 uint32_t flags = 0; 155 uint32_t flags = 0;
165 if (bitmapIsOpaque && (255 == this->getPaintAlpha())) { 156 if (bitmapIsOpaque && (255 == this->getPaintAlpha())) {
166 flags |= kOpaqueAlpha_Flag; 157 flags |= kOpaqueAlpha_Flag;
167 } 158 }
168 159
169 switch (bitmap.colorType()) { 160 switch (bitmap.colorType()) {
170 case kRGB_565_SkColorType: 161 case kRGB_565_SkColorType:
171 flags |= (kHasSpan16_Flag | kIntrinsicly16_Flag); 162 flags |= (kHasSpan16_Flag | kIntrinsicly16_Flag);
172 break; 163 break;
173 case kIndex_8_SkColorType: 164 case kIndex_8_SkColorType:
174 case kN32_SkColorType: 165 case kN32_SkColorType:
175 if (bitmapIsOpaque) { 166 if (bitmapIsOpaque) {
176 flags |= kHasSpan16_Flag; 167 flags |= kHasSpan16_Flag;
177 } 168 }
178 break; 169 break;
179 case kAlpha_8_SkColorType: 170 case kAlpha_8_SkColorType:
180 break; // never set kHasSpan16_Flag 171 break; // never set kHasSpan16_Flag
181 default: 172 default:
182 break; 173 break;
183 } 174 }
184 175
185 if (paint.isDither() && bitmap.colorType() != kRGB_565_SkColorType) { 176 if (rec.fPaint->isDither() && bitmap.colorType() != kRGB_565_SkColorType) {
186 // gradients can auto-dither in their 16bit sampler, but we don't so 177 // gradients can auto-dither in their 16bit sampler, but we don't so
187 // we clear the flag here. 178 // we clear the flag here.
188 flags &= ~kHasSpan16_Flag; 179 flags &= ~kHasSpan16_Flag;
189 } 180 }
190 181
191 // if we're only 1-pixel high, and we don't rotate, then we can claim this 182 // if we're only 1-pixel high, and we don't rotate, then we can claim this
192 if (1 == bitmap.height() && 183 if (1 == bitmap.height() &&
193 only_scale_and_translate(this->getTotalInverse())) { 184 only_scale_and_translate(this->getTotalInverse())) {
194 flags |= kConstInY32_Flag; 185 flags |= kConstInY32_Flag;
195 if (flags & kHasSpan16_Flag) { 186 if (flags & kHasSpan16_Flag) {
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after
487 GrEffectRef* effect = NULL; 478 GrEffectRef* effect = NULL;
488 if (paintFilterLevel == SkPaint::kHigh_FilterLevel) { 479 if (paintFilterLevel == SkPaint::kHigh_FilterLevel) {
489 effect = GrBicubicEffect::Create(texture, matrix, tm); 480 effect = GrBicubicEffect::Create(texture, matrix, tm);
490 } else { 481 } else {
491 effect = GrSimpleTextureEffect::Create(texture, matrix, params); 482 effect = GrSimpleTextureEffect::Create(texture, matrix, params);
492 } 483 }
493 GrUnlockAndUnrefCachedBitmapTexture(texture); 484 GrUnlockAndUnrefCachedBitmapTexture(texture);
494 return effect; 485 return effect;
495 } 486 }
496 #endif 487 #endif
OLDNEW
« no previous file with comments | « src/core/SkBitmapProcShader.h ('k') | src/core/SkBlitter.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698