diff options
author | 2016-02-17 07:15:29 -0800 | |
---|---|---|
committer | 2016-02-17 07:15:30 -0800 | |
commit | d96e7e503fd24825a6717d58e90a97f95e8ebbc6 (patch) | |
tree | 0450239b255fa7375f7c0e0ed8517258133398bf /src/core/SkBitmap.cpp | |
parent | 34d26b965237de84ffc54eaf6213fd8bb07c10d1 (diff) |
misc fixes to make float buffers work a little better
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1703013002
TBR=fmalita
Review URL: https://codereview.chromium.org/1703013002
Diffstat (limited to 'src/core/SkBitmap.cpp')
-rw-r--r-- | src/core/SkBitmap.cpp | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/core/SkBitmap.cpp b/src/core/SkBitmap.cpp index bdf1daafcc..fdb66b378b 100644 --- a/src/core/SkBitmap.cpp +++ b/src/core/SkBitmap.cpp @@ -563,6 +563,8 @@ void* SkBitmap::getAddr(int x, int y) const { return base; } +#include "SkHalf.h" + SkColor SkBitmap::getColor(int x, int y) const { SkASSERT((unsigned)x < (unsigned)this->width()); SkASSERT((unsigned)y < (unsigned)this->height()); @@ -599,6 +601,18 @@ SkColor SkBitmap::getColor(int x, int y) const { SkPMColor c = SkSwizzle_RGBA_to_PMColor(addr[0]); return SkUnPreMultiply::PMColorToColor(c); } + case kRGBA_F16_SkColorType: { + const uint64_t* addr = (const uint64_t*)fPixels + y * (fRowBytes >> 3) + x; + Sk4f p4 = SkHalfToFloat_01(addr[0]); + if (p4[3]) { + float inva = 1 / p4[3]; + p4 = p4 * Sk4f(inva, inva, inva, 1); + } + SkColor c; + SkNx_cast<uint8_t>(p4 * Sk4f(255) + Sk4f(0.5f)).store(&c); + // p4 is RGBA, but we want BGRA, so we need to swap next + return SkSwizzle_RB(c); + } default: SkASSERT(false); return 0; |