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

Side by Side Diff: src/core/Sk4pxXfermode.h

Issue 1242973004: Revert of 565 support for SIMD xfermodes (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 5 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
« no previous file with comments | « src/core/Sk4px.h ('k') | no next file » | 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 2015 Google Inc. 2 * Copyright 2015 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 #ifndef Sk4pxXfermode_DEFINED 8 #ifndef Sk4pxXfermode_DEFINED
9 #define Sk4pxXfermode_DEFINED 9 #define Sk4pxXfermode_DEFINED
10 10
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 return ProcType::Xfer(src4, dst4); 215 return ProcType::Xfer(src4, dst4);
216 }); 216 });
217 } else { 217 } else {
218 Sk4px::MapDstSrcAlpha(n, dst, src, aa, 218 Sk4px::MapDstSrcAlpha(n, dst, src, aa,
219 [&](const Sk4px& dst4, const Sk4px& src4, const Sk4px& alpha ) { 219 [&](const Sk4px& dst4, const Sk4px& src4, const Sk4px& alpha ) {
220 return xfer_aa<ProcType>(src4, dst4, alpha); 220 return xfer_aa<ProcType>(src4, dst4, alpha);
221 }); 221 });
222 } 222 }
223 } 223 }
224 224
225 void xfer16(uint16_t dst[], const SkPMColor src[], int n, const SkAlpha aa[] ) const override {
226 if (NULL == aa) {
227 Sk4px::MapDstSrc(n, dst, src, [&](const Sk4px& dst4, const Sk4px& sr c4) {
228 return ProcType::Xfer(src4, dst4);
229 });
230 } else {
231 Sk4px::MapDstSrcAlpha(n, dst, src, aa,
232 [&](const Sk4px& dst4, const Sk4px& src4, const Sk4px& alpha ) {
233 return xfer_aa<ProcType>(src4, dst4, alpha);
234 });
235 }
236 }
237
238 private: 225 private:
239 SkT4pxXfermode(const ProcCoeff& rec) : INHERITED(rec, ProcType::kMode) {} 226 SkT4pxXfermode(const ProcCoeff& rec) : INHERITED(rec, ProcType::kMode) {}
240 227
241 typedef SkProcCoeffXfermode INHERITED; 228 typedef SkProcCoeffXfermode INHERITED;
242 }; 229 };
243 230
244 template <typename ProcType> 231 template <typename ProcType>
245 class SkTPMFloatXfermode : public SkProcCoeffXfermode { 232 class SkTPMFloatXfermode : public SkProcCoeffXfermode {
246 public: 233 public:
247 static SkProcCoeffXfermode* Create(const ProcCoeff& rec) { 234 static SkProcCoeffXfermode* Create(const ProcCoeff& rec) {
248 return SkNEW_ARGS(SkTPMFloatXfermode, (rec)); 235 return SkNEW_ARGS(SkTPMFloatXfermode, (rec));
249 } 236 }
250 237
251 void xfer32(SkPMColor dst[], const SkPMColor src[], int n, const SkAlpha aa[ ]) const override { 238 void xfer32(SkPMColor dst[], const SkPMColor src[], int n, const SkAlpha aa[ ]) const override {
252 for (int i = 0; i < n; i++) { 239 for (int i = 0; i < n; i++) {
253 dst[i] = aa ? this->xfer32(dst[i], src[i], aa[i]) 240 SkPMFloat s(src[i]),
254 : this->xfer32(dst[i], src[i]); 241 d(dst[i]),
255 } 242 b(ProcType::Xfer(s,d));
256 } 243 if (aa) {
257 244 // We do aa in full float precision before going back down to by tes, because we can!
258 void xfer16(uint16_t dst[], const SkPMColor src[], int n, const SkAlpha aa[] ) const override { 245 SkPMFloat a = Sk4f(aa[i]) * Sk4f(1.0f/255);
259 for (int i = 0; i < n; i++) { 246 b = b*a + d*(Sk4f(1)-a);
260 SkPMColor dst32 = SkPixel16ToPixel32(dst[i]); 247 }
261 dst32 = aa ? this->xfer32(dst32, src[i], aa[i]) 248 dst[i] = b.round();
262 : this->xfer32(dst32, src[i]);
263 dst[i] = SkPixel32ToPixel16(dst32);
264 } 249 }
265 } 250 }
266 251
267 private: 252 private:
268 inline SkPMColor xfer32(SkPMColor dst, SkPMColor src) const {
269 return ProcType::Xfer(SkPMFloat(src), SkPMFloat(dst)).round();
270 }
271
272 inline SkPMColor xfer32(SkPMColor dst, SkPMColor src, SkAlpha aa) const {
273 SkPMFloat s(src),
274 d(dst),
275 b(ProcType::Xfer(s,d));
276 // We do aa in full float precision before going back down to bytes, bec ause we can!
277 SkPMFloat a = Sk4f(aa) * Sk4f(1.0f/255);
278 b = b*a + d*(Sk4f(1)-a);
279 return b.round();
280 }
281
282 SkTPMFloatXfermode(const ProcCoeff& rec) : INHERITED(rec, ProcType::kMode) { } 253 SkTPMFloatXfermode(const ProcCoeff& rec) : INHERITED(rec, ProcType::kMode) { }
283 254
284 typedef SkProcCoeffXfermode INHERITED; 255 typedef SkProcCoeffXfermode INHERITED;
285 }; 256 };
286 257
287 static SkProcCoeffXfermode* SkCreate4pxXfermode(const ProcCoeff& rec, SkXfermode ::Mode mode) { 258 static SkProcCoeffXfermode* SkCreate4pxXfermode(const ProcCoeff& rec, SkXfermode ::Mode mode) {
288 #if !defined(SK_CPU_ARM32) || defined(SK_ARM_HAS_NEON) 259 #if !defined(SK_CPU_ARM32) || defined(SK_ARM_HAS_NEON)
289 switch (mode) { 260 switch (mode) {
290 case SkXfermode::kClear_Mode: return SkT4pxXfermode<Clear>::Create( rec); 261 case SkXfermode::kClear_Mode: return SkT4pxXfermode<Clear>::Create( rec);
291 case SkXfermode::kSrc_Mode: return SkT4pxXfermode<Src>::Create(re c); 262 case SkXfermode::kSrc_Mode: return SkT4pxXfermode<Src>::Create(re c);
(...skipping 23 matching lines...) Expand all
315 case SkXfermode::kSoftLight_Mode: return SkTPMFloatXfermode<SoftLight>: :Create(rec); 286 case SkXfermode::kSoftLight_Mode: return SkTPMFloatXfermode<SoftLight>: :Create(rec);
316 default: break; 287 default: break;
317 } 288 }
318 #endif 289 #endif
319 return nullptr; 290 return nullptr;
320 } 291 }
321 292
322 } // namespace 293 } // namespace
323 294
324 #endif//Sk4pxXfermode_DEFINED 295 #endif//Sk4pxXfermode_DEFINED
OLDNEW
« no previous file with comments | « src/core/Sk4px.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698