diff options
author | Mike Klein <mtklein@chromium.org> | 2018-06-26 11:43:06 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-06-26 19:02:52 +0000 |
commit | 3785471ff641b7ec4218a32fcf76363b9ac81bab (patch) | |
tree | 7596487528841f9a6e32c105c909667c54799d72 /src | |
parent | 9b6125d046198bff736a509769b51908aaff326a (diff) |
basic first pass at RGBA F32 support
Draws basically the same as f16.
The existing load_f32, load_f32_dst, and store_f32 stages all had the
same bug that we'd never noticed because dy was always 0 until now.
Change-Id: Ibbd393fa1acc5df414be4cdef0f5a9d11dcccdb3
Reviewed-on: https://skia-review.googlesource.com/137585
Commit-Queue: Mike Klein <mtklein@chromium.org>
Reviewed-by: Brian Osman <brianosman@google.com>
Reviewed-by: Mike Reed <reed@google.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/codec/SkWebpCodec.cpp | 4 | ||||
-rw-r--r-- | src/core/SkBitmap.cpp | 3 | ||||
-rw-r--r-- | src/core/SkBitmapDevice.cpp | 1 | ||||
-rw-r--r-- | src/core/SkBlitter_Sprite.cpp | 1 | ||||
-rw-r--r-- | src/core/SkCanvas.cpp | 1 | ||||
-rw-r--r-- | src/core/SkConvertPixels.cpp | 16 | ||||
-rw-r--r-- | src/core/SkImageInfo.cpp | 2 | ||||
-rw-r--r-- | src/core/SkPixmap.cpp | 63 | ||||
-rw-r--r-- | src/core/SkRasterPipeline.h | 2 | ||||
-rw-r--r-- | src/core/SkRasterPipelineBlitter.cpp | 7 | ||||
-rw-r--r-- | src/gpu/SkGr.cpp | 2 | ||||
-rw-r--r-- | src/gpu/gl/GrGLCaps.cpp | 5 | ||||
-rw-r--r-- | src/gpu/vk/GrVkCaps.cpp | 5 | ||||
-rw-r--r-- | src/image/SkSurface_Gpu.cpp | 2 | ||||
-rw-r--r-- | src/image/SkSurface_Raster.cpp | 1 | ||||
-rw-r--r-- | src/images/SkImageEncoderFns.h | 36 | ||||
-rw-r--r-- | src/images/SkPngEncoder.cpp | 12 | ||||
-rw-r--r-- | src/opts/SkRasterPipeline_opts.h | 14 | ||||
-rw-r--r-- | src/shaders/SkImageShader.cpp | 1 |
19 files changed, 154 insertions, 24 deletions
diff --git a/src/codec/SkWebpCodec.cpp b/src/codec/SkWebpCodec.cpp index e26f46d074..b6485b1b9c 100644 --- a/src/codec/SkWebpCodec.cpp +++ b/src/codec/SkWebpCodec.cpp @@ -365,6 +365,10 @@ static void pick_memory_stages(SkColorType ct, SkRasterPipeline::StockStage* loa if (load) *load = SkRasterPipeline::load_f16; if (store) *store = SkRasterPipeline::store_f16; break; + case kRGBA_F32_SkColorType: + if (load) *load = SkRasterPipeline::load_f32; + if (store) *store = SkRasterPipeline::store_f32; + break; } } diff --git a/src/core/SkBitmap.cpp b/src/core/SkBitmap.cpp index e942a4c2d2..4ef7abf95c 100644 --- a/src/core/SkBitmap.cpp +++ b/src/core/SkBitmap.cpp @@ -384,6 +384,9 @@ void* SkBitmap::getAddr(int x, int y) const { if (base) { base += y * this->rowBytes(); switch (this->colorType()) { + case kRGBA_F32_SkColorType: + base += x << 4; + break; case kRGBA_F16_SkColorType: base += x << 3; break; diff --git a/src/core/SkBitmapDevice.cpp b/src/core/SkBitmapDevice.cpp index 81ff5bae2a..2361468d56 100644 --- a/src/core/SkBitmapDevice.cpp +++ b/src/core/SkBitmapDevice.cpp @@ -210,6 +210,7 @@ static bool valid_for_bitmap_device(const SkImageInfo& info, case kBGRA_8888_SkColorType: case kRGBA_1010102_SkColorType: case kRGBA_F16_SkColorType: + case kRGBA_F32_SkColorType: break; case kGray_8_SkColorType: case kRGB_565_SkColorType: diff --git a/src/core/SkBlitter_Sprite.cpp b/src/core/SkBlitter_Sprite.cpp index 7385128195..057b2a5d07 100644 --- a/src/core/SkBlitter_Sprite.cpp +++ b/src/core/SkBlitter_Sprite.cpp @@ -123,6 +123,7 @@ public: case kRGBA_8888_SkColorType: p.append(SkRasterPipeline::load_8888, ctx); break; case kRGBA_1010102_SkColorType: p.append(SkRasterPipeline::load_1010102, ctx); break; case kRGBA_F16_SkColorType: p.append(SkRasterPipeline::load_f16, ctx); break; + case kRGBA_F32_SkColorType: p.append(SkRasterPipeline::load_f32, ctx); break; case kRGB_888x_SkColorType: p.append(SkRasterPipeline::load_8888, ctx); p.append(SkRasterPipeline::force_opaque ); break; diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp index be3ebb1a15..b297f98156 100644 --- a/src/core/SkCanvas.cpp +++ b/src/core/SkCanvas.cpp @@ -2871,6 +2871,7 @@ static bool supported_for_raster_canvas(const SkImageInfo& info) { case kRGB_565_SkColorType: case kN32_SkColorType: case kRGBA_F16_SkColorType: + case kRGBA_F32_SkColorType: case kRGBA_1010102_SkColorType: break; default: diff --git a/src/core/SkConvertPixels.cpp b/src/core/SkConvertPixels.cpp index b0d37cd89f..25645d485c 100644 --- a/src/core/SkConvertPixels.cpp +++ b/src/core/SkConvertPixels.cpp @@ -231,6 +231,16 @@ static void convert_to_alpha8(uint8_t* dst, size_t dstRB, const SkImageInfo& src } break; } + case kRGBA_F32_SkColorType: { + auto rgba = (const float*)src; + for (int y = 0; y < srcInfo.height(); y++) { + for (int x = 0; x < srcInfo.width(); x++) { + dst[x] = (uint8_t)(255.0f * rgba[4*x+3]); + } + dst = SkTAddOffset<uint8_t>(dst, dstRB); + rgba = SkTAddOffset<const float>(rgba, srcRB); + } + } break; default: SkASSERT(false); break; @@ -270,6 +280,9 @@ static void convert_with_pipeline(const SkImageInfo& dstInfo, void* dstRow, size case kRGBA_F16_SkColorType: pipeline.append(SkRasterPipeline::load_f16, &src); break; + case kRGBA_F32_SkColorType: + pipeline.append(SkRasterPipeline::load_f32, &src); + break; case kGray_8_SkColorType: pipeline.append(SkRasterPipeline::load_g8, &src); break; @@ -381,6 +394,9 @@ static void convert_with_pipeline(const SkImageInfo& dstInfo, void* dstRow, size case kRGBA_F16_SkColorType: pipeline.append(SkRasterPipeline::store_f16, &dst); break; + case kRGBA_F32_SkColorType: + pipeline.append(SkRasterPipeline::store_f32, &dst); + break; case kARGB_4444_SkColorType: pipeline.append(SkRasterPipeline::store_4444, &dst); break; diff --git a/src/core/SkImageInfo.cpp b/src/core/SkImageInfo.cpp index c0943017d9..0a98c28ace 100644 --- a/src/core/SkImageInfo.cpp +++ b/src/core/SkImageInfo.cpp @@ -23,6 +23,7 @@ int SkColorTypeBytesPerPixel(SkColorType ct) { case kRGB_101010x_SkColorType: return 4; case kGray_8_SkColorType: return 1; case kRGBA_F16_SkColorType: return 8; + case kRGBA_F32_SkColorType: return 16; } return 0; } @@ -74,6 +75,7 @@ bool SkColorTypeValidateAlphaType(SkColorType colorType, SkAlphaType alphaType, case kBGRA_8888_SkColorType: case kRGBA_1010102_SkColorType: case kRGBA_F16_SkColorType: + case kRGBA_F32_SkColorType: if (kUnknown_SkAlphaType == alphaType) { return false; } diff --git a/src/core/SkPixmap.cpp b/src/core/SkPixmap.cpp index 6eaf679715..77b174b154 100644 --- a/src/core/SkPixmap.cpp +++ b/src/core/SkPixmap.cpp @@ -230,6 +230,7 @@ bool SkPixmap::erase(SkColor color, const SkIRect& inArea) const { } case kRGBA_F16_SkColorType: + case kRGBA_F32_SkColorType: // The colorspace is unspecified, so assume linear just like getColor(). this->erase(SkColor4f{(1 / 255.0f) * r, (1 / 255.0f) * g, @@ -254,15 +255,29 @@ bool SkPixmap::erase(const SkColor4f& origColor, const SkIRect* subset) const { const SkColor4f color = origColor.pin(); - if (kRGBA_F16_SkColorType != pm.colorType()) { - return pm.erase(color.toSkColor()); + if (pm.colorType() == kRGBA_F16_SkColorType) { + 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; } - 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()); + if (pm.colorType() == kRGBA_F32_SkColorType) { + const SkPM4f rgba = color.premul(); + for (int y = 0; y < pm.height(); ++y) { + auto row = (float*)pm.writable_addr(); + for (int x = 0; x < pm.width(); ++x) { + row[4*x+0] = rgba.r(); + row[4*x+1] = rgba.g(); + row[4*x+2] = rgba.b(); + row[4*x+3] = rgba.a(); + } + } + return true; } - return true; + + return pm.erase(color.toSkColor()); } bool SkPixmap::scalePixels(const SkPixmap& actualDst, SkFilterQuality quality) const { @@ -396,17 +411,31 @@ SkColor SkPixmap::getColor(int x, int y) const { | (uint32_t)( a * 255.0f ) << 24; } case kRGBA_F16_SkColorType: { - const uint64_t* addr = - (const uint64_t*)fPixels + y * (fRowBytes >> 3) + x; - Sk4f p4 = SkHalfToFloat_finite_ftz(*addr); - if (p4[3] && needsUnpremul) { - 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); + const uint64_t* addr = + (const uint64_t*)fPixels + y * (fRowBytes >> 3) + x; + Sk4f p4 = SkHalfToFloat_finite_ftz(*addr); + if (p4[3] && needsUnpremul) { + 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); + } + case kRGBA_F32_SkColorType: { + const float* rgba = + (const float*)fPixels + 4*y*(fRowBytes >> 4) + 4*x; + Sk4f p4 = Sk4f::Load(rgba); + // From here on, just like F16: + if (p4[3] && needsUnpremul) { + 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: SkDEBUGFAIL(""); diff --git a/src/core/SkRasterPipeline.h b/src/core/SkRasterPipeline.h index 1dd346f22d..36f7ce3eeb 100644 --- a/src/core/SkRasterPipeline.h +++ b/src/core/SkRasterPipeline.h @@ -49,7 +49,7 @@ M(load_565) M(load_565_dst) M(store_565) M(gather_565) \ M(load_4444) M(load_4444_dst) M(store_4444) M(gather_4444) \ M(load_f16) M(load_f16_dst) M(store_f16) M(gather_f16) \ - M(load_f32) M(load_f32_dst) M(store_f32) \ + M(load_f32) M(load_f32_dst) M(store_f32) M(gather_f32) \ M(load_8888) M(load_8888_dst) M(store_8888) M(gather_8888) \ M(load_bgra) M(load_bgra_dst) M(store_bgra) M(gather_bgra) \ M(load_1010102) M(load_1010102_dst) M(store_1010102) M(gather_1010102) \ diff --git a/src/core/SkRasterPipelineBlitter.cpp b/src/core/SkRasterPipelineBlitter.cpp index 8b37bef24f..66a4a62734 100644 --- a/src/core/SkRasterPipelineBlitter.cpp +++ b/src/core/SkRasterPipelineBlitter.cpp @@ -210,7 +210,8 @@ SkBlitter* SkRasterPipelineBlitter::Create(const SkPixmap& dst, // When we're drawing a constant color in Src mode, we can sometimes just memset. // (The previous two optimizations help find more opportunities for this one.) - if (is_constant && blitter->fBlend == SkBlendMode::kSrc) { + if (is_constant && blitter->fBlend == SkBlendMode::kSrc + && blitter->fDst.shiftPerPixel() <= 3 /*TODO: F32*/) { // Run our color pipeline all the way through to produce what we'd memset when we can. // Not all blits can memset, so we need to keep colorPipeline too. SkRasterPipeline_<256> p; @@ -243,6 +244,7 @@ void SkRasterPipelineBlitter::append_load_dst(SkRasterPipeline* p) const { case kRGBA_8888_SkColorType: p->append(SkRasterPipeline::load_8888_dst, ctx); break; case kRGBA_1010102_SkColorType: p->append(SkRasterPipeline::load_1010102_dst, ctx); break; case kRGBA_F16_SkColorType: p->append(SkRasterPipeline::load_f16_dst, ctx); break; + case kRGBA_F32_SkColorType: p->append(SkRasterPipeline::load_f32_dst, ctx); break; case kRGB_888x_SkColorType: p->append(SkRasterPipeline::load_8888_dst, ctx); p->append(SkRasterPipeline::force_opaque_dst ); break; @@ -275,6 +277,7 @@ void SkRasterPipelineBlitter::append_store(SkRasterPipeline* p) const { case kRGBA_8888_SkColorType: p->append(SkRasterPipeline::store_8888, ctx); break; case kRGBA_1010102_SkColorType: p->append(SkRasterPipeline::store_1010102, ctx); break; case kRGBA_F16_SkColorType: p->append(SkRasterPipeline::store_f16, ctx); break; + case kRGBA_F32_SkColorType: p->append(SkRasterPipeline::store_f32, ctx); break; case kRGB_888x_SkColorType: p->append(SkRasterPipeline::force_opaque ); p->append(SkRasterPipeline::store_8888, ctx); break; @@ -305,7 +308,7 @@ void SkRasterPipelineBlitter::blitRect(int x, int y, int w, int h) { case 1: sk_memset16(fDst.writable_addr16(x,y), fMemsetColor, w); break; case 2: sk_memset32(fDst.writable_addr32(x,y), fMemsetColor, w); break; case 3: sk_memset64(fDst.writable_addr64(x,y), fMemsetColor, w); break; - default: break; + default: SkASSERT(false); break; } } return; diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp index f872756159..a0a934094e 100644 --- a/src/gpu/SkGr.cpp +++ b/src/gpu/SkGr.cpp @@ -252,6 +252,8 @@ GrPixelConfig SkColorType2GrPixelConfig(const SkColorType type) { return kGray_8_GrPixelConfig; case kRGBA_F16_SkColorType: return kRGBA_half_GrPixelConfig; + case kRGBA_F32_SkColorType: + return kRGBA_float_GrPixelConfig; } SkASSERT(0); // shouldn't get here return kUnknown_GrPixelConfig; diff --git a/src/gpu/gl/GrGLCaps.cpp b/src/gpu/gl/GrGLCaps.cpp index d180ac264d..43979fa290 100644 --- a/src/gpu/gl/GrGLCaps.cpp +++ b/src/gpu/gl/GrGLCaps.cpp @@ -2894,6 +2894,11 @@ bool validate_sized_format(GrGLenum format, SkColorType ct, GrPixelConfig* confi *config = kRGBA_half_GrPixelConfig; } break; + case kRGBA_F32_SkColorType: + if (GR_GL_RGBA32F == format) { + *config = kRGBA_float_GrPixelConfig; + } + break; } return kUnknown_GrPixelConfig != *config; diff --git a/src/gpu/vk/GrVkCaps.cpp b/src/gpu/vk/GrVkCaps.cpp index cc9d0ca815..1a14648642 100644 --- a/src/gpu/vk/GrVkCaps.cpp +++ b/src/gpu/vk/GrVkCaps.cpp @@ -625,6 +625,11 @@ bool validate_image_info(VkFormat format, SkColorType ct, GrPixelConfig* config) *config = kRGBA_half_GrPixelConfig; } break; + case kRGBA_F32_SkColorType: + if (VK_FORMAT_R32G32B32A32_SFLOAT == format) { + *config = kRGBA_float_GrPixelConfig; + } + break; } return kUnknown_GrPixelConfig != *config; diff --git a/src/image/SkSurface_Gpu.cpp b/src/image/SkSurface_Gpu.cpp index 8f7958444d..2e55ffd336 100644 --- a/src/image/SkSurface_Gpu.cpp +++ b/src/image/SkSurface_Gpu.cpp @@ -269,6 +269,7 @@ bool SkSurface_Gpu::onDraw(const SkDeferredDisplayList* ddl) { bool SkSurface_Gpu::Valid(const SkImageInfo& info) { switch (info.colorType()) { case kRGBA_F16_SkColorType: + case kRGBA_F32_SkColorType: case kRGBA_8888_SkColorType: case kBGRA_8888_SkColorType: return true; @@ -283,6 +284,7 @@ bool SkSurface_Gpu::Valid(const GrCaps* caps, GrPixelConfig config, SkColorSpace case kSBGRA_8888_GrPixelConfig: return caps->srgbSupport(); case kRGBA_half_GrPixelConfig: + case kRGBA_float_GrPixelConfig: case kRGBA_8888_GrPixelConfig: case kBGRA_8888_GrPixelConfig: return true; diff --git a/src/image/SkSurface_Raster.cpp b/src/image/SkSurface_Raster.cpp index 73ff4bab22..4076dff3a0 100644 --- a/src/image/SkSurface_Raster.cpp +++ b/src/image/SkSurface_Raster.cpp @@ -62,6 +62,7 @@ bool SkSurfaceValidateRasterInfo(const SkImageInfo& info, size_t rowBytes) { case kBGRA_8888_SkColorType: break; case kRGBA_F16_SkColorType: + case kRGBA_F32_SkColorType: break; default: return false; diff --git a/src/images/SkImageEncoderFns.h b/src/images/SkImageEncoderFns.h index d8d1c64bb8..6bf0081b26 100644 --- a/src/images/SkImageEncoderFns.h +++ b/src/images/SkImageEncoderFns.h @@ -410,6 +410,39 @@ static inline void transform_scanline_F16_to_premul_8888(char* SK_RESTRICT dst, p.run(0,0, width,1); } +/** + * Transform from kRGBA_F32 to 8-bytes-per-pixel RGBA. + */ +static inline void transform_scanline_F32(char* SK_RESTRICT dst, const char* SK_RESTRICT src, + int width, int, const SkPMColor*) { + SkJumper_MemoryCtx src_ctx = { (void*)src, 0 }, + dst_ctx = { (void*)dst, 0 }; + SkRasterPipeline_<256> p; + p.append(SkRasterPipeline::load_f32, &src_ctx); + p.append(SkRasterPipeline::clamp_0); // F32 values may be out of [0,1] range, so clamp. + p.append(SkRasterPipeline::clamp_1); + p.append(SkRasterPipeline::to_srgb); + p.append(SkRasterPipeline::store_u16_be, &dst_ctx); + p.run(0,0, width,1); +} + +/** + * Transform from kPremul, kRGBA_F32 to 8-bytes-per-pixel RGBA. + */ +static inline void transform_scanline_F32_premul(char* SK_RESTRICT dst, const char* SK_RESTRICT src, + int width, int, const SkPMColor*) { + SkJumper_MemoryCtx src_ctx = { (void*)src, 0 }, + dst_ctx = { (void*)dst, 0 }; + SkRasterPipeline_<256> p; + p.append(SkRasterPipeline::load_f32, &src_ctx); + p.append(SkRasterPipeline::unpremul); + p.append(SkRasterPipeline::clamp_0); // F32 values may be out of [0,1] range, so clamp. + p.append(SkRasterPipeline::clamp_1); + p.append(SkRasterPipeline::to_srgb); + p.append(SkRasterPipeline::store_u16_be, &dst_ctx); + p.run(0,0, width,1); +} + static inline sk_sp<SkData> icc_from_color_space(const SkImageInfo& info) { SkColorSpace* cs = info.colorSpace(); if (!cs) { @@ -417,7 +450,8 @@ static inline sk_sp<SkData> icc_from_color_space(const SkImageInfo& info) { } sk_sp<SkColorSpace> owned; - if (kRGBA_F16_SkColorType == info.colorType()) { + if (kRGBA_F16_SkColorType == info.colorType() || + kRGBA_F32_SkColorType == info.colorType()) { owned = cs->makeSRGBGamma(); cs = owned.get(); } diff --git a/src/images/SkPngEncoder.cpp b/src/images/SkPngEncoder.cpp index fffda73fd0..7520b9044d 100644 --- a/src/images/SkPngEncoder.cpp +++ b/src/images/SkPngEncoder.cpp @@ -106,6 +106,7 @@ bool SkPngEncoderMgr::setHeader(const SkImageInfo& srcInfo, const SkPngEncoder:: int bitDepth = 8; switch (srcInfo.colorType()) { case kRGBA_F16_SkColorType: + case kRGBA_F32_SkColorType: SkASSERT(srcInfo.colorSpace()); sigBit.red = 16; sigBit.green = 16; @@ -288,6 +289,17 @@ static transform_scanline_proc choose_proc(const SkImageInfo& info, SkASSERT(false); return nullptr; } + case kRGBA_F32_SkColorType: + switch (info.alphaType()) { + case kOpaque_SkAlphaType: + case kUnpremul_SkAlphaType: + return transform_scanline_F32; + case kPremul_SkAlphaType: + return transform_scanline_F32_premul; + default: + SkASSERT(false); + return nullptr; + } case kRGBA_1010102_SkColorType: switch (info.alphaType()) { case kOpaque_SkAlphaType: diff --git a/src/opts/SkRasterPipeline_opts.h b/src/opts/SkRasterPipeline_opts.h index fac5d1b93b..2431ad78f9 100644 --- a/src/opts/SkRasterPipeline_opts.h +++ b/src/opts/SkRasterPipeline_opts.h @@ -1712,15 +1712,23 @@ STAGE(store_u16_be, const SkJumper_MemoryCtx* ctx) { } STAGE(load_f32, const SkJumper_MemoryCtx* ctx) { - auto ptr = ptr_at_xy<const float>(ctx, 4*dx,dy); + auto ptr = ptr_at_xy<const float>(ctx, 4*dx,4*dy); load4(ptr,tail, &r,&g,&b,&a); } STAGE(load_f32_dst, const SkJumper_MemoryCtx* ctx) { - auto ptr = ptr_at_xy<const float>(ctx, 4*dx,dy); + auto ptr = ptr_at_xy<const float>(ctx, 4*dx,4*dy); load4(ptr,tail, &dr,&dg,&db,&da); } +STAGE(gather_f32, const SkJumper_GatherCtx* ctx) { + const float* ptr; + U32 ix = ix_and_ptr(&ptr, ctx, r,g); + r = gather(ptr, 4*ix + 0); + g = gather(ptr, 4*ix + 1); + b = gather(ptr, 4*ix + 2); + a = gather(ptr, 4*ix + 3); +} STAGE(store_f32, const SkJumper_MemoryCtx* ctx) { - auto ptr = ptr_at_xy<float>(ctx, 4*dx,dy); + auto ptr = ptr_at_xy<float>(ctx, 4*dx,4*dy); store4(ptr,tail, r,g,b,a); } diff --git a/src/shaders/SkImageShader.cpp b/src/shaders/SkImageShader.cpp index 97bd6cb04e..aa5ecba1ac 100644 --- a/src/shaders/SkImageShader.cpp +++ b/src/shaders/SkImageShader.cpp @@ -369,6 +369,7 @@ bool SkImageShader::onAppendStages(const StageRec& rec) const { case kRGBA_8888_SkColorType: p->append(SkRasterPipeline::gather_8888, ctx); break; case kRGBA_1010102_SkColorType: p->append(SkRasterPipeline::gather_1010102, ctx); break; case kRGBA_F16_SkColorType: p->append(SkRasterPipeline::gather_f16, ctx); break; + case kRGBA_F32_SkColorType: p->append(SkRasterPipeline::gather_f32, ctx); break; case kRGB_888x_SkColorType: p->append(SkRasterPipeline::gather_8888, ctx); p->append(SkRasterPipeline::force_opaque ); break; |