Index: src/core/SkColorSpaceXform.cpp |
diff --git a/src/core/SkColorSpaceXform.cpp b/src/core/SkColorSpaceXform.cpp |
index 4a7f17508206afa245281e74fe459d31ff45c036..57b4fa6ddd41d68e61dfdc44fffc68487e66385b 100644 |
--- a/src/core/SkColorSpaceXform.cpp |
+++ b/src/core/SkColorSpaceXform.cpp |
@@ -8,7 +8,7 @@ |
#include "SkColorPriv.h" |
#include "SkColorSpace_Base.h" |
#include "SkColorSpaceXform.h" |
-#include "SkOpts.h" |
+#include "SkColorSpaceXformOpts.h" |
#include "SkSRGB.h" |
static constexpr float sk_linear_from_2dot2[256] = { |
@@ -78,56 +78,6 @@ static constexpr float sk_linear_from_2dot2[256] = { |
0.974300202388861000f, 0.982826255053791000f, 0.991392843592940000f, 1.000000000000000000f, |
}; |
-static void build_table_linear_from_gamma(float* outTable, float exponent) { |
- for (float x = 0.0f; x <= 1.0f; x += (1.0f/255.0f)) { |
- *outTable++ = powf(x, exponent); |
- } |
-} |
- |
-// Interpolating lookup in a variably sized table. |
-static float interp_lut(float input, const float* table, int tableSize) { |
- float index = input * (tableSize - 1); |
- float diff = index - sk_float_floor2int(index); |
- return table[(int) sk_float_floor2int(index)] * (1.0f - diff) + |
- table[(int) sk_float_ceil2int(index)] * diff; |
-} |
- |
-// outTable is always 256 entries, inTable may be larger or smaller. |
-static void build_table_linear_from_gamma(float* outTable, const float* inTable, |
- int inTableSize) { |
- if (256 == inTableSize) { |
- memcpy(outTable, inTable, sizeof(float) * 256); |
- return; |
- } |
- |
- for (float x = 0.0f; x <= 1.0f; x += (1.0f/255.0f)) { |
- *outTable++ = interp_lut(x, inTable, inTableSize); |
- } |
-} |
- |
-static void build_table_linear_from_gamma(float* outTable, float g, float a, float b, float c, |
- float d, float e, float f) { |
- // Y = (aX + b)^g + c for X >= d |
- // Y = eX + f otherwise |
- for (float x = 0.0f; x <= 1.0f; x += (1.0f/255.0f)) { |
- if (x >= d) { |
- *outTable++ = powf(a * x + b, g) + c; |
- } else { |
- *outTable++ = e * x + f; |
- } |
- } |
-} |
- |
-static inline bool compute_gamut_xform(SkMatrix44* srcToDst, const SkMatrix44& srcToXYZ, |
- const SkMatrix44& dstToXYZ) { |
- if (!dstToXYZ.invert(srcToDst)) { |
- return false; |
- } |
- |
- srcToDst->postConcat(srcToXYZ); |
- return true; |
-} |
- |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
static constexpr uint8_t linear_to_srgb[1024] = { |
@@ -190,7 +140,7 @@ static constexpr uint8_t linear_to_srgb[1024] = { |
253, 253, 254, 254, 254, 254, 254, 254, 254, 254, 254, 255, 255, 255, 255, 255 |
}; |
-static constexpr uint8_t linear_to_2dot2[1024] = { |
+static constexpr uint8_t linear_to_2dot2_table[1024] = { |
0, 11, 15, 18, 21, 23, 25, 26, 28, 30, 31, 32, 34, 35, 36, 37, 39, 40, |
41, 42, 43, 44, 45, 45, 46, 47, 48, 49, 50, 50, 51, 52, 53, 54, 54, 55, |
56, 56, 57, 58, 58, 59, 60, 60, 61, 62, 62, 63, 63, 64, 65, 65, 66, 66, |
@@ -250,6 +200,50 @@ static constexpr uint8_t linear_to_2dot2[1024] = { |
253, 253, 254, 254, 254, 254, 254, 254, 254, 254, 254, 255, 255, 255, 255, 255, |
}; |
+/////////////////////////////////////////////////////////////////////////////////////////////////// |
+ |
+static void build_table_linear_from_gamma(float* outTable, float exponent) { |
+ for (float x = 0.0f; x <= 1.0f; x += (1.0f/255.0f)) { |
+ *outTable++ = powf(x, exponent); |
+ } |
+} |
+ |
+// Interpolating lookup in a variably sized table. |
+static float interp_lut(float input, const float* table, int tableSize) { |
+ float index = input * (tableSize - 1); |
+ float diff = index - sk_float_floor2int(index); |
+ return table[(int) sk_float_floor2int(index)] * (1.0f - diff) + |
+ table[(int) sk_float_ceil2int(index)] * diff; |
+} |
+ |
+// outTable is always 256 entries, inTable may be larger or smaller. |
+static void build_table_linear_from_gamma(float* outTable, const float* inTable, |
+ int inTableSize) { |
+ if (256 == inTableSize) { |
+ memcpy(outTable, inTable, sizeof(float) * 256); |
+ return; |
+ } |
+ |
+ for (float x = 0.0f; x <= 1.0f; x += (1.0f/255.0f)) { |
+ *outTable++ = interp_lut(x, inTable, inTableSize); |
+ } |
+} |
+ |
+static void build_table_linear_from_gamma(float* outTable, float g, float a, float b, float c, |
+ float d, float e, float f) { |
+ // Y = (aX + b)^g + c for X >= d |
+ // Y = eX + f otherwise |
+ for (float x = 0.0f; x <= 1.0f; x += (1.0f/255.0f)) { |
+ if (x >= d) { |
+ *outTable++ = powf(a * x + b, g) + c; |
+ } else { |
+ *outTable++ = e * x + f; |
+ } |
+ } |
+} |
+ |
+/////////////////////////////////////////////////////////////////////////////////////////////////// |
+ |
// Expand range from 0-1 to 0-255, then convert. |
static uint8_t clamp_normalized_float_to_byte(float v) { |
// The ordering of the logic is a little strange here in order |
@@ -373,7 +367,7 @@ static const GammaFns<float> kToLinear { |
static const GammaFns<uint8_t> kFromLinear { |
linear_to_srgb, |
- linear_to_2dot2, |
+ linear_to_2dot2_table, |
&build_table_linear_to_gamma, |
&build_table_linear_to_gamma, |
&build_table_linear_to_gamma, |
@@ -449,6 +443,18 @@ static void build_gamma_tables(const T* outGammaTables[3], T* gammaTableStorage, |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
+static inline bool compute_gamut_xform(SkMatrix44* srcToDst, const SkMatrix44& srcToXYZ, |
+ const SkMatrix44& dstToXYZ) { |
+ if (!dstToXYZ.invert(srcToDst)) { |
+ return false; |
+ } |
+ |
+ srcToDst->postConcat(srcToXYZ); |
+ return true; |
+} |
+ |
+/////////////////////////////////////////////////////////////////////////////////////////////////// |
+ |
std::unique_ptr<SkColorSpaceXform> SkColorSpaceXform::New(const sk_sp<SkColorSpace>& srcSpace, |
const sk_sp<SkColorSpace>& dstSpace) { |
if (!srcSpace || !dstSpace) { |
@@ -615,8 +621,8 @@ static void handle_color_lut(uint32_t* dst, const uint32_t* src, int len, |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
-template <SkColorSpace::GammaNamed Dst> |
-SkColorSpaceXform_Base<Dst>::SkColorSpaceXform_Base(const sk_sp<SkColorSpace>& srcSpace, |
+template <SkColorSpace::GammaNamed kDst> |
+SkColorSpaceXform_Base<kDst>::SkColorSpaceXform_Base(const sk_sp<SkColorSpace>& srcSpace, |
const SkMatrix44& srcToDst, |
const sk_sp<SkColorSpace>& dstSpace) |
: fColorLUT(sk_ref_sp((SkColorLookUpTable*) as_CSB(srcSpace)->colorLUT())) |
@@ -636,7 +642,8 @@ void SkColorSpaceXform_Base<SkColorSpace::kSRGB_GammaNamed> |
src = dst; |
} |
- SkOpts::color_xform_RGB1_to_srgb(dst, src, len, fSrcGammaTables, fSrcToDst); |
+ color_xform_RGBA<SkColorSpace::kSRGB_GammaNamed, false, false> |
+ (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables); |
} |
template <> |
@@ -648,7 +655,8 @@ void SkColorSpaceXform_Base<SkColorSpace::k2Dot2Curve_GammaNamed> |
src = dst; |
} |
- SkOpts::color_xform_RGB1_to_2dot2(dst, src, len, fSrcGammaTables, fSrcToDst); |
+ color_xform_RGBA<SkColorSpace::k2Dot2Curve_GammaNamed, false, false> |
+ (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables); |
} |
template <> |
@@ -660,7 +668,8 @@ void SkColorSpaceXform_Base<SkColorSpace::kNonStandard_GammaNamed> |
src = dst; |
} |
- SkOpts::color_xform_RGB1_to_table(dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables); |
+ color_xform_RGBA<SkColorSpace::kNonStandard_GammaNamed, false, false> |
+ (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables); |
} |
template <> |
@@ -672,7 +681,8 @@ void SkColorSpaceXform_Base<SkColorSpace::kSRGB_GammaNamed> |
src = dst; |
} |
- SkOpts::color_xform_RGB1_to_srgb_swaprb(dst, src, len, fSrcGammaTables, fSrcToDst); |
+ color_xform_RGBA<SkColorSpace::kSRGB_GammaNamed, false, true> |
+ (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables); |
} |
template <> |
@@ -684,7 +694,8 @@ void SkColorSpaceXform_Base<SkColorSpace::k2Dot2Curve_GammaNamed> |
src = dst; |
} |
- SkOpts::color_xform_RGB1_to_2dot2_swaprb(dst, src, len, fSrcGammaTables, fSrcToDst); |
+ color_xform_RGBA<SkColorSpace::k2Dot2Curve_GammaNamed, false, true> |
+ (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables); |
} |
template <> |
@@ -696,8 +707,8 @@ void SkColorSpaceXform_Base<SkColorSpace::kNonStandard_GammaNamed> |
src = dst; |
} |
- SkOpts::color_xform_RGB1_to_table_swaprb(dst, src, len, fSrcGammaTables, fSrcToDst, |
- fDstGammaTables); |
+ color_xform_RGBA<SkColorSpace::kNonStandard_GammaNamed, false, true> |
+ (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables); |
} |
template <SkColorSpace::GammaNamed T> |
@@ -717,5 +728,6 @@ void SkColorSpaceXform_Base<T> |
src = (const RGBA32*) storage.get(); |
} |
- SkOpts::color_xform_RGB1_to_linear(dst, src, len, fSrcGammaTables, fSrcToDst); |
+ color_xform_RGBA<SkColorSpace::kLinear_GammaNamed, false, false> |
+ (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables); |
} |