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

Unified Diff: src/core/SkColorSpaceXform.cpp

Issue 2339233003: Support Float32 output from SkColorSpaceXform (Closed)
Patch Set: Remove gpu changes 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
« no previous file with comments | « src/core/SkColorSpaceXform.h ('k') | src/core/SkNx.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/core/SkColorSpaceXform.cpp
diff --git a/src/core/SkColorSpaceXform.cpp b/src/core/SkColorSpaceXform.cpp
index 599adc90f959609062c6d9955ec01b0560428321..b1dda348177f0599cdc796e11c55bbe1e9d8e4e6 100644
--- a/src/core/SkColorSpaceXform.cpp
+++ b/src/core/SkColorSpaceXform.cpp
@@ -908,8 +908,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,
+ 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),
@@ -919,7 +934,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);
@@ -1089,6 +1104,7 @@ enum DstFormat {
k8888_2Dot2_DstFormat,
k8888_Table_DstFormat,
kF16_Linear_DstFormat,
+ kF32_Linear_DstFormat,
};
template <SrcFormat kSrc,
@@ -1101,9 +1117,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 {
@@ -1112,7 +1131,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 {
@@ -1153,6 +1172,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>
@@ -1245,7 +1269,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) {
@@ -1255,13 +1279,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);
@@ -1283,8 +1308,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>
@@ -1299,7 +1324,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>
@@ -1314,7 +1339,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>
@@ -1323,6 +1348,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;
« no previous file with comments | « src/core/SkColorSpaceXform.h ('k') | src/core/SkNx.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698