From 3f93b7265f558c414d0f33a7771be52b1fd1ce61 Mon Sep 17 00:00:00 2001 From: Mike Reed Date: Sun, 18 Jun 2017 10:49:36 +0000 Subject: Revert "reduce SkDisplacementImageFilter size" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit ed68a92ca65762f0d0c4060668ceeb9c92506cf9. Reason for revert: breaks layouttests (on BGRA?) Original change's description: > reduce SkDisplacementImageFilter size > > saves ~8K on mac laptop > > - remove templates > - check for 0 0r 0xFF in alpha > > Before: (using modified bench w/o caching) > > 23/23 MB 2 134µs 151µs 146µs 156µs 6% █▇▆▆▆▆▄▁▁▁ 8888 displacement_full_large > 23/23 MB 2 253µs 254µs 255µs 260µs 1% █▄▄▅▂▁▂▁▁▁ 8888 displacement_alpha_large > 24/24 MB 1 410µs 410µs 415µs 445µs 3% █▃▁▂▁▁▁▁▁▁ 8888 displacement_zero_large > 24/24 MB 151 840ns 841ns 853ns 938ns 4% █▁▁▁▁▁▁▂▁▁ 8888 displacement_full_small > 24/24 MB 180 832ns 835ns 836ns 851ns 1% █▂▁▂▂▁▂▂▂▂ 8888 displacement_alpha_small > 24/24 MB 9 60µs 60.9µs 69.9µs 101µs 19% █▄▄▄▁▁▁▁▁▁ 8888 displacement_zero_small > > After: > > 23/23 MB 3 47.4µs 48µs 48.2µs 51.4µs 2% █▂▂▃▃▁▁▁▂▁ 8888 displacement_full_large > 23/23 MB 2 140µs 141µs 145µs 166µs 7% ▂▁▁▁▁▁▁▁▇█ 8888 displacement_alpha_large > 24/24 MB 2 189µs 196µs 197µs 225µs 5% █▃▂▂▂▂▃▂▁▁ 8888 displacement_zero_large > 24/24 MB 134 588ns 594ns 597ns 616ns 1% ▂▁▁█▂▆▂▂▃▄ 8888 displacement_full_small > 24/24 MB 168 590ns 592ns 592ns 599ns 0% ▃▂▁▁▁▁▁█▂▂ 8888 displacement_alpha_small > 24/24 MB 9 8.39µs 8.41µs 8.42µs 8.53µs 0% █▄▃▂▁▁▃▂▁▂ 8888 displacement_zero_small > > Bug: skia: > Change-Id: Ia3b12dc8420b32b65633bb1cf76a15241e420eac > Reviewed-on: https://skia-review.googlesource.com/20181 > Reviewed-by: Mike Klein > Commit-Queue: Mike Reed TBR=mtklein@google.com,robertphillips@google.com,fmalita@chromium.org,reed@google.com Change-Id: I811c5f25a328c75527ce5caa0d9b8e123d535583 No-Presubmit: true No-Tree-Checks: true No-Try: true Bug: skia: Reviewed-on: https://skia-review.googlesource.com/20182 Reviewed-by: Mike Reed Commit-Queue: Mike Reed --- src/effects/SkDisplacementMapEffect.cpp | 121 +++++++++++++++++++++++--------- 1 file changed, 86 insertions(+), 35 deletions(-) (limited to 'src') diff --git a/src/effects/SkDisplacementMapEffect.cpp b/src/effects/SkDisplacementMapEffect.cpp index 83f97b9353..82c2b59aca 100644 --- a/src/effects/SkDisplacementMapEffect.cpp +++ b/src/effects/SkDisplacementMapEffect.cpp @@ -33,41 +33,35 @@ namespace { #define kChannelSelectorKeyBits 3; // Max value is 4, so 3 bits are required at most -const uint8_t gChannelTypeToShift[] = { - 0, // unknown - SK_RGBA_R32_SHIFT, - SK_RGBA_G32_SHIFT, - SK_RGBA_B32_SHIFT, - SK_RGBA_A32_SHIFT, -}; -struct Extractor { - Extractor(SkDisplacementMapEffect::ChannelSelectorType typeX, - SkDisplacementMapEffect::ChannelSelectorType typeY) - : fShiftX(gChannelTypeToShift[typeX]) - , fShiftY(gChannelTypeToShift[typeY]) - {} +template +uint32_t getValue(SkColor, const SkUnPreMultiply::Scale*) { + SkDEBUGFAIL("Unknown channel selector"); + return 0; +} - unsigned fShiftX, fShiftY; +template<> uint32_t getValue( + SkColor l, const SkUnPreMultiply::Scale* table) { + return SkUnPreMultiply::ApplyScale(table[SkGetPackedA32(l)], SkGetPackedR32(l)); +} - unsigned getX(SkPMColor c) const { return (c >> fShiftX) & 0xFF; } - unsigned getY(SkPMColor c) const { return (c >> fShiftY) & 0xFF; } -}; +template<> uint32_t getValue( + SkColor l, const SkUnPreMultiply::Scale* table) { + return SkUnPreMultiply::ApplyScale(table[SkGetPackedA32(l)], SkGetPackedG32(l)); +} -static SkPMColor unpremul_pm(SkPMColor c) { - const U8CPU a = SkGetPackedA32(c); - if (0 == a) { - return 0; - } else if (0xFF == a) { - return c; - } - const unsigned scale = SkUnPreMultiply::GetScale(a); - return SkPackARGB32NoCheck(a, - SkUnPreMultiply::ApplyScale(scale, SkGetPackedR32(c)), - SkUnPreMultiply::ApplyScale(scale, SkGetPackedG32(c)), - SkUnPreMultiply::ApplyScale(scale, SkGetPackedB32(c))); +template<> uint32_t getValue( + SkColor l, const SkUnPreMultiply::Scale* table) { + return SkUnPreMultiply::ApplyScale(table[SkGetPackedA32(l)], SkGetPackedB32(l)); } -void computeDisplacement(Extractor ex, const SkVector& scale, SkBitmap* dst, +template<> uint32_t getValue( + SkColor l, const SkUnPreMultiply::Scale*) { + return SkGetPackedA32(l); +} + +template +void computeDisplacement(const SkVector& scale, SkBitmap* dst, const SkBitmap& displ, const SkIPoint& offset, const SkBitmap& src, const SkIRect& bounds) { @@ -77,14 +71,13 @@ void computeDisplacement(Extractor ex, const SkVector& scale, SkBitmap* dst, const SkVector scaleForColor = SkVector::Make(scale.fX * Inv8bit, scale.fY * Inv8bit); const SkVector scaleAdj = SkVector::Make(SK_ScalarHalf - scale.fX * SK_ScalarHalf, SK_ScalarHalf - scale.fY * SK_ScalarHalf); + const SkUnPreMultiply::Scale* table = SkUnPreMultiply::GetScaleTable(); SkPMColor* dstPtr = dst->getAddr32(0, 0); for (int y = bounds.top(); y < bounds.bottom(); ++y) { const SkPMColor* displPtr = displ.getAddr32(bounds.left() + offset.fX, y + offset.fY); for (int x = bounds.left(); x < bounds.right(); ++x, ++displPtr) { - SkPMColor c = unpremul_pm(*displPtr); - - SkScalar displX = scaleForColor.fX * ex.getX(c) + scaleAdj.fX; - SkScalar displY = scaleForColor.fY * ex.getY(c) + scaleAdj.fY; + SkScalar displX = scaleForColor.fX * getValue(*displPtr, table) + scaleAdj.fX; + SkScalar displY = scaleForColor.fY * getValue(*displPtr, table) + scaleAdj.fY; // Truncate the displacement values const int srcX = x + SkScalarTruncToInt(displX); const int srcY = y + SkScalarTruncToInt(displY); @@ -94,6 +87,64 @@ void computeDisplacement(Extractor ex, const SkVector& scale, SkBitmap* dst, } } +template +void computeDisplacement(SkDisplacementMapEffect::ChannelSelectorType yChannelSelector, + const SkVector& scale, SkBitmap* dst, + const SkBitmap& displ, const SkIPoint& offset, + const SkBitmap& src, + const SkIRect& bounds) { + switch (yChannelSelector) { + case SkDisplacementMapEffect::kR_ChannelSelectorType: + computeDisplacement( + scale, dst, displ, offset, src, bounds); + break; + case SkDisplacementMapEffect::kG_ChannelSelectorType: + computeDisplacement( + scale, dst, displ, offset, src, bounds); + break; + case SkDisplacementMapEffect::kB_ChannelSelectorType: + computeDisplacement( + scale, dst, displ, offset, src, bounds); + break; + case SkDisplacementMapEffect::kA_ChannelSelectorType: + computeDisplacement( + scale, dst, displ, offset, src, bounds); + break; + case SkDisplacementMapEffect::kUnknown_ChannelSelectorType: + default: + SkDEBUGFAIL("Unknown Y channel selector"); + } +} + +void computeDisplacement(SkDisplacementMapEffect::ChannelSelectorType xChannelSelector, + SkDisplacementMapEffect::ChannelSelectorType yChannelSelector, + const SkVector& scale, SkBitmap* dst, + const SkBitmap& displ, const SkIPoint& offset, + const SkBitmap& src, + const SkIRect& bounds) { + switch (xChannelSelector) { + case SkDisplacementMapEffect::kR_ChannelSelectorType: + computeDisplacement( + yChannelSelector, scale, dst, displ, offset, src, bounds); + break; + case SkDisplacementMapEffect::kG_ChannelSelectorType: + computeDisplacement( + yChannelSelector, scale, dst, displ, offset, src, bounds); + break; + case SkDisplacementMapEffect::kB_ChannelSelectorType: + computeDisplacement( + yChannelSelector, scale, dst, displ, offset, src, bounds); + break; + case SkDisplacementMapEffect::kA_ChannelSelectorType: + computeDisplacement( + yChannelSelector, scale, dst, displ, offset, src, bounds); + break; + case SkDisplacementMapEffect::kUnknown_ChannelSelectorType: + default: + SkDEBUGFAIL("Unknown X channel selector"); + } +} + bool channel_selector_type_is_valid(SkDisplacementMapEffect::ChannelSelectorType cst) { switch (cst) { case SkDisplacementMapEffect::kUnknown_ChannelSelectorType: @@ -347,7 +398,7 @@ sk_sp SkDisplacementMapEffect::onFilterImage(SkSpecialImage* sou return nullptr; } - computeDisplacement(Extractor(fXChannelSelector, fYChannelSelector), scale, &dst, + computeDisplacement(fXChannelSelector, fYChannelSelector, scale, &dst, displBM, colorOffset - displOffset, colorBM, colorBounds); offset->fX = bounds.left(); -- cgit v1.2.3