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

Side by Side Diff: src/codec/SkSwizzler.cpp

Issue 1663623002: NEON optimizations for GrayAlpha -> RGBA/BGRA Premul/Unpremul (Closed) Base URL: https://skia.googlesource.com/skia.git@gralpha
Patch Set: Created 4 years, 10 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 | « no previous file | src/core/SkOpts.h » ('j') | src/opts/SkSwizzler_opts.h » ('J')
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 #include "SkCodecPriv.h" 8 #include "SkCodecPriv.h"
9 #include "SkColorPriv.h" 9 #include "SkColorPriv.h"
10 #include "SkOpts.h" 10 #include "SkOpts.h"
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after
302 const SkPMColor ctable[]) { 302 const SkPMColor ctable[]) {
303 303
304 src += offset; 304 src += offset;
305 SkPMColor* dst32 = (SkPMColor*) dst; 305 SkPMColor* dst32 = (SkPMColor*) dst;
306 for (int x = 0; x < width; x++) { 306 for (int x = 0; x < width; x++) {
307 dst32[x] = SkPackARGB32NoCheck(src[1], src[0], src[0], src[0]); 307 dst32[x] = SkPackARGB32NoCheck(src[1], src[0], src[0], src[0]);
308 src += deltaSrc; 308 src += deltaSrc;
309 } 309 }
310 } 310 }
311 311
312 static void fast_swizzle_grayalpha_to_n32_unpremul(
313 void* dst, const uint8_t* src, int width, int bpp, int deltaSrc, int off set,
314 const SkPMColor ctable[]) {
315
316 // This function must not be called if we are sampling. If we are not
317 // sampling, deltaSrc should equal bpp.
318 SkASSERT(deltaSrc == bpp);
319
320 // Note that there is no need to distinguish between RGB and BGR.
321 // Each color channel will get the same value.
322 SkOpts::grayA_to_RGBA((uint32_t*) dst, src + offset, width);
323 }
324
312 static void swizzle_grayalpha_to_n32_premul( 325 static void swizzle_grayalpha_to_n32_premul(
313 void* dst, const uint8_t* src, int width, int bpp, int deltaSrc, int off set, 326 void* dst, const uint8_t* src, int width, int bpp, int deltaSrc, int off set,
314 const SkPMColor ctable[]) { 327 const SkPMColor ctable[]) {
315 328
316 src += offset; 329 src += offset;
317 SkPMColor* dst32 = (SkPMColor*) dst; 330 SkPMColor* dst32 = (SkPMColor*) dst;
318 for (int x = 0; x < width; x++) { 331 for (int x = 0; x < width; x++) {
319 uint8_t pmgray = SkMulDiv255Round(src[1], src[0]); 332 uint8_t pmgray = SkMulDiv255Round(src[1], src[0]);
320 dst32[x] = SkPackARGB32NoCheck(src[1], pmgray, pmgray, pmgray); 333 dst32[x] = SkPackARGB32NoCheck(src[1], pmgray, pmgray, pmgray);
321 src += deltaSrc; 334 src += deltaSrc;
322 } 335 }
323 } 336 }
324 337
338 static void fast_swizzle_grayalpha_to_n32_premul(
339 void* dst, const uint8_t* src, int width, int bpp, int deltaSrc, int off set,
340 const SkPMColor ctable[]) {
341
342 // This function must not be called if we are sampling. If we are not
343 // sampling, deltaSrc should equal bpp.
344 SkASSERT(deltaSrc == bpp);
345
346 // Note that there is no need to distinguish between rgb and bgr.
347 // Each color channel will get the same value.
348 SkOpts::grayA_to_rgbA((uint32_t*) dst, src + offset, width);
349 }
350
325 // kBGRX 351 // kBGRX
326 352
327 static void swizzle_bgrx_to_n32( 353 static void swizzle_bgrx_to_n32(
328 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, 354 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth,
329 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { 355 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) {
330 356
331 src += offset; 357 src += offset;
332 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; 358 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow;
333 for (int x = 0; x < dstWidth; x++) { 359 for (int x = 0; x < dstWidth; x++) {
334 dst[x] = SkPackARGB32NoCheck(0xFF, src[2], src[1], src[0]); 360 dst[x] = SkPackARGB32NoCheck(0xFF, src[2], src[1], src[0]);
(...skipping 376 matching lines...) Expand 10 before | Expand all | Expand 10 after
711 break; 737 break;
712 } 738 }
713 break; 739 break;
714 case kGrayAlpha: 740 case kGrayAlpha:
715 switch (dstInfo.colorType()) { 741 switch (dstInfo.colorType()) {
716 case kN32_SkColorType: 742 case kN32_SkColorType:
717 if (dstInfo.alphaType() == kUnpremul_SkAlphaType) { 743 if (dstInfo.alphaType() == kUnpremul_SkAlphaType) {
718 if (SkCodec::kYes_ZeroInitialized == zeroInit) { 744 if (SkCodec::kYes_ZeroInitialized == zeroInit) {
719 proc = &SkipLeadingGrayAlphaZerosThen 745 proc = &SkipLeadingGrayAlphaZerosThen
720 <swizzle_grayalpha_to_n32_unpremul>; 746 <swizzle_grayalpha_to_n32_unpremul>;
747 fastProc = &SkipLeadingGrayAlphaZerosThen
748 <fast_swizzle_grayalpha_to_n32_unpremul>;
721 } else { 749 } else {
722 proc = &swizzle_grayalpha_to_n32_unpremul; 750 proc = &swizzle_grayalpha_to_n32_unpremul;
751 fastProc = &fast_swizzle_grayalpha_to_n32_unpremul;
723 } 752 }
724 } else { 753 } else {
725 if (SkCodec::kYes_ZeroInitialized == zeroInit) { 754 if (SkCodec::kYes_ZeroInitialized == zeroInit) {
726 proc = &SkipLeadingGrayAlphaZerosThen<swizzle_grayal pha_to_n32_premul>; 755 proc = &SkipLeadingGrayAlphaZerosThen<swizzle_grayal pha_to_n32_premul>;
756 fastProc = &SkipLeadingGrayAlphaZerosThen
757 <fast_swizzle_grayalpha_to_n32_premul>;
727 } else { 758 } else {
728 proc = &swizzle_grayalpha_to_n32_premul; 759 proc = &swizzle_grayalpha_to_n32_premul;
760 fastProc = &fast_swizzle_grayalpha_to_n32_premul;
729 } 761 }
730 } 762 }
731 break; 763 break;
732 default: 764 default:
733 break; 765 break;
734 } 766 }
735 break; 767 break;
736 case kBGR: 768 case kBGR:
737 case kBGRX: 769 case kBGRX:
738 switch (dstInfo.colorType()) { 770 switch (dstInfo.colorType()) {
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
896 } 928 }
897 929
898 return fAllocatedWidth; 930 return fAllocatedWidth;
899 } 931 }
900 932
901 void SkSwizzler::swizzle(void* dst, const uint8_t* SK_RESTRICT src) { 933 void SkSwizzler::swizzle(void* dst, const uint8_t* SK_RESTRICT src) {
902 SkASSERT(nullptr != dst && nullptr != src); 934 SkASSERT(nullptr != dst && nullptr != src);
903 fActualProc(SkTAddOffset<void>(dst, fDstOffsetBytes), src, fSwizzleWidth, fS rcBPP, 935 fActualProc(SkTAddOffset<void>(dst, fDstOffsetBytes), src, fSwizzleWidth, fS rcBPP,
904 fSampleX * fSrcBPP, fSrcOffsetUnits, fColorTable); 936 fSampleX * fSrcBPP, fSrcOffsetUnits, fColorTable);
905 } 937 }
OLDNEW
« no previous file with comments | « no previous file | src/core/SkOpts.h » ('j') | src/opts/SkSwizzler_opts.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698