Re-proc SkBlitRow::Color32 for ARM.
This is a spiritual revert of http://crrev.com/1104183004. BUG=skia: Review URL: https://codereview.chromium.org/1145283003
This commit is contained in:
parent
5559ca2a18
commit
4e13a23d8f
@ -82,6 +82,9 @@ public:
|
|||||||
static ColorProc16 PlatformColorFactory565(unsigned flags);
|
static ColorProc16 PlatformColorFactory565(unsigned flags);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
typedef void (*Color32Proc)(SkPMColor[], const SkPMColor[], int, SkPMColor);
|
||||||
|
static Color32Proc PlatformColor32Proc();
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
kFlags16_Mask = 7,
|
kFlags16_Mask = 7,
|
||||||
kFlags32_Mask = 3
|
kFlags32_Mask = 3
|
||||||
|
@ -144,6 +144,11 @@ void SkBlitRow::Color32(SkPMColor dst[], const SkPMColor src[], int count, SkPMC
|
|||||||
case 255: sk_memset32(dst, color, count); return;
|
case 255: sk_memset32(dst, color, count); return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This Sk4px impl works great on other platforms or when we have NEON.
|
||||||
|
#if defined(SK_CPU_ARM32) && !defined(SK_ARM_HAS_NEON)
|
||||||
|
if (auto proc = PlatformColor32Proc()) { return proc(dst, src, count, color); }
|
||||||
|
#endif
|
||||||
|
|
||||||
unsigned invA = 255 - SkGetPackedA32(color);
|
unsigned invA = 255 - SkGetPackedA32(color);
|
||||||
invA += invA >> 7;
|
invA += invA >> 7;
|
||||||
SkASSERT(invA < 256); // We've already handled alpha == 0 above.
|
SkASSERT(invA < 256); // We've already handled alpha == 0 above.
|
||||||
|
@ -390,3 +390,7 @@ SkBlitRow::Proc32 SkBlitRow::PlatformProcs32(unsigned flags) {
|
|||||||
return SK_ARM_NEON_WRAP(sk_blitrow_platform_32_procs_arm)[flags];
|
return SK_ARM_NEON_WRAP(sk_blitrow_platform_32_procs_arm)[flags];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SkBlitRow::Color32Proc SkBlitRow::PlatformColor32Proc() {
|
||||||
|
#define sk_blitrow_color32_arm NULL
|
||||||
|
return SK_ARM_NEON_WRAP(sk_blitrow_color32_arm);
|
||||||
|
}
|
||||||
|
@ -1730,3 +1730,20 @@ const SkBlitRow::Proc32 sk_blitrow_platform_32_procs_arm_neon[] = {
|
|||||||
NULL
|
NULL
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#include "Sk4px.h"
|
||||||
|
|
||||||
|
void sk_blitrow_color32_arm_neon(SkPMColor* dst, const SkPMColor* src, int count, SkPMColor color) {
|
||||||
|
// Until it becomes a little more reasonable to assume we'll be built with NEON,
|
||||||
|
// we copy our Sk4px implementation of SkBlitRow::Color32 here so it picks up NEON at runtime.
|
||||||
|
unsigned invA = 255 - SkGetPackedA32(color);
|
||||||
|
invA += invA >> 7;
|
||||||
|
SkASSERT(invA < 256); // Our caller has already handled the alpha == 0 case.
|
||||||
|
|
||||||
|
Sk16h colorHighAndRound = Sk4px(color).widenHi() + Sk16h(128);
|
||||||
|
Sk16b invA_16x(invA);
|
||||||
|
|
||||||
|
Sk4px::MapSrc(count, dst, src, [&](const Sk4px& src4) -> Sk4px {
|
||||||
|
return src4.mulWiden(invA_16x).addNarrowHi(colorHighAndRound);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
@ -13,4 +13,6 @@ extern const SkBlitRow::Proc16 sk_blitrow_platform_565_procs_arm_neon[];
|
|||||||
extern const SkBlitRow::ColorProc16 sk_blitrow_platform_565_colorprocs_arm_neon[];
|
extern const SkBlitRow::ColorProc16 sk_blitrow_platform_565_colorprocs_arm_neon[];
|
||||||
extern const SkBlitRow::Proc32 sk_blitrow_platform_32_procs_arm_neon[];
|
extern const SkBlitRow::Proc32 sk_blitrow_platform_32_procs_arm_neon[];
|
||||||
|
|
||||||
|
extern void sk_blitrow_color32_arm_neon(SkPMColor[], const SkPMColor[], int, SkPMColor);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user