uint32_t xy[], int count, int x, int y);
void S32_D16_filter_DX(const SkBitmapProcState& s,
const uint32_t* xy, int count, uint16_t* colors);
+void S32_D16_filter_DXDY(const SkBitmapProcState& s,
+ const uint32_t* xy, int count, uint16_t* colors);
void highQualityFilter32(const SkBitmapProcState &s, int x, int y,
SkPMColor *SK_RESTRICT colors, int count);
*/
#include "SkBitmapProcState_opts_SSSE3.h"
+#include "SkColorPriv.h"
#include "SkPaint.h"
#include "SkUtils.h"
}
void S32_opaque_D32_filter_DXDY_SSSE3(const SkBitmapProcState& s,
- const uint32_t* xy,
- int count, uint32_t* colors) {
+ const uint32_t* xy,
+ int count, uint32_t* colors) {
S32_generic_D32_filter_DXDY_SSSE3<false>(s, xy, count, colors);
}
void S32_alpha_D32_filter_DXDY_SSSE3(const SkBitmapProcState& s,
- const uint32_t* xy,
- int count, uint32_t* colors) {
+ const uint32_t* xy,
+ int count, uint32_t* colors) {
S32_generic_D32_filter_DXDY_SSSE3<true>(s, xy, count, colors);
}
+void S32_D16_filter_DXDY_SSSE3(const SkBitmapProcState& s,
+ const uint32_t* xy,
+ int count, uint16_t* colors) {
+ SkASSERT(64 >= count);
+ SkAutoSTMalloc<64, uint32_t> colors32(count);
+ S32_generic_D32_filter_DXDY_SSSE3<false>(s, xy, count, colors32);
+ for(int i = 0; i < count; i++) {
+ *colors++ = SkPixel32ToPixel16(colors32[i]);
+ }
+}
+
#else // SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSSE3
void S32_opaque_D32_filter_DX_SSSE3(const SkBitmapProcState& s,
}
void S32_opaque_D32_filter_DXDY_SSSE3(const SkBitmapProcState& s,
- const uint32_t* xy,
- int count, uint32_t* colors) {
+ const uint32_t* xy,
+ int count, uint32_t* colors) {
sk_throw();
}
void S32_alpha_D32_filter_DXDY_SSSE3(const SkBitmapProcState& s,
- const uint32_t* xy,
- int count, uint32_t* colors) {
+ const uint32_t* xy,
+ int count, uint32_t* colors) {
+ sk_throw();
+}
+
+void S32_D16_filter_DXDY_SSSE3(const SkBitmapProcState& s,
+ const uint32_t* xy,
+ int count, uint16_t* colors) {
sk_throw();
}
if (!supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
return;
}
+ const bool ssse3 = supports_simd(SK_CPU_SSE_LEVEL_SSSE3);
/* Check fSampleProc32 */
if (fSampleProc32 == S32_opaque_D32_filter_DX) {
- if (supports_simd(SK_CPU_SSE_LEVEL_SSSE3)) {
+ if (ssse3) {
fSampleProc32 = S32_opaque_D32_filter_DX_SSSE3;
} else {
fSampleProc32 = S32_opaque_D32_filter_DX_SSE2;
}
} else if (fSampleProc32 == S32_opaque_D32_filter_DXDY) {
- if (supports_simd(SK_CPU_SSE_LEVEL_SSSE3)) {
+ if (ssse3) {
fSampleProc32 = S32_opaque_D32_filter_DXDY_SSSE3;
}
} else if (fSampleProc32 == S32_alpha_D32_filter_DX) {
- if (supports_simd(SK_CPU_SSE_LEVEL_SSSE3)) {
+ if (ssse3) {
fSampleProc32 = S32_alpha_D32_filter_DX_SSSE3;
} else {
fSampleProc32 = S32_alpha_D32_filter_DX_SSE2;
}
} else if (fSampleProc32 == S32_alpha_D32_filter_DXDY) {
- if (supports_simd(SK_CPU_SSE_LEVEL_SSSE3)) {
+ if (ssse3) {
fSampleProc32 = S32_alpha_D32_filter_DXDY_SSSE3;
}
}
/* Check fSampleProc16 */
if (fSampleProc16 == S32_D16_filter_DX) {
fSampleProc16 = S32_D16_filter_DX_SSE2;
+ } else if (ssse3 && fSampleProc16 == S32_D16_filter_DXDY) {
+ fSampleProc16 = S32_D16_filter_DXDY_SSSE3;
}
/* Check fMatrixProc */