OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 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 "SkBitmapProcShader.h" | 8 #include "SkBitmapProcShader.h" |
9 #include "SkBitmapProcState.h" | 9 #include "SkBitmapProcState.h" |
10 #include "SkBitmapProvider.h" | 10 #include "SkBitmapProvider.h" |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 : INHERITED(shader, rec, info) | 122 : INHERITED(shader, rec, info) |
123 { | 123 { |
124 // Save things off in case we need to build a blitter pipeline. | 124 // Save things off in case we need to build a blitter pipeline. |
125 fSrcPixmap = info->fPixmap; | 125 fSrcPixmap = info->fPixmap; |
126 fAlpha = SkColorGetA(info->fPaintColor) / 255.0f; | 126 fAlpha = SkColorGetA(info->fPaintColor) / 255.0f; |
127 fXMode = info->fTileModeX; | 127 fXMode = info->fTileModeX; |
128 fYMode = info->fTileModeY; | 128 fYMode = info->fTileModeY; |
129 fFilterQuality = info->fFilterQuality; | 129 fFilterQuality = info->fFilterQuality; |
130 fMatrixTypeMask = info->fRealInvMatrix.getType(); | 130 fMatrixTypeMask = info->fRealInvMatrix.getType(); |
131 | 131 |
132 // Need to ensure that our pipeline is created at a 16byte aligned addre
ss | 132 fShaderPipeline.init( |
133 fShaderPipeline = (SkLinearBitmapPipeline*)SkAlign16((intptr_t)fShaderSt
orage); | 133 info->fRealInvMatrix, info->fFilterQuality, |
134 new (fShaderPipeline) SkLinearBitmapPipeline(info->fRealInvMatrix, info-
>fFilterQuality, | 134 info->fTileModeX, info->fTileModeY, |
135 info->fTileModeX, info->fTi
leModeY, | 135 info->fPaintColor, |
136 info->fPaintColor, | 136 info->fPixmap); |
137 info->fPixmap); | |
138 | 137 |
139 // To implement the old shadeSpan entry-point, we need to efficiently co
nvert our native | 138 // To implement the old shadeSpan entry-point, we need to efficiently co
nvert our native |
140 // floats into SkPMColor. The SkXfermode::D32Procs do exactly that. | 139 // floats into SkPMColor. The SkXfermode::D32Procs do exactly that. |
141 // | 140 // |
142 sk_sp<SkXfermode> xfer(SkXfermode::Make(SkXfermode::kSrc_Mode)); | 141 sk_sp<SkXfermode> xfer(SkXfermode::Make(SkXfermode::kSrc_Mode)); |
143 fXferProc = SkXfermode::GetD32Proc(xfer.get(), 0); | 142 fXferProc = SkXfermode::GetD32Proc(xfer.get(), 0); |
144 } | 143 } |
145 | 144 |
146 ~LinearPipelineContext() override { | |
147 // since we did a manual new, we need to manually destroy as well. | |
148 fShaderPipeline->~SkLinearBitmapPipeline(); | |
149 if (fBlitterPipeline != nullptr) { | |
150 fBlitterPipeline->~SkLinearBitmapPipeline(); | |
151 } | |
152 } | |
153 | |
154 void shadeSpan4f(int x, int y, SkPM4f dstC[], int count) override { | 145 void shadeSpan4f(int x, int y, SkPM4f dstC[], int count) override { |
155 fShaderPipeline->shadeSpan4f(x, y, dstC, count); | 146 fShaderPipeline->shadeSpan4f(x, y, dstC, count); |
156 } | 147 } |
157 | 148 |
158 void shadeSpan(int x, int y, SkPMColor dstC[], int count) override { | 149 void shadeSpan(int x, int y, SkPMColor dstC[], int count) override { |
159 const int N = 128; | 150 const int N = 128; |
160 SkPM4f tmp[N]; | 151 SkPM4f tmp[N]; |
161 | 152 |
162 while (count > 0) { | 153 while (count > 0) { |
163 const int n = SkTMin(count, N); | 154 const int n = SkTMin(count, N); |
164 fShaderPipeline->shadeSpan4f(x, y, tmp, n); | 155 fShaderPipeline->shadeSpan4f(x, y, tmp, n); |
165 fXferProc(nullptr, dstC, tmp, n, nullptr); | 156 fXferProc(nullptr, dstC, tmp, n, nullptr); |
166 dstC += n; | 157 dstC += n; |
167 x += n; | 158 x += n; |
168 count -= n; | 159 count -= n; |
169 } | 160 } |
170 } | 161 } |
171 | 162 |
172 bool onChooseBlitProcs(const SkImageInfo& dstInfo, BlitState* state) overrid
e { | 163 bool onChooseBlitProcs(const SkImageInfo& dstInfo, BlitState* state) overrid
e { |
173 SkXfermode::Mode mode; | 164 SkXfermode::Mode mode; |
174 if (!SkXfermode::AsMode(state->fXfer, &mode)) { return false; } | 165 if (!SkXfermode::AsMode(state->fXfer, &mode)) { return false; } |
175 | 166 |
176 // Need to ensure that our pipeline is created at a 16byte aligned addre
ss | |
177 fBlitterPipeline = (SkLinearBitmapPipeline*)SkAlign16((intptr_t)fBlitter
Storage); | |
178 if (SkLinearBitmapPipeline::ClonePipelineForBlitting( | 167 if (SkLinearBitmapPipeline::ClonePipelineForBlitting( |
179 fBlitterPipeline, *fShaderPipeline, | 168 &fBlitterPipeline, *fShaderPipeline, |
180 fMatrixTypeMask, | 169 fMatrixTypeMask, |
181 fXMode, fYMode, | 170 fXMode, fYMode, |
182 fFilterQuality, fSrcPixmap, | 171 fFilterQuality, fSrcPixmap, |
183 fAlpha, mode, dstInfo)) | 172 fAlpha, mode, dstInfo)) |
184 { | 173 { |
185 state->fStorage[0] = fBlitterPipeline; | 174 state->fStorage[0] = fBlitterPipeline.get(); |
186 state->fBlitBW = &LinearPipelineContext::ForwardToPipeline; | 175 state->fBlitBW = &LinearPipelineContext::ForwardToPipeline; |
187 | 176 |
188 return true; | 177 return true; |
189 } | 178 } |
190 | 179 |
191 // Did not successfully create a pipeline so don't destruct it. | |
192 fBlitterPipeline = nullptr; | |
193 return false; | 180 return false; |
194 } | 181 } |
195 | 182 |
196 static void ForwardToPipeline(BlitState* state, int x, int y, const SkPixmap
& dst, int count) { | 183 static void ForwardToPipeline(BlitState* state, int x, int y, const SkPixmap
& dst, int count) { |
197 SkLinearBitmapPipeline* pipeline = static_cast<SkLinearBitmapPipeline*>(
state->fStorage[0]); | 184 SkLinearBitmapPipeline* pipeline = static_cast<SkLinearBitmapPipeline*>(
state->fStorage[0]); |
198 void* addr = dst.writable_addr32(x, y); | 185 void* addr = dst.writable_addr32(x, y); |
199 pipeline->blitSpan(x, y, addr, count); | 186 pipeline->blitSpan(x, y, addr, count); |
200 } | 187 } |
201 | 188 |
202 | |
203 private: | 189 private: |
204 enum { | 190 SkEmbeddableLinearPipeline fShaderPipeline; |
205 kActualSize = sizeof(SkLinearBitmapPipeline), | 191 SkEmbeddableLinearPipeline fBlitterPipeline; |
206 kPaddedSize = SkAlignPtr(kActualSize + 12), | 192 SkXfermode::D32Proc fXferProc; |
207 }; | 193 SkPixmap fSrcPixmap; |
208 void* fShaderStorage[kPaddedSize / sizeof(void*)]; | 194 float fAlpha; |
209 SkLinearBitmapPipeline* fShaderPipeline; | 195 SkShader::TileMode fXMode; |
210 void* fBlitterStorage[kPaddedSize / sizeof(void*)]; | 196 SkShader::TileMode fYMode; |
211 SkLinearBitmapPipeline* fBlitterPipeline{nullptr}; | 197 SkMatrix::TypeMask fMatrixTypeMask; |
212 SkXfermode::D32Proc fXferProc; | 198 SkFilterQuality fFilterQuality; |
213 SkPixmap fSrcPixmap; | |
214 float fAlpha; | |
215 SkShader::TileMode fXMode; | |
216 SkShader::TileMode fYMode; | |
217 SkMatrix::TypeMask fMatrixTypeMask; | |
218 SkFilterQuality fFilterQuality; | |
219 | 199 |
220 typedef BitmapProcInfoContext INHERITED; | 200 typedef BitmapProcInfoContext INHERITED; |
221 }; | 201 }; |
222 | 202 |
223 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 203 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
224 | 204 |
225 static bool choose_linear_pipeline(const SkShader::ContextRec& rec, const SkImag
eInfo& srcInfo) { | 205 static bool choose_linear_pipeline(const SkShader::ContextRec& rec, const SkImag
eInfo& srcInfo) { |
226 // If we get here, we can reasonably use either context, respect the caller'
s preference | 206 // If we get here, we can reasonably use either context, respect the caller'
s preference |
227 // | 207 // |
228 return SkShader::ContextRec::kPM4f_DstType == rec.fPreferredDstType; | 208 return SkShader::ContextRec::kPM4f_DstType == rec.fPreferredDstType; |
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
475 inner.reset(GrSimpleTextureEffect::Create(texture, matrix, params)); | 455 inner.reset(GrSimpleTextureEffect::Create(texture, matrix, params)); |
476 } | 456 } |
477 | 457 |
478 if (kAlpha_8_SkColorType == fRawBitmap.colorType()) { | 458 if (kAlpha_8_SkColorType == fRawBitmap.colorType()) { |
479 return GrFragmentProcessor::MulOutputByInputUnpremulColor(inner); | 459 return GrFragmentProcessor::MulOutputByInputUnpremulColor(inner); |
480 } | 460 } |
481 return GrFragmentProcessor::MulOutputByInputAlpha(inner); | 461 return GrFragmentProcessor::MulOutputByInputAlpha(inner); |
482 } | 462 } |
483 | 463 |
484 #endif | 464 #endif |
OLD | NEW |