Revert "reduce SkDisplacementImageFilter size"
This reverts commit ed68a92ca6
.
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 <mtklein@google.com>
> Commit-Queue: Mike Reed <reed@google.com>
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 <reed@google.com>
Commit-Queue: Mike Reed <reed@google.com>
This commit is contained in:
parent
f21254fbe0
commit
3f93b7265f
@ -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])
|
||||
{}
|
||||
|
||||
unsigned fShiftX, fShiftY;
|
||||
|
||||
unsigned getX(SkPMColor c) const { return (c >> fShiftX) & 0xFF; }
|
||||
unsigned getY(SkPMColor c) const { return (c >> fShiftY) & 0xFF; }
|
||||
};
|
||||
|
||||
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<SkDisplacementMapEffect::ChannelSelectorType type>
|
||||
uint32_t getValue(SkColor, const SkUnPreMultiply::Scale*) {
|
||||
SkDEBUGFAIL("Unknown channel selector");
|
||||
return 0;
|
||||
}
|
||||
|
||||
void computeDisplacement(Extractor ex, const SkVector& scale, SkBitmap* dst,
|
||||
template<> uint32_t getValue<SkDisplacementMapEffect::kR_ChannelSelectorType>(
|
||||
SkColor l, const SkUnPreMultiply::Scale* table) {
|
||||
return SkUnPreMultiply::ApplyScale(table[SkGetPackedA32(l)], SkGetPackedR32(l));
|
||||
}
|
||||
|
||||
template<> uint32_t getValue<SkDisplacementMapEffect::kG_ChannelSelectorType>(
|
||||
SkColor l, const SkUnPreMultiply::Scale* table) {
|
||||
return SkUnPreMultiply::ApplyScale(table[SkGetPackedA32(l)], SkGetPackedG32(l));
|
||||
}
|
||||
|
||||
template<> uint32_t getValue<SkDisplacementMapEffect::kB_ChannelSelectorType>(
|
||||
SkColor l, const SkUnPreMultiply::Scale* table) {
|
||||
return SkUnPreMultiply::ApplyScale(table[SkGetPackedA32(l)], SkGetPackedB32(l));
|
||||
}
|
||||
|
||||
template<> uint32_t getValue<SkDisplacementMapEffect::kA_ChannelSelectorType>(
|
||||
SkColor l, const SkUnPreMultiply::Scale*) {
|
||||
return SkGetPackedA32(l);
|
||||
}
|
||||
|
||||
template<SkDisplacementMapEffect::ChannelSelectorType typeX,
|
||||
SkDisplacementMapEffect::ChannelSelectorType typeY>
|
||||
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<typeX>(*displPtr, table) + scaleAdj.fX;
|
||||
SkScalar displY = scaleForColor.fY * getValue<typeY>(*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<SkDisplacementMapEffect::ChannelSelectorType typeX>
|
||||
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<typeX, SkDisplacementMapEffect::kR_ChannelSelectorType>(
|
||||
scale, dst, displ, offset, src, bounds);
|
||||
break;
|
||||
case SkDisplacementMapEffect::kG_ChannelSelectorType:
|
||||
computeDisplacement<typeX, SkDisplacementMapEffect::kG_ChannelSelectorType>(
|
||||
scale, dst, displ, offset, src, bounds);
|
||||
break;
|
||||
case SkDisplacementMapEffect::kB_ChannelSelectorType:
|
||||
computeDisplacement<typeX, SkDisplacementMapEffect::kB_ChannelSelectorType>(
|
||||
scale, dst, displ, offset, src, bounds);
|
||||
break;
|
||||
case SkDisplacementMapEffect::kA_ChannelSelectorType:
|
||||
computeDisplacement<typeX, SkDisplacementMapEffect::kA_ChannelSelectorType>(
|
||||
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<SkDisplacementMapEffect::kR_ChannelSelectorType>(
|
||||
yChannelSelector, scale, dst, displ, offset, src, bounds);
|
||||
break;
|
||||
case SkDisplacementMapEffect::kG_ChannelSelectorType:
|
||||
computeDisplacement<SkDisplacementMapEffect::kG_ChannelSelectorType>(
|
||||
yChannelSelector, scale, dst, displ, offset, src, bounds);
|
||||
break;
|
||||
case SkDisplacementMapEffect::kB_ChannelSelectorType:
|
||||
computeDisplacement<SkDisplacementMapEffect::kB_ChannelSelectorType>(
|
||||
yChannelSelector, scale, dst, displ, offset, src, bounds);
|
||||
break;
|
||||
case SkDisplacementMapEffect::kA_ChannelSelectorType:
|
||||
computeDisplacement<SkDisplacementMapEffect::kA_ChannelSelectorType>(
|
||||
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<SkSpecialImage> 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();
|
||||
|
Loading…
Reference in New Issue
Block a user