diff options
author | reed <reed@google.com> | 2016-02-05 11:18:39 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-02-05 11:18:39 -0800 |
commit | 3601f280dc400cb75167393b0a2b6670b5f25ea4 (patch) | |
tree | a8aa9ff7658b049ca0aec0ea1729921122fe22d0 /src | |
parent | 06604b95622359640a1c2028b885646deda28d52 (diff) |
add kRGBA_F16_SkColorType
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1666343002
Review URL: https://codereview.chromium.org/1666343002
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkColor.cpp | 38 | ||||
-rw-r--r-- | src/core/SkPixmap.cpp | 35 | ||||
-rw-r--r-- | src/gpu/SkGr.cpp | 2 |
3 files changed, 68 insertions, 7 deletions
diff --git a/src/core/SkColor.cpp b/src/core/SkColor.cpp index 87e3a9d60e..c0a3895bbe 100644 --- a/src/core/SkColor.cpp +++ b/src/core/SkColor.cpp @@ -103,6 +103,7 @@ SkColor SkHSVToColor(U8CPU a, const SkScalar hsv[3]) { /////////////////////////////////////////////////////////////////////////////////////////////////// #include "SkNx.h" +#include "SkHalf.h" SkPM4f SkPM4f::FromPMColor(SkPMColor c) { Sk4f value = SkNx_cast<float>(Sk4b::Load(&c)); @@ -121,6 +122,36 @@ SkColor4f SkPM4f::unpremul() const { } } +void SkPM4f::toF16(uint16_t half[4]) const { + for (int i = 0; i < 4; ++i) { + half[i] = SkFloatToHalf(fVec[i]); + } +} + +uint64_t SkPM4f::toF16() const { + uint64_t value; + this->toF16(reinterpret_cast<uint16_t*>(&value)); + return value; +} + +SkPM4f SkPM4f::FromF16(const uint16_t half[4]) { + return {{ + SkHalfToFloat(half[0]), + SkHalfToFloat(half[1]), + SkHalfToFloat(half[2]), + SkHalfToFloat(half[3]) + }}; +} + +#ifdef SK_DEBUG +void SkPM4f::assertIsUnit() const { + auto c4 = Sk4f::Load(fVec); + SkASSERT((c4 >= Sk4f(0)).allTrue() && (c4 <= Sk4f(1)).allTrue()); +} +#endif + +/////////////////////////////////////////////////////////////////////////////////////////////////// + SkColor4f SkColor4f::FromColor(SkColor c) { Sk4f value = SkNx_shuffle<3,2,1,0>(SkNx_cast<float>(Sk4b::Load(&c))); SkColor4f c4; @@ -151,10 +182,3 @@ SkPM4f SkColor4f::premul() const { dst.store(&pm4); return pm4; } - -#ifdef SK_DEBUG -void SkPM4f::assertIsUnit() const { - auto c4 = Sk4f::Load(fVec); - SkASSERT((c4 >= Sk4f(0)).allTrue() && (c4 <= Sk4f(1)).allTrue()); -} -#endif diff --git a/src/core/SkPixmap.cpp b/src/core/SkPixmap.cpp index e2d4d30ebf..f28566871a 100644 --- a/src/core/SkPixmap.cpp +++ b/src/core/SkPixmap.cpp @@ -207,6 +207,41 @@ bool SkPixmap::erase(SkColor color, const SkIRect& inArea) const { return true; } +#include "SkNx.h" +#include "SkHalf.h" + +static void sk_memset64(uint64_t dst[], uint64_t value, int count) { + for (int i = 0; i < count; ++i) { + dst[i] = value; + } +} + +bool SkPixmap::erase(const SkColor4f& origColor, const SkIRect* subset) const { + SkPixmap pm; + if (subset) { + if (!this->extractSubset(&pm, *subset)) { + return false; + } + } else { + pm = *this; + } + + const SkColor4f color = origColor.pin(); + + if (kRGBA_F16_SkColorType != pm.colorType()) { + Sk4f c4 = Sk4f::Load(color.vec()); + SkColor c; + (c4 * Sk4f(255) + Sk4f(0.5f)).store(&c); + return pm.erase(c); + } + + const uint64_t half4 = color.premul().toF16(); + for (int y = 0; y < pm.height(); ++y) { + sk_memset64(pm.writable_addr64(0, y), half4, pm.width()); + } + return true; +} + #include "SkBitmap.h" #include "SkCanvas.h" #include "SkSurface.h" diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp index 62b7ff14ea..e4dc467e7f 100644 --- a/src/gpu/SkGr.cpp +++ b/src/gpu/SkGr.cpp @@ -318,6 +318,8 @@ GrPixelConfig SkImageInfo2GrPixelConfig(SkColorType ct, SkAlphaType, SkColorProf return kIndex_8_GrPixelConfig; case kGray_8_SkColorType: return kAlpha_8_GrPixelConfig; // TODO: gray8 support on gpu + case kRGBA_F16_SkColorType: + return kRGBA_half_GrPixelConfig; } SkASSERT(0); // shouldn't get here return kUnknown_GrPixelConfig; |