26#include <initializer_list>
29 const SkImageInfo& srcInfo,
const void* srcPixels,
size_t srcRB,
46 const SkImageInfo& srcInfo,
const void* srcPixels,
size_t srcRB,
55#if !defined(SK_ARM_HAS_NEON)
64 void (*fn)(uint32_t*,
const uint32_t*,
int) =
nullptr;
78 for (
int y = 0;
y < dstInfo.
height();
y++) {
79 fn((uint32_t*)dstPixels, (
const uint32_t*)srcPixels, dstInfo.
width());
80 dstPixels = SkTAddOffset<void>(dstPixels, dstRB);
81 srcPixels = SkTAddOffset<const void>(srcPixels, srcRB);
92 auto dst = (uint8_t*)vdst;
104 auto src16 = (
const uint16_t*)
src;
105 for (
int y = 0;
y < srcInfo.
height();
y++) {
106 for (
int x = 0;
x < srcInfo.
width();
x++) {
107 dst[
x] = src16[
x] >> 8;
109 dst = SkTAddOffset<uint8_t>(
dst, dstRB);
110 src16 = SkTAddOffset<const uint16_t>(src16, srcRB);
125 for (
int y = 0;
y < srcInfo.
height(); ++
y) {
127 dst = SkTAddOffset<uint8_t>(
dst, dstRB);
133 auto src16 = (
const uint16_t*)
src;
134 for (
int y = 0;
y < srcInfo.
height();
y++) {
135 for (
int x = 0;
x < srcInfo.
width();
x++) {
138 dst = SkTAddOffset<uint8_t>(
dst, dstRB);
139 src16 = SkTAddOffset<const uint16_t>(src16, srcRB);
147 auto src32 = (
const uint32_t*)
src;
148 for (
int y = 0;
y < srcInfo.
height();
y++) {
149 for (
int x = 0;
x < srcInfo.
width();
x++) {
150 dst[
x] = src32[
x] >> 24;
152 dst = SkTAddOffset<uint8_t>(
dst, dstRB);
153 src32 = SkTAddOffset<const uint32_t>(src32, srcRB);
160 auto src32 = (
const uint32_t*)
src;
161 for (
int y = 0;
y < srcInfo.
height();
y++) {
162 for (
int x = 0;
x < srcInfo.
width();
x++) {
163 dst[
x] = (src32[
x] >> 30) * 0x55;
165 dst = SkTAddOffset<uint8_t>(
dst, dstRB);
166 src32 = SkTAddOffset<const uint32_t>(src32, srcRB);
173 auto src64 = (
const uint64_t*)
src;
174 for (
int y = 0;
y < srcInfo.
height();
y++) {
175 for (
int x = 0;
x < srcInfo.
width();
x++) {
178 dst = SkTAddOffset<uint8_t>(
dst, dstRB);
179 src64 = SkTAddOffset<const uint64_t>(src64, srcRB);
186 for (
int y = 0;
y < srcInfo.
height();
y++) {
187 for (
int x = 0;
x < srcInfo.
width();
x++) {
188 dst[
x] = (uint8_t)(255.0f *
rgba[4*
x+3]);
190 dst = SkTAddOffset<uint8_t>(
dst, dstRB);
191 rgba = SkTAddOffset<const float>(
rgba, srcRB);
197 auto srcF16 = (
const uint16_t*)
src;
198 for (
int y = 0;
y < srcInfo.
height();
y++) {
199 for (
int x = 0;
x < srcInfo.
width();
x++) {
202 dst = SkTAddOffset<uint8_t>(
dst, dstRB);
203 srcF16 = SkTAddOffset<const uint16_t>(srcF16, srcRB);
209 auto src64 = (
const uint64_t*)
src;
210 for (
int y = 0;
y < srcInfo.
height();
y++) {
211 for (
int x = 0;
x < srcInfo.
width();
x++) {
212 static constexpr int64_t kZero = 384;
213 static constexpr int64_t kRange = 510;
214 static constexpr int64_t kMaxU8 = 0xff;
215 static constexpr int64_t kMinU8 = 0x00;
216 static constexpr int64_t kDivisor = kRange / kMaxU8;
217 int64_t raw_alpha = src64[
x] >> 54;
221 SkTPin((raw_alpha - kZero) / kDivisor, kMinU8, kMaxU8);
222 dst[
x] =
static_cast<uint8_t
>(alpha);
224 dst = SkTAddOffset<uint8_t>(
dst, dstRB);
225 src64 = SkTAddOffset<const uint64_t>(src64, srcRB);
231 auto src64 = (
const uint64_t*)
src;
232 for (
int y = 0;
y < srcInfo.
height();
y++) {
233 for (
int x = 0;
x < srcInfo.
width();
x++) {
234 dst[
x] = (src64[
x] >> 48) >> 8;
236 dst = SkTAddOffset<uint8_t>(
dst, dstRB);
237 src64 = SkTAddOffset<const uint64_t>(src64, srcRB);
247 const SkImageInfo& srcInfo,
const void* srcRow,
int srcStride,
250 dst = { dstRow, dstStride };
254 steps.
apply(&pipeline);
260 const SkImageInfo& srcInfo,
const void* srcPixels,
size_t srcRB) {
275 if (fn(dstInfo, dstPixels, dstRB, srcInfo, srcPixels, srcRB, steps)) {
static const uint32_t rgba[kNumPixels]
#define SkPacked4444ToA32(c)
@ kR16G16B16A16_unorm_SkColorType
pixel with a little endian uint16_t for red, green, blue
@ kRGBA_10x6_SkColorType
pixel with 10 used bits (most significant) followed by 6 unused
@ kBGR_101010x_SkColorType
pixel with 10 bits each for blue, green, red; in 32-bit word
@ kARGB_4444_SkColorType
pixel with 4 bits for alpha, red, green, blue; in 16-bit word
@ kR8G8_unorm_SkColorType
pixel with a uint8_t for red and green
@ kBGRA_8888_SkColorType
pixel with 8 bits for blue, green, red, alpha; in 32-bit word
@ kA16_unorm_SkColorType
pixel with a little endian uint16_t for alpha
@ kRGBA_F16_SkColorType
pixel with half floats for red, green, blue, alpha;
@ kAlpha_8_SkColorType
pixel with alpha in 8-bit byte
@ kRGB_101010x_SkColorType
pixel with 10 bits each for red, green, blue; in 32-bit word
@ kSRGBA_8888_SkColorType
@ kGray_8_SkColorType
pixel with grayscale level in 8-bit byte
@ kRGB_565_SkColorType
pixel with 5 bits red, 6 bits green, 5 bits blue, in 16-bit word
@ kBGRA_10101010_XR_SkColorType
pixel with 10 bits each for blue, green, red, alpha; in 64-bit word, extended range
@ kRGBA_8888_SkColorType
pixel with 8 bits for red, green, blue, alpha; in 32-bit word
@ kRGB_888x_SkColorType
pixel with 8 bits each for red, green, blue; in 32-bit word
@ kBGRA_1010102_SkColorType
10 bits for blue, green, red; 2 bits for alpha; in 32-bit word
@ kA16_float_SkColorType
pixel with a half float for alpha
@ kRGBA_F32_SkColorType
pixel using C float for red, green, blue, alpha; in 128-bit word
@ kRGBA_1010102_SkColorType
10 bits for red, green, blue; 2 bits for alpha; in 32-bit word
@ kBGR_101010x_XR_SkColorType
pixel with 10 bits each for blue, green, red; in 32-bit word, extended range
@ kR16G16_unorm_SkColorType
pixel with a little endian uint16_t for red and green
@ kRGBA_F16Norm_SkColorType
pixel with half floats in [0,1] for red, green, blue, alpha;
@ kUnknown_SkColorType
uninitialized
@ kR16G16_float_SkColorType
pixel with a half float for red and green
bool SkConvertPixels(const SkImageInfo &dstInfo, void *dstPixels, size_t dstRB, const SkImageInfo &srcInfo, const void *srcPixels, size_t srcRB)
static void convert_with_pipeline(const SkImageInfo &dstInfo, void *dstRow, int dstStride, const SkImageInfo &srcInfo, const void *srcRow, int srcStride, const SkColorSpaceXformSteps &steps)
static bool swizzle_or_premul(const SkImageInfo &dstInfo, void *dstPixels, size_t dstRB, const SkImageInfo &srcInfo, const void *srcPixels, size_t srcRB, const SkColorSpaceXformSteps &steps)
static bool convert_to_alpha8(const SkImageInfo &dstInfo, void *vdst, size_t dstRB, const SkImageInfo &srcInfo, const void *src, size_t srcRB, const SkColorSpaceXformSteps &)
static bool rect_memcpy(const SkImageInfo &dstInfo, void *dstPixels, size_t dstRB, const SkImageInfo &srcInfo, const void *srcPixels, size_t srcRB, const SkColorSpaceXformSteps &steps)
float SkHalfToFloat(SkHalf h)
static bool SkImageInfoValidConversion(const SkImageInfo &dst, const SkImageInfo &src)
static void SkRectMemcpy(void *dst, size_t dstRB, const void *src, size_t srcRB, size_t trimRowBytes, int rowCount)
static constexpr const T & SkTPin(const T &x, const T &lo, const T &hi)
static bool is_8888(SkColorType colorType)
void run(size_t x, size_t y, size_t w, size_t h) const
void appendLoad(SkColorType, const SkRasterPipeline_MemoryCtx *)
void appendStore(SkColorType, const SkRasterPipeline_MemoryCtx *)
Swizzle_8888_u32 RGBA_to_rgbA
Swizzle_8888_u32 RGBA_to_BGRA
Swizzle_8888_u32 RGBA_to_bgrA
Swizzle_8888_u32 rgbA_to_BGRA
Swizzle_8888_u32 rgbA_to_RGBA
size_t minRowBytes() const
SkColorSpace * colorSpace() const
int bytesPerPixel() const
SkISize dimensions() const
SkAlphaType alphaType() const
SkColorType colorType() const