| Index: src/core/SkLinearBitmapPipeline.cpp
|
| diff --git a/src/core/SkLinearBitmapPipeline.cpp b/src/core/SkLinearBitmapPipeline.cpp
|
| index 4d4a4cfe4dfc3e2bd2e1c1c0f2c57f9a3c49a08a..e836746a891ff740d74d7422f08336cff16c214a 100644
|
| --- a/src/core/SkLinearBitmapPipeline.cpp
|
| +++ b/src/core/SkLinearBitmapPipeline.cpp
|
| @@ -707,11 +707,17 @@ public:
|
| }
|
| };
|
|
|
| -template <SkColorProfileType colorProfile>
|
| -class Passthrough8888 {
|
| +enum class ColorOrder {
|
| + kRGBA = false,
|
| + kBGRA = true,
|
| +};
|
| +template <SkColorProfileType colorProfile, ColorOrder colorOrder>
|
| +class Pixel8888 {
|
| public:
|
| - Passthrough8888(int width, const uint32_t* src)
|
| - : fSrc{src}, fWidth{width}{ }
|
| + Pixel8888(int width, const uint32_t* src) : fSrc{src}, fWidth{width}{ }
|
| + Pixel8888(const SkPixmap& srcPixmap)
|
| + : fSrc{srcPixmap.addr32()}
|
| + , fWidth{static_cast<int>(srcPixmap.rowBytes() / 4)} { }
|
|
|
| void VECTORCALL getFewPixels(int n, Sk4s xs, Sk4s ys, Sk4f* px0, Sk4f* px1, Sk4f* px2) {
|
| Sk4i XIs = SkNx_cast<int, SkScalar>(xs);
|
| @@ -719,11 +725,11 @@ public:
|
| Sk4i bufferLoc = YIs * fWidth + XIs;
|
| switch (n) {
|
| case 3:
|
| - *px2 = getPixel(fSrc, bufferLoc[2]);
|
| + *px2 = this->getPixel(fSrc, bufferLoc[2]);
|
| case 2:
|
| - *px1 = getPixel(fSrc, bufferLoc[1]);
|
| + *px1 = this->getPixel(fSrc, bufferLoc[1]);
|
| case 1:
|
| - *px0 = getPixel(fSrc, bufferLoc[0]);
|
| + *px0 = this->getPixel(fSrc, bufferLoc[0]);
|
| default:
|
| break;
|
| }
|
| @@ -733,24 +739,28 @@ public:
|
| Sk4i XIs = SkNx_cast<int, SkScalar>(xs);
|
| Sk4i YIs = SkNx_cast<int, SkScalar>(ys);
|
| Sk4i bufferLoc = YIs * fWidth + XIs;
|
| - *px0 = getPixel(fSrc, bufferLoc[0]);
|
| - *px1 = getPixel(fSrc, bufferLoc[1]);
|
| - *px2 = getPixel(fSrc, bufferLoc[2]);
|
| - *px3 = getPixel(fSrc, bufferLoc[3]);
|
| + *px0 = this->getPixel(fSrc, bufferLoc[0]);
|
| + *px1 = this->getPixel(fSrc, bufferLoc[1]);
|
| + *px2 = this->getPixel(fSrc, bufferLoc[2]);
|
| + *px3 = this->getPixel(fSrc, bufferLoc[3]);
|
| }
|
|
|
| - const uint32_t* row(int y) { return fSrc + y * fWidth[0]; }
|
| -
|
| -private:
|
| Sk4f getPixel(const uint32_t* src, int index) {
|
| Sk4b bytePixel = Sk4b::Load((uint8_t *)(&src[index]));
|
| Sk4f pixel = SkNx_cast<float, uint8_t>(bytePixel);
|
| + if (colorOrder == ColorOrder::kBGRA) {
|
| + pixel = SkNx_shuffle<2, 1, 0, 3>(pixel);
|
| + }
|
| pixel = pixel * Sk4f{1.0f/255.0f};
|
| if (colorProfile == kSRGB_SkColorProfileType) {
|
| pixel = sRGBFast::sRGBToLinear(pixel);
|
| }
|
| return pixel;
|
| }
|
| +
|
| + const uint32_t* row(int y) { return fSrc + y * fWidth[0]; }
|
| +
|
| +private:
|
| const uint32_t* const fSrc;
|
| const Sk4i fWidth;
|
| };
|
| @@ -827,6 +837,11 @@ private:
|
| SourceStrategy fStrategy;
|
| };
|
|
|
| +using Pixel8888SRGB = Pixel8888<kSRGB_SkColorProfileType, ColorOrder::kRGBA>;
|
| +using Pixel8888LRGB = Pixel8888<kLinear_SkColorProfileType, ColorOrder::kRGBA>;
|
| +using Pixel8888SBGR = Pixel8888<kSRGB_SkColorProfileType, ColorOrder::kBGRA>;
|
| +using Pixel8888LBGR = Pixel8888<kLinear_SkColorProfileType, ColorOrder::kBGRA>;
|
| +
|
| static SkLinearBitmapPipeline::BilerpProcessorInterface* choose_pixel_sampler(
|
| SkLinearBitmapPipeline::PixelPlacerInterface* next,
|
| const SkPixmap& srcPixmap,
|
| @@ -834,19 +849,17 @@ static SkLinearBitmapPipeline::BilerpProcessorInterface* choose_pixel_sampler(
|
| const SkImageInfo& imageInfo = srcPixmap.info();
|
| switch (imageInfo.colorType()) {
|
| case kRGBA_8888_SkColorType:
|
| + if (imageInfo.profileType() == kSRGB_SkColorProfileType) {
|
| + sampleStage->Initialize<Sampler<Pixel8888SRGB>>(next, srcPixmap);
|
| + } else {
|
| + sampleStage->Initialize<Sampler<Pixel8888LRGB>>(next, srcPixmap);
|
| + }
|
| + break;
|
| case kBGRA_8888_SkColorType:
|
| - if (kN32_SkColorType == imageInfo.colorType()) {
|
| - if (imageInfo.profileType() == kSRGB_SkColorProfileType) {
|
| - sampleStage->Initialize<Sampler<Passthrough8888<kSRGB_SkColorProfileType>>>(
|
| - next, static_cast<int>(srcPixmap.rowBytes() / 4),
|
| - srcPixmap.addr32());
|
| - } else {
|
| - sampleStage->Initialize<Sampler<Passthrough8888<kLinear_SkColorProfileType>>>(
|
| - next, static_cast<int>(srcPixmap.rowBytes() / 4),
|
| - srcPixmap.addr32());
|
| - }
|
| + if (imageInfo.profileType() == kSRGB_SkColorProfileType) {
|
| + sampleStage->Initialize<Sampler<Pixel8888SBGR>>(next, srcPixmap);
|
| } else {
|
| - SkFAIL("Not implemented. No 8888 Swizzle");
|
| + sampleStage->Initialize<Sampler<Pixel8888LBGR>>(next, srcPixmap);
|
| }
|
| break;
|
| default:
|
|
|