diff options
-rw-r--r-- | bench/ColorCodecBench.cpp | 5 | ||||
-rw-r--r-- | gm/colorspacexform.cpp | 88 | ||||
-rw-r--r-- | gyp/bench.gyp | 1 | ||||
-rw-r--r-- | include/gpu/GrDrawContext.h | 23 | ||||
-rw-r--r-- | src/codec/SkCodecPriv.h | 18 | ||||
-rw-r--r-- | src/codec/SkJpegCodec.cpp | 3 | ||||
-rw-r--r-- | src/codec/SkPngCodec.cpp | 42 | ||||
-rw-r--r-- | src/codec/SkPngCodec.h | 9 | ||||
-rw-r--r-- | src/codec/SkWebpCodec.cpp | 5 | ||||
-rw-r--r-- | src/core/SkColorSpaceXform.cpp | 62 | ||||
-rw-r--r-- | src/core/SkColorSpaceXform.h | 27 | ||||
-rw-r--r-- | src/core/SkNx.h | 22 | ||||
-rw-r--r-- | src/core/SkPM4fPriv.h | 16 | ||||
-rw-r--r-- | src/gpu/GrDrawContext.cpp | 3 | ||||
-rw-r--r-- | src/gpu/SkGr.cpp | 19 | ||||
-rw-r--r-- | src/opts/SkNx_neon.h | 19 | ||||
-rw-r--r-- | src/opts/SkNx_sse.h | 25 | ||||
-rw-r--r-- | tests/ColorSpaceXformTest.cpp | 4 | ||||
-rw-r--r-- | tests/SkNxTest.cpp | 32 |
19 files changed, 85 insertions, 338 deletions
diff --git a/bench/ColorCodecBench.cpp b/bench/ColorCodecBench.cpp index faa2a9a118..e35aef87c9 100644 --- a/bench/ColorCodecBench.cpp +++ b/bench/ColorCodecBench.cpp @@ -8,7 +8,6 @@ #include "ColorCodecBench.h" #include "Resources.h" #include "SkCodec.h" -#include "SkCodecPriv.h" #include "SkColorSpaceXform.h" #include "SkCommandLineFlags.h" @@ -100,8 +99,8 @@ void ColorCodecBench::xformOnly() { void* dst = fDst.get(); void* src = fSrc.get(); for (int y = 0; y < fSrcInfo.height(); y++) { - xform->apply(dst, (uint32_t*) src, fSrcInfo.width(), - select_xform_format(fDstInfo.colorType()), fDstInfo.alphaType()); + xform->apply(dst, (uint32_t*) src, fSrcInfo.width(), fDstInfo.colorType(), + fDstInfo.alphaType()); dst = SkTAddOffset<void>(dst, fDstInfo.minRowBytes()); src = SkTAddOffset<void>(src, fSrcInfo.minRowBytes()); } diff --git a/gm/colorspacexform.cpp b/gm/colorspacexform.cpp deleted file mode 100644 index b3d79c91f0..0000000000 --- a/gm/colorspacexform.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright 2013 Google Inc. - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -#include "gm.h" -#include "SkColor.h" -#include "SkColorSpaceXform.h" -#include "SkRect.h" - -class ColorSpaceXformGM : public skiagm::GM { -public: - ColorSpaceXformGM() {} - -protected: - void onOnceBeforeDraw() override { - SkColor colors[] = { - SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorMAGENTA, SK_ColorCYAN, SK_ColorYELLOW, - SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorMAGENTA, - }; - static_assert(kNumColors == SK_ARRAY_COUNT(colors), "Fix number of colors."); - - for (int i = 0; i < kNumColors; i++) { - fSRGBColors[i] = SkColor4f::FromColor(colors[i]); - - // FIXME (msarett): SkColorSpaceXform does not support BGRA. - colors[i] = SkSwizzle_RB(colors[i]); - } - - static constexpr float kWideGamutRGB_toXYZD50[]{ - 0.7161046f, 0.1009296f, 0.1471858f, - 0.2581874f, 0.7249378f, 0.0168748f, - 0.0000000f, 0.0517813f, 0.7734287f, - }; - - SkMatrix44 wideGamut(SkMatrix44::kUninitialized_Constructor); - wideGamut.set3x3RowMajorf(kWideGamutRGB_toXYZD50); - std::unique_ptr<SkColorSpaceXform> xform = SkColorSpaceXform::New( - SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named), - SkColorSpace::NewRGB(SkColorSpace::kLinear_RenderTargetGamma, wideGamut)); - - xform->apply(fWideGamutColors, colors, kNumColors, - SkColorSpaceXform::kRGBA_F32_ColorFormat, kOpaque_SkAlphaType); - } - - SkString onShortName() override { - return SkString("colorspacexform"); - } - - SkISize onISize() override { - return SkISize::Make(500, 200); - } - - void onDraw(SkCanvas* canvas) override { - auto drawColors = [canvas](SkColor4f* colors) { - SkRect r = SkRect::MakeXYWH(0.0f, 0.0f, 50.0f, 100.0f); - - canvas->save(); - for (int i = 0; i < kNumColors; i++) { - sk_sp<SkColorSpace> space = - SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named)->makeLinearGamma(); - sk_sp<SkShader> s = SkShader::MakeColorShader(colors[i], space); - SkPaint paint; - paint.setShader(s); - canvas->drawRect(r, paint); - canvas->translate(50.0f, 0.0f); - } - canvas->restore(); - }; - - // Wide gamut colors should appear darker - we are simulating a more intense display. - drawColors(fSRGBColors); - canvas->translate(0.0f, 100.0f); - drawColors(fWideGamutColors); - } - -private: - static constexpr int kNumColors = 10; - - SkColor4f fSRGBColors[kNumColors]; - SkColor4f fWideGamutColors[kNumColors]; - - typedef skiagm::GM INHERITED; -}; - -DEF_GM(return new ColorSpaceXformGM;) diff --git a/gyp/bench.gyp b/gyp/bench.gyp index 4c2bca2b02..3d5c329ef5 100644 --- a/gyp/bench.gyp +++ b/gyp/bench.gyp @@ -21,7 +21,6 @@ 'gmslides.gypi', ], 'include_dirs' : [ - '../src/codec', '../src/image', ], 'dependencies': [ diff --git a/include/gpu/GrDrawContext.h b/include/gpu/GrDrawContext.h index 80f4da12cf..72de15deae 100644 --- a/include/gpu/GrDrawContext.h +++ b/include/gpu/GrDrawContext.h @@ -33,7 +33,6 @@ class GrRenderTarget; class GrStyle; class GrSurface; struct GrUserStencilSettings; -class SkColorSpaceXform; class SkDrawFilter; struct SkIPoint; struct SkIRect; @@ -337,7 +336,7 @@ public: } const SkSurfaceProps& surfaceProps() const { return fSurfaceProps; } SkColorSpace* getColorSpace() const { return fColorSpace.get(); } - SkColorSpaceXform* getColorXformFromSRGB() const { return fColorXformFromSRGB.get(); } + GrColorSpaceXform* getColorXformFromSRGB() const { return fColorXformFromSRGB.get(); } GrSurfaceOrigin origin() const { return fRenderTarget->origin(); } bool wasAbandoned() const; @@ -418,22 +417,22 @@ private: GrDrawTarget* getDrawTarget(); - GrDrawingManager* fDrawingManager; - sk_sp<GrRenderTarget> fRenderTarget; + GrDrawingManager* fDrawingManager; + sk_sp<GrRenderTarget> fRenderTarget; // In MDB-mode the drawTarget can be closed by some other drawContext that has picked // it up. For this reason, the drawTarget should only ever be accessed via 'getDrawTarget'. - GrDrawTarget* fDrawTarget; - GrContext* fContext; - GrInstancedPipelineInfo fInstancedPipelineInfo; + GrDrawTarget* fDrawTarget; + GrContext* fContext; + GrInstancedPipelineInfo fInstancedPipelineInfo; - sk_sp<SkColorSpace> fColorSpace; - std::unique_ptr<SkColorSpaceXform> fColorXformFromSRGB; - SkSurfaceProps fSurfaceProps; - GrAuditTrail* fAuditTrail; + sk_sp<SkColorSpace> fColorSpace; + sk_sp<GrColorSpaceXform> fColorXformFromSRGB; + SkSurfaceProps fSurfaceProps; + GrAuditTrail* fAuditTrail; // In debug builds we guard against improper thread handling - SkDEBUGCODE(mutable GrSingleOwner* fSingleOwner;) + SkDEBUGCODE(mutable GrSingleOwner* fSingleOwner;) }; #endif diff --git a/src/codec/SkCodecPriv.h b/src/codec/SkCodecPriv.h index 830f153cba..8876b72aa7 100644 --- a/src/codec/SkCodecPriv.h +++ b/src/codec/SkCodecPriv.h @@ -144,20 +144,6 @@ static inline const SkPMColor* get_color_ptr(SkColorTable* colorTable) { return nullptr != colorTable ? colorTable->readColors() : nullptr; } -static inline SkColorSpaceXform::ColorFormat select_xform_format(SkColorType colorType) { - switch (colorType) { - case kRGBA_8888_SkColorType: - return SkColorSpaceXform::kRGBA_8888_ColorFormat; - case kBGRA_8888_SkColorType: - return SkColorSpaceXform::kBGRA_8888_ColorFormat; - case kRGBA_F16_SkColorType: - return SkColorSpaceXform::kRGBA_F16_ColorFormat; - default: - SkASSERT(false); - return SkColorSpaceXform::kRGBA_8888_ColorFormat; - } -} - /* * Given that the encoded image uses a color table, return the fill value */ @@ -176,7 +162,7 @@ static inline uint64_t get_color_table_fill_value(SkColorType colorType, SkAlpha SkASSERT(colorXform); uint64_t dstColor; uint32_t srcColor = colorPtr[fillIndex]; - colorXform->apply(&dstColor, &srcColor, 1, select_xform_format(colorType), alphaType); + colorXform->apply(&dstColor, &srcColor, 1, colorType, alphaType); return dstColor; } default: @@ -357,7 +343,7 @@ static inline bool needs_color_xform(const SkImageInfo& dstInfo, const SkImageIn return !isLegacy && (needsPremul || isF16 || srcDstNotEqual); } -static inline SkAlphaType select_xform_alpha(SkAlphaType dstAlphaType, SkAlphaType srcAlphaType) { +static inline SkAlphaType select_alpha_xform(SkAlphaType dstAlphaType, SkAlphaType srcAlphaType) { return (kOpaque_SkAlphaType == srcAlphaType) ? kOpaque_SkAlphaType : dstAlphaType; } diff --git a/src/codec/SkJpegCodec.cpp b/src/codec/SkJpegCodec.cpp index c865fbccd1..d2f7cdb0fa 100644 --- a/src/codec/SkJpegCodec.cpp +++ b/src/codec/SkJpegCodec.cpp @@ -517,8 +517,7 @@ int SkJpegCodec::readRows(const SkImageInfo& dstInfo, void* dst, size_t rowBytes } if (fColorXform) { - fColorXform->apply(dst, swizzleDst, dstWidth, select_xform_format(dstInfo.colorType()), - kOpaque_SkAlphaType); + fColorXform->apply(dst, swizzleDst, dstWidth, dstInfo.colorType(), kOpaque_SkAlphaType); dst = SkTAddOffset<void>(dst, rowBytes); } diff --git a/src/codec/SkPngCodec.cpp b/src/codec/SkPngCodec.cpp index 1e633eaaed..04c8821203 100644 --- a/src/codec/SkPngCodec.cpp +++ b/src/codec/SkPngCodec.cpp @@ -267,12 +267,11 @@ bool SkPngCodec::createColorTable(const SkImageInfo& dstInfo, int* ctableCount) // If we are not decoding to F16, we can color xform now and store the results // in the color table. if (fColorXform && kRGBA_F16_SkColorType != dstInfo.colorType()) { - SkColorSpaceXform::ColorFormat xformColorFormat = is_rgba(dstInfo.colorType()) ? - SkColorSpaceXform::kRGBA_8888_ColorFormat : - SkColorSpaceXform::kBGRA_8888_ColorFormat; - SkAlphaType xformAlphaType = select_xform_alpha(dstInfo.alphaType(), + SkColorType xformColorType = is_rgba(dstInfo.colorType()) ? + kRGBA_8888_SkColorType : kBGRA_8888_SkColorType; + SkAlphaType xformAlphaType = select_alpha_xform(dstInfo.alphaType(), this->getInfo().alphaType()); - fColorXform->apply(colorTable, colorTable, numColors, xformColorFormat, xformAlphaType); + fColorXform->apply(colorTable, colorTable, numColors, xformColorType, xformAlphaType); } // Pad the color table with the last color in the table (or black) in the case that @@ -493,18 +492,17 @@ void SkPngCodec::allocateStorage(const SkImageInfo& dstInfo) { } void SkPngCodec::applyXformRow(void* dst, const void* src) { + const SkColorType colorType = this->dstInfo().colorType(); switch (fXformMode) { case kSwizzleOnly_XformMode: fSwizzler->swizzle(dst, (const uint8_t*) src); break; case kColorOnly_XformMode: - fColorXform->apply(dst, (const uint32_t*) src, fXformWidth, fXformColorFormat, - fXformAlphaType); + fColorXform->apply(dst, (const uint32_t*) src, fXformWidth, colorType, fXformAlphaType); break; case kSwizzleColor_XformMode: fSwizzler->swizzle(fColorXformSrcRow, (const uint8_t*) src); - fColorXform->apply(dst, fColorXformSrcRow, fXformWidth, fXformColorFormat, - fXformAlphaType); + fColorXform->apply(dst, fColorXformSrcRow, fXformWidth, colorType, fXformAlphaType); break; } } @@ -1139,23 +1137,9 @@ bool SkPngCodec::initializeXforms(const SkImageInfo& dstInfo, const Options& opt return true; } -void SkPngCodec::initializeXformParams() { - switch (fXformMode) { - case kColorOnly_XformMode: - fXformColorFormat = select_xform_format(this->dstInfo().colorType()); - fXformAlphaType = select_xform_alpha(this->dstInfo().alphaType(), - this->getInfo().alphaType()); - fXformWidth = this->dstInfo().width(); - break; - case kSwizzleColor_XformMode: - fXformColorFormat = select_xform_format(this->dstInfo().colorType()); - fXformAlphaType = select_xform_alpha(this->dstInfo().alphaType(), - this->getInfo().alphaType()); - fXformWidth = this->swizzler()->swizzleWidth(); - break; - default: - break; - } +void SkPngCodec::initializeXformAlphaAndWidth() { + fXformAlphaType = select_alpha_xform(this->dstInfo().alphaType(), this->getInfo().alphaType()); + fXformWidth = this->swizzler() ? this->swizzler()->swizzleWidth() : this->dstInfo().width(); } static inline bool apply_xform_on_decode(SkColorType dstColorType, SkEncodedInfo::Color srcColor) { @@ -1242,7 +1226,7 @@ SkCodec::Result SkPngCodec::onGetPixels(const SkImageInfo& dstInfo, void* dst, } this->allocateStorage(dstInfo); - this->initializeXformParams(); + this->initializeXformAlphaAndWidth(); return this->decodeAllRows(dst, rowBytes, rowsDecoded); } @@ -1277,7 +1261,7 @@ SkCodec::Result SkPngCodec::onStartIncrementalDecode(const SkImageInfo& dstInfo, SkCodec::Result SkPngCodec::onIncrementalDecode(int* rowsDecoded) { // FIXME: Only necessary on the first call. - this->initializeXformParams(); + this->initializeXformAlphaAndWidth(); return this->decode(rowsDecoded); } @@ -1285,7 +1269,7 @@ SkCodec::Result SkPngCodec::onIncrementalDecode(int* rowsDecoded) { uint64_t SkPngCodec::onGetFillValue(const SkImageInfo& dstInfo) const { const SkPMColor* colorPtr = get_color_ptr(fColorTable.get()); if (colorPtr) { - SkAlphaType alphaType = select_xform_alpha(dstInfo.alphaType(), + SkAlphaType alphaType = select_alpha_xform(dstInfo.alphaType(), this->getInfo().alphaType()); return get_color_table_fill_value(dstInfo.colorType(), alphaType, colorPtr, 0, fColorXform.get()); diff --git a/src/codec/SkPngCodec.h b/src/codec/SkPngCodec.h index 1fc451757e..e3059ba0d5 100644 --- a/src/codec/SkPngCodec.h +++ b/src/codec/SkPngCodec.h @@ -64,7 +64,7 @@ protected: SkSwizzler* swizzler() { return fSwizzler; } // Initialize variables used by applyXformRow. - void initializeXformParams(); + void initializeXformAlphaAndWidth(); /** * Pass available input to libpng to process it. @@ -128,10 +128,9 @@ private: virtual void setRange(int firstRow, int lastRow, void* dst, size_t rowBytes) = 0; virtual Result decode(int* rowsDecoded) = 0; - XformMode fXformMode; - SkColorSpaceXform::ColorFormat fXformColorFormat; - SkAlphaType fXformAlphaType; - int fXformWidth; + XformMode fXformMode; + SkAlphaType fXformAlphaType; + int fXformWidth; #ifdef SK_GOOGLE3_PNG_HACK bool fNeedsToRereadHeader; diff --git a/src/codec/SkWebpCodec.cpp b/src/codec/SkWebpCodec.cpp index 86bda576e4..e8b27b2178 100644 --- a/src/codec/SkWebpCodec.cpp +++ b/src/codec/SkWebpCodec.cpp @@ -307,14 +307,13 @@ SkCodec::Result SkWebpCodec::onGetPixels(const SkImageInfo& dstInfo, void* dst, } if (colorXform) { - SkColorSpaceXform::ColorFormat colorFormat = select_xform_format(dstInfo.colorType()); - SkAlphaType xformAlphaType = select_xform_alpha(dstInfo.alphaType(), + SkAlphaType xformAlphaType = select_alpha_xform(dstInfo.alphaType(), this->getInfo().alphaType()); uint32_t* src = (uint32_t*) config.output.u.RGBA.rgba; size_t srcRowBytes = config.output.u.RGBA.stride; for (int y = 0; y < rowsDecoded; y++) { - colorXform->apply(dst, src, dstInfo.width(), colorFormat, xformAlphaType); + colorXform->apply(dst, src, dstInfo.width(), dstInfo.colorType(), xformAlphaType); dst = SkTAddOffset<void>(dst, rowBytes); src = SkTAddOffset<uint32_t>(src, srcRowBytes); } diff --git a/src/core/SkColorSpaceXform.cpp b/src/core/SkColorSpaceXform.cpp index b1dda34817..599adc90f9 100644 --- a/src/core/SkColorSpaceXform.cpp +++ b/src/core/SkColorSpaceXform.cpp @@ -908,23 +908,8 @@ static inline void store_f16_1(void* dst, const uint32_t* src, } template <SwapRB kSwapRB> -static inline void store_f32(void* dst, const uint32_t* src, - Sk4f& dr, Sk4f& dg, Sk4f& db, Sk4f& da, - const uint8_t* const[3]) { - Sk4f_store4(dst, dr, dg, db, da); -} - -template <SwapRB kSwapRB> -static inline void store_f32_1(void* dst, const uint32_t* src, - Sk4f& rgba, const Sk4f& a, - const uint8_t* const[3]) { - rgba = Sk4f(rgba[0], rgba[1], rgba[2], a[3]); - rgba.store((float*) dst); -} - -template <SwapRB kSwapRB> static inline void store_f16_opaque(void* dst, const uint32_t* src, - Sk4f& dr, Sk4f& dg, Sk4f& db, Sk4f&, + Sk4f& dr, Sk4f& dg, Sk4f& db, Sk4f& da, const uint8_t* const[3]) { Sk4h_store4(dst, SkFloatToHalf_finite_ftz(dr), SkFloatToHalf_finite_ftz(dg), @@ -934,7 +919,7 @@ static inline void store_f16_opaque(void* dst, const uint32_t* src, template <SwapRB kSwapRB> static inline void store_f16_1_opaque(void* dst, const uint32_t* src, - Sk4f& rgba, const Sk4f&, + Sk4f& rgba, const Sk4f& a, const uint8_t* const[3]) { uint64_t tmp; SkFloatToHalf_finite_ftz(rgba).store(&tmp); @@ -1104,7 +1089,6 @@ enum DstFormat { k8888_2Dot2_DstFormat, k8888_Table_DstFormat, kF16_Linear_DstFormat, - kF32_Linear_DstFormat, }; template <SrcFormat kSrc, @@ -1117,12 +1101,9 @@ static void color_xform_RGBA(void* dst, const uint32_t* src, int len, const uint8_t* const dstTables[3]) { LoadFn load; Load1Fn load_1; - static constexpr bool loadAlpha = (kPremul_SkAlphaType == kAlphaType) || - (kF16_Linear_DstFormat == kDst) || - (kF32_Linear_DstFormat == kDst); switch (kSrc) { case kRGBA_8888_Linear_SrcFormat: - if (loadAlpha) { + if (kPremul_SkAlphaType == kAlphaType || kF16_Linear_DstFormat == kDst) { load = load_rgba_linear; load_1 = load_rgba_linear_1; } else { @@ -1131,7 +1112,7 @@ static void color_xform_RGBA(void* dst, const uint32_t* src, int len, } break; case kRGBA_8888_Table_SrcFormat: - if (loadAlpha) { + if (kPremul_SkAlphaType == kAlphaType || kF16_Linear_DstFormat == kDst) { load = load_rgba_from_tables; load_1 = load_rgba_from_tables_1; } else { @@ -1172,11 +1153,6 @@ static void color_xform_RGBA(void* dst, const uint32_t* src, int len, store_f16_1<kSwapRB>; sizeOfDstPixel = 8; break; - case kF32_Linear_DstFormat: - store = store_f32<kSwapRB>; - store_1 = store_f32_1<kSwapRB>; - sizeOfDstPixel = 16; - break; } do_color_xform<kAlphaType, kCSM> @@ -1269,7 +1245,7 @@ static inline void apply_set_src(void* dst, const uint32_t* src, int len, SkAlph template <SrcGamma kSrc, DstGamma kDst, ColorSpaceMatch kCSM> void SkColorSpaceXform_Base<kSrc, kDst, kCSM> -::apply(void* dst, const uint32_t* src, int len, ColorFormat dstColorFormat, SkAlphaType alphaType) +::apply(void* dst, const uint32_t* src, int len, SkColorType dstColorType, SkAlphaType alphaType) const { if (kFull_ColorSpaceMatch == kCSM) { @@ -1279,14 +1255,13 @@ const // linear space. break; default: - switch (dstColorFormat) { - case kRGBA_8888_ColorFormat: + switch (dstColorType) { + case kRGBA_8888_SkColorType: return (void) memcpy(dst, src, len * sizeof(uint32_t)); - case kBGRA_8888_ColorFormat: + case kBGRA_8888_SkColorType: return SkOpts::RGBA_to_BGRA((uint32_t*) dst, src, len); - case kRGBA_F16_ColorFormat: - case kRGBA_F32_ColorFormat: - // There's still work to do to xform to linear floats. + case kRGBA_F16_SkColorType: + // There's still work to do to xform to linear F16. break; default: SkASSERT(false); @@ -1308,8 +1283,8 @@ const src = (const uint32_t*) storage.get(); } - switch (dstColorFormat) { - case kRGBA_8888_ColorFormat: + switch (dstColorType) { + case kRGBA_8888_SkColorType: switch (kDst) { case kLinear_DstGamma: return apply_set_src<kSrc, k8888_Linear_DstFormat, kCSM, kNo_SwapRB> @@ -1324,7 +1299,7 @@ const return apply_set_src<kSrc, k8888_Table_DstFormat, kCSM, kNo_SwapRB> (dst, src, len, alphaType, fSrcGammaTables, fSrcToDst, fDstGammaTables); } - case kBGRA_8888_ColorFormat: + case kBGRA_8888_SkColorType: switch (kDst) { case kLinear_DstGamma: return apply_set_src<kSrc, k8888_Linear_DstFormat, kCSM, kYes_SwapRB> @@ -1339,7 +1314,7 @@ const return apply_set_src<kSrc, k8888_Table_DstFormat, kCSM, kYes_SwapRB> (dst, src, len, alphaType, fSrcGammaTables, fSrcToDst, fDstGammaTables); } - case kRGBA_F16_ColorFormat: + case kRGBA_F16_SkColorType: switch (kDst) { case kLinear_DstGamma: return apply_set_src<kSrc, kF16_Linear_DstFormat, kCSM, kNo_SwapRB> @@ -1348,15 +1323,6 @@ const SkASSERT(false); return; } - case kRGBA_F32_ColorFormat: - switch (kDst) { - case kLinear_DstGamma: - return apply_set_src<kSrc, kF32_Linear_DstFormat, kCSM, kNo_SwapRB> - (dst, src, len, alphaType, fSrcGammaTables, fSrcToDst, nullptr); - default: - SkASSERT(false); - return; - } default: SkASSERT(false); return; diff --git a/src/core/SkColorSpaceXform.h b/src/core/SkColorSpaceXform.h index 6c996a9c09..c80cd15dca 100644 --- a/src/core/SkColorSpaceXform.h +++ b/src/core/SkColorSpaceXform.h @@ -25,27 +25,20 @@ public: static std::unique_ptr<SkColorSpaceXform> New(const sk_sp<SkColorSpace>& srcSpace, const sk_sp<SkColorSpace>& dstSpace); - enum ColorFormat : uint8_t { - kRGBA_8888_ColorFormat, - kBGRA_8888_ColorFormat, - kRGBA_F16_ColorFormat, - kRGBA_F32_ColorFormat, - }; - /** * Apply the color conversion to a |src| buffer, storing the output in the |dst| buffer. * - * @param dst Stored in the format described by |dstColorType| and |dstAlphaType| - * @param src Stored as RGBA_8888, kUnpremul (note kOpaque is a form of kUnpremul) - * @param len Number of pixels in the buffers - * @param dstColorFormat Describes color format of |dst| - * @param dstAlphaType Describes alpha type of |dst| - * kUnpremul preserves input alpha values - * kPremul performs a premultiplication and also preserves alpha values - * kOpaque optimization hint, |dst| alphas set to 1 + * @param dst Stored in the format described by |dstColorType| and |dstAlphaType| + * @param src Stored as RGBA_8888, kUnpremul (note kOpaque is a form of kUnpremul) + * @param len Number of pixels in the buffers + * @param dstColorType Describes color type of |dst| + * @param dstAlphaType Describes alpha type of |dst| + * kUnpremul preserves input alpha values + * kPremul performs a premultiplication and also preserves alpha values + * kOpaque optimization hint, |dst| alphas set to 1 * */ - virtual void apply(void* dst, const uint32_t* src, int len, ColorFormat dstColorFormat, + virtual void apply(void* dst, const uint32_t* src, int len, SkColorType dstColorType, SkAlphaType dstAlphaType) const = 0; virtual ~SkColorSpaceXform() {} @@ -73,7 +66,7 @@ template <SrcGamma kSrc, DstGamma kDst, ColorSpaceMatch kCSM> class SkColorSpaceXform_Base : public SkColorSpaceXform { public: - void apply(void* dst, const uint32_t* src, int len, ColorFormat dstColorFormat, + void apply(void* dst, const uint32_t* src, int len, SkColorType dstColorType, SkAlphaType dstAlphaType) const override; static constexpr int kDstGammaTableSize = 1024; diff --git a/src/core/SkNx.h b/src/core/SkNx.h index 6bca856d8b..881a475ce0 100644 --- a/src/core/SkNx.h +++ b/src/core/SkNx.h @@ -332,28 +332,6 @@ SI void Sk4h_store4(void* dst, const Sk4h& r, const Sk4h& g, const Sk4h& b, cons Sk4h(r[3], g[3], b[3], a[3]).store(dst64 + 3); } -// Load 4 Sk4f and transpose them (512 bits total). -SI void Sk4f_load4(const void* vptr, Sk4f* r, Sk4f* g, Sk4f* b, Sk4f* a) { - const float* ptr = (const float*) vptr; - auto p0 = Sk4f::Load(ptr + 0), - p1 = Sk4f::Load(ptr + 4), - p2 = Sk4f::Load(ptr + 8), - p3 = Sk4f::Load(ptr + 12); - *r = { p0[0], p1[0], p2[0], p3[0] }; - *g = { p0[1], p1[1], p2[1], p3[1] }; - *b = { p0[2], p1[2], p2[2], p3[2] }; - *a = { p0[3], p1[3], p2[3], p3[3] }; -} - -// Transpose 4 Sk4f and store (512 bits total). -SI void Sk4f_store4(void* vdst, const Sk4f& r, const Sk4f& g, const Sk4f& b, const Sk4f& a) { - float* dst = (float*) vdst; - Sk4f(r[0], g[0], b[0], a[0]).store(dst + 0); - Sk4f(r[1], g[1], b[1], a[1]).store(dst + 4); - Sk4f(r[2], g[2], b[2], a[2]).store(dst + 8); - Sk4f(r[3], g[3], b[3], a[3]).store(dst + 12); -} - #endif SI void Sk4f_ToBytes(uint8_t p[16], const Sk4f& a, const Sk4f& b, const Sk4f& c, const Sk4f& d) { diff --git a/src/core/SkPM4fPriv.h b/src/core/SkPM4fPriv.h index f2d2557d3a..89a0caeb70 100644 --- a/src/core/SkPM4fPriv.h +++ b/src/core/SkPM4fPriv.h @@ -55,4 +55,20 @@ static inline Sk4f Sk4f_from_SkColor(SkColor color) { return swizzle_rb(Sk4f_fromS32(color)); } +static inline void assert_unit(float x) { + SkASSERT(0 <= x && x <= 1); +} + +static inline float exact_srgb_to_linear(float srgb) { + assert_unit(srgb); + float linear; + if (srgb <= 0.04045) { + linear = srgb / 12.92f; + } else { + linear = powf((srgb + 0.055f) / 1.055f, 2.4f); + } + assert_unit(linear); + return linear; +} + #endif diff --git a/src/gpu/GrDrawContext.cpp b/src/gpu/GrDrawContext.cpp index 35c53eda0e..e9a9619da5 100644 --- a/src/gpu/GrDrawContext.cpp +++ b/src/gpu/GrDrawContext.cpp @@ -37,7 +37,6 @@ #include "../private/GrAuditTrail.h" -#include "SkColorSpaceXform.h" #include "SkGr.h" #include "SkLatticeIter.h" #include "SkMatrixPriv.h" @@ -97,7 +96,7 @@ GrDrawContext::GrDrawContext(GrContext* context, if (fColorSpace) { // sRGB sources are very common (SkColor, etc...), so we cache that gamut transformation auto srgbColorSpace = SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named); - fColorXformFromSRGB = SkColorSpaceXform::New(srgbColorSpace, fColorSpace); + fColorXformFromSRGB = GrColorSpaceXform::Make(srgbColorSpace.get(), fColorSpace.get()); } SkDEBUGCODE(this->validate();) } diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp index 86b1007ba5..c8839f3f1a 100644 --- a/src/gpu/SkGr.cpp +++ b/src/gpu/SkGr.cpp @@ -23,7 +23,6 @@ #include "SkColorFilter.h" #include "SkConfig8888.h" #include "SkCanvas.h" -#include "SkColorSpaceXform.h" #include "SkData.h" #include "SkErrorInternals.h" #include "SkMessageBus.h" @@ -530,20 +529,18 @@ static inline bool skpaint_to_grpaint_impl(GrContext* context, grPaint->setAntiAlias(skPaint.isAntiAlias()); grPaint->setAllowSRGBInputs(dc->isGammaCorrect()); - GrColor4f origColor; + // Raw translation of the SkPaint color to our 4f format: + GrColor4f origColor = GrColor4f::FromGrColor(SkColorToUnpremulGrColor(skPaint.getColor())); // Linearize, if the color is meant to be in sRGB gamma: if (dc->isGammaCorrect()) { - SkColorSpaceXform* xform = dc->getColorXformFromSRGB(); - SkASSERT(xform); + origColor.fRGBA[0] = exact_srgb_to_linear(origColor.fRGBA[0]); + origColor.fRGBA[1] = exact_srgb_to_linear(origColor.fRGBA[1]); + origColor.fRGBA[2] = exact_srgb_to_linear(origColor.fRGBA[2]); - // FIXME (msarett): Support BGRA inputs to SkColorSpaceXform? - uint32_t rgba = SkSwizzle_RB(skPaint.getColor()); - xform->apply(&origColor, &rgba, 1, SkColorSpaceXform::kRGBA_F32_ColorFormat, - kUnpremul_SkAlphaType); - } else { - // Raw translation of the SkPaint color to our 4f format: - origColor = GrColor4f::FromGrColor(SkColorToUnpremulGrColor(skPaint.getColor())); + if (dc->getColorXformFromSRGB()) { + origColor = dc->getColorXformFromSRGB()->apply(origColor); + } } // Setup the initial color considering the shader, the SkPaint color, and the presence or not diff --git a/src/opts/SkNx_neon.h b/src/opts/SkNx_neon.h index f5a0b09785..a511243219 100644 --- a/src/opts/SkNx_neon.h +++ b/src/opts/SkNx_neon.h @@ -534,23 +534,4 @@ static inline void Sk4h_store4(void* dst, const Sk4h& r, const Sk4h& g, const Sk vst4_u16((uint16_t*) dst, rgba); } -static inline void Sk4f_load4(const void* ptr, Sk4f* r, Sk4f* g, Sk4f* b, Sk4f* a) { - float32x4x4_t rgba = vld4q_f32((const float*) ptr); - *r = rgba.val[0]; - *g = rgba.val[1]; - *b = rgba.val[2]; - *a = rgba.val[3]; -} - -static inline void Sk4f_store4(void* dst, const Sk4f& r, const Sk4f& g, const Sk4f& b, - const Sk4f& a) { - float32x4x4_t rgba = {{ - r.fVec, - g.fVec, - b.fVec, - a.fVec, - }}; - vst4q_f32((float*) dst, rgba); -} - #endif//SkNx_neon_DEFINED diff --git a/src/opts/SkNx_sse.h b/src/opts/SkNx_sse.h index 25a5cd8f84..3e66637df3 100644 --- a/src/opts/SkNx_sse.h +++ b/src/opts/SkNx_sse.h @@ -478,29 +478,4 @@ static inline void Sk4h_store4(void* dst, const Sk4h& r, const Sk4h& g, const Sk _mm_storeu_si128(((__m128i*) dst) + 1, hi); } -static inline void Sk4f_load4(const void* ptr, Sk4f* r, Sk4f* g, Sk4f* b, Sk4f* a) { - __m128 v0 = _mm_loadu_ps(((float*)ptr) + 0), - v1 = _mm_loadu_ps(((float*)ptr) + 4), - v2 = _mm_loadu_ps(((float*)ptr) + 8), - v3 = _mm_loadu_ps(((float*)ptr) + 12); - _MM_TRANSPOSE4_PS(v0, v1, v2, v3); - *r = v0; - *g = v1; - *b = v2; - *a = v3; -} - -static inline void Sk4f_store4(void* dst, const Sk4f& r, const Sk4f& g, const Sk4f& b, - const Sk4f& a) { - __m128 v0 = r.fVec, - v1 = g.fVec, - v2 = b.fVec, - v3 = a.fVec; - _MM_TRANSPOSE4_PS(v0, v1, v2, v3); - _mm_storeu_ps(((float*) dst) + 0, v0); - _mm_storeu_ps(((float*) dst) + 4, v1); - _mm_storeu_ps(((float*) dst) + 8, v2); - _mm_storeu_ps(((float*) dst) + 12, v3); -} - #endif//SkNx_sse_DEFINED diff --git a/tests/ColorSpaceXformTest.cpp b/tests/ColorSpaceXformTest.cpp index 2401af582b..0beb38fb7a 100644 --- a/tests/ColorSpaceXformTest.cpp +++ b/tests/ColorSpaceXformTest.cpp @@ -7,7 +7,6 @@ #include "Resources.h" #include "SkCodec.h" -#include "SkCodecPriv.h" #include "SkColorPriv.h" #include "SkColorSpace.h" #include "SkColorSpace_Base.h" @@ -40,8 +39,7 @@ static void test_identity_xform(skiatest::Reporter* r, const sk_sp<SkGammas>& ga // Create and perform an identity xform. std::unique_ptr<SkColorSpaceXform> xform = ColorSpaceXformTest::CreateIdentityXform(gammas); - xform->apply(dstPixels, srcPixels, width, select_xform_format(kN32_SkColorType), - kOpaque_SkAlphaType); + xform->apply(dstPixels, srcPixels, width, kN32_SkColorType, kOpaque_SkAlphaType); // Since the src->dst matrix is the identity, and the gamma curves match, // the pixels should be unchanged. diff --git a/tests/SkNxTest.cpp b/tests/SkNxTest.cpp index a3aef6bb8e..51d937dd4d 100644 --- a/tests/SkNxTest.cpp +++ b/tests/SkNxTest.cpp @@ -307,35 +307,3 @@ DEF_TEST(SkNx_int_u16, r) { REPORTER_ASSERT(r, expected == actual); } } - -DEF_TEST(SkNx_4fLoad4Store4, r) { - float src[] = { - 0.0f, 1.0f, 2.0f, 3.0f, - 4.0f, 5.0f, 6.0f, 7.0f, - 8.0f, 9.0f, 10.0f, 11.0f, - 12.0f, 13.0f, 14.0f, 15.0f - }; - - Sk4f a, b, c, d; - Sk4f_load4(src, &a, &b, &c, &d); - REPORTER_ASSERT(r, 0.0f == a[0]); - REPORTER_ASSERT(r, 4.0f == a[1]); - REPORTER_ASSERT(r, 8.0f == a[2]); - REPORTER_ASSERT(r, 12.0f == a[3]); - REPORTER_ASSERT(r, 1.0f == b[0]); - REPORTER_ASSERT(r, 5.0f == b[1]); - REPORTER_ASSERT(r, 9.0f == b[2]); - REPORTER_ASSERT(r, 13.0f == b[3]); - REPORTER_ASSERT(r, 2.0f == c[0]); - REPORTER_ASSERT(r, 6.0f == c[1]); - REPORTER_ASSERT(r, 10.0f == c[2]); - REPORTER_ASSERT(r, 14.0f == c[3]); - REPORTER_ASSERT(r, 3.0f == d[0]); - REPORTER_ASSERT(r, 7.0f == d[1]); - REPORTER_ASSERT(r, 11.0f == d[2]); - REPORTER_ASSERT(r, 15.0f == d[3]); - - float dst[16]; - Sk4f_store4(dst, a, b, c, d); - REPORTER_ASSERT(r, 0 == memcmp(dst, src, 16 * sizeof(float))); -} |