Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(126)

Unified Diff: src/core/SkColorSpaceXform.cpp

Issue 2339233003: Support Float32 output from SkColorSpaceXform (Closed)
Patch Set: Some fixes Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/core/SkColorSpaceXform.cpp
diff --git a/src/core/SkColorSpaceXform.cpp b/src/core/SkColorSpaceXform.cpp
index 2677b3bb8dbacb5b48390b895638b76cdb291b18..79c65753e645bc7151c006b1edd64a2e462feb05 100644
--- a/src/core/SkColorSpaceXform.cpp
+++ b/src/core/SkColorSpaceXform.cpp
@@ -907,8 +907,23 @@ 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,
msarett 2016/09/14 20:20:35 I originally wrote a "store_f32_opaque()" version
+ 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& da,
+ Sk4f& dr, Sk4f& dg, Sk4f& db, Sk4f&,
const uint8_t* const[3]) {
Sk4h_store4(dst, SkFloatToHalf_finite_ftz(dr),
SkFloatToHalf_finite_ftz(dg),
@@ -918,7 +933,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& a,
+ Sk4f& rgba, const Sk4f&,
const uint8_t* const[3]) {
uint64_t tmp;
SkFloatToHalf_finite_ftz(rgba).store(&tmp);
@@ -1088,6 +1103,7 @@ enum DstFormat {
k8888_2Dot2_DstFormat,
k8888_Table_DstFormat,
kF16_Linear_DstFormat,
+ kF32_Linear_DstFormat,
};
template <SrcFormat kSrc,
@@ -1100,9 +1116,12 @@ 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 (kPremul_SkAlphaType == kAlphaType || kF16_Linear_DstFormat == kDst) {
+ if (loadAlpha) {
load = load_rgba_linear;
load_1 = load_rgba_linear_1;
} else {
@@ -1111,7 +1130,7 @@ static void color_xform_RGBA(void* dst, const uint32_t* src, int len,
}
break;
case kRGBA_8888_Table_SrcFormat:
- if (kPremul_SkAlphaType == kAlphaType || kF16_Linear_DstFormat == kDst) {
+ if (loadAlpha) {
load = load_rgba_from_tables;
load_1 = load_rgba_from_tables_1;
} else {
@@ -1152,6 +1171,11 @@ 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>
@@ -1244,7 +1268,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, SkColorType dstColorType, SkAlphaType alphaType)
+::apply(void* dst, const uint32_t* src, int len, ColorFormat dstColorFormat, SkAlphaType alphaType)
const
{
if (kFull_ColorSpaceMatch == kCSM) {
@@ -1254,13 +1278,14 @@ const
// linear space.
break;
default:
- switch (dstColorType) {
- case kRGBA_8888_SkColorType:
+ switch (dstColorFormat) {
+ case kRGBA_8888_ColorFormat:
return (void) memcpy(dst, src, len * sizeof(uint32_t));
- case kBGRA_8888_SkColorType:
+ case kBGRA_8888_ColorFormat:
return SkOpts::RGBA_to_BGRA((uint32_t*) dst, src, len);
- case kRGBA_F16_SkColorType:
- // There's still work to do to xform to linear F16.
+ case kRGBA_F16_ColorFormat:
+ case kRGBA_F32_ColorFormat:
+ // There's still work to do to xform to linear floats.
break;
default:
SkASSERT(false);
@@ -1282,8 +1307,8 @@ const
src = (const uint32_t*) storage.get();
}
- switch (dstColorType) {
- case kRGBA_8888_SkColorType:
+ switch (dstColorFormat) {
+ case kRGBA_8888_ColorFormat:
switch (kDst) {
case kLinear_DstGamma:
return apply_set_src<kSrc, k8888_Linear_DstFormat, kCSM, kNo_SwapRB>
@@ -1298,7 +1323,7 @@ const
return apply_set_src<kSrc, k8888_Table_DstFormat, kCSM, kNo_SwapRB>
(dst, src, len, alphaType, fSrcGammaTables, fSrcToDst, fDstGammaTables);
}
- case kBGRA_8888_SkColorType:
+ case kBGRA_8888_ColorFormat:
switch (kDst) {
case kLinear_DstGamma:
return apply_set_src<kSrc, k8888_Linear_DstFormat, kCSM, kYes_SwapRB>
@@ -1313,7 +1338,7 @@ const
return apply_set_src<kSrc, k8888_Table_DstFormat, kCSM, kYes_SwapRB>
(dst, src, len, alphaType, fSrcGammaTables, fSrcToDst, fDstGammaTables);
}
- case kRGBA_F16_SkColorType:
+ case kRGBA_F16_ColorFormat:
switch (kDst) {
case kLinear_DstGamma:
return apply_set_src<kSrc, kF16_Linear_DstFormat, kCSM, kNo_SwapRB>
@@ -1322,6 +1347,15 @@ 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;

Powered by Google App Engine
This is Rietveld 408576698