diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/SkRasterPipelineBlitter.cpp | 67 |
1 files changed, 38 insertions, 29 deletions
diff --git a/src/core/SkRasterPipelineBlitter.cpp b/src/core/SkRasterPipelineBlitter.cpp index 8adb328315..d2a0b3d4c1 100644 --- a/src/core/SkRasterPipelineBlitter.cpp +++ b/src/core/SkRasterPipelineBlitter.cpp @@ -15,6 +15,7 @@ #include "SkPM4fPriv.h" #include "SkRasterPipeline.h" #include "SkShader.h" +#include "SkUtils.h" class SkRasterPipelineBlitter : public SkBlitter { @@ -26,7 +27,6 @@ public: : fDst(dst) , fBlend(blend) , fPaintColor(paintColor) - , fShaderIsConstant(true) , fScratchAlloc(fScratch, sizeof(fScratch)) , fScratchFallback(&fScratchAlloc) {} @@ -40,18 +40,15 @@ public: // blits using something like a SkRasterPipeline::runFew() method. private: - void append_load_d (SkRasterPipeline*) const; - void append_blend (SkRasterPipeline*) const; - void maybe_clamp (SkRasterPipeline*) const; - void append_swizzles(SkRasterPipeline*) const; - void append_store (SkRasterPipeline*) const; + void append_load_d(SkRasterPipeline*) const; + void append_blend (SkRasterPipeline*) const; + void maybe_clamp (SkRasterPipeline*) const; + void append_store (SkRasterPipeline*) const; SkPixmap fDst; SkBlendMode fBlend; SkPM4f fPaintColor; SkRasterPipeline fShader; - bool fShaderIsConstant; - SkPM4f fTrivialBlendColor; // These functions are compiled lazily when first used. std::function<void(size_t, size_t, size_t)> fBlitH = nullptr, @@ -106,7 +103,6 @@ SkBlitter* SkRasterPipelineBlitter::Create(const SkPixmap& dst, SkBlendMode* blend = &blitter->fBlend; SkPM4f* paintColor = &blitter->fPaintColor; SkRasterPipeline* pipeline = &blitter->fShader; - bool* is_constant = &blitter->fShaderIsConstant; SkShader* shader = paint.getShader(); SkColorFilter* colorFilter = paint.getColorFilter(); @@ -116,7 +112,8 @@ SkBlitter* SkRasterPipelineBlitter::Create(const SkPixmap& dst, return earlyOut(); } - bool is_opaque = paintColor->a() == 1.0f; + bool is_opaque = paintColor->a() == 1.0f, + is_constant = true; if (shader) { if (!shader->appendStages(pipeline, dst.colorSpace(), &blitter->fScratchFallback, ctm, paint)) { @@ -128,7 +125,7 @@ SkBlitter* SkRasterPipelineBlitter::Create(const SkPixmap& dst, } is_opaque = is_opaque && shader->isOpaque(); - *is_constant = shader->isConstant(); + is_constant = shader->isConstant(); } else { pipeline->append(SkRasterPipeline::constant_color, paintColor); } @@ -141,7 +138,7 @@ SkBlitter* SkRasterPipelineBlitter::Create(const SkPixmap& dst, is_opaque = is_opaque && (colorFilter->getFlags() & SkColorFilter::kAlphaUnchanged_Flag); } - if (*is_constant) { + if (is_constant) { pipeline->append(SkRasterPipeline::store_f32, &paintColor); pipeline->run(0,0, 1); @@ -155,6 +152,34 @@ SkBlitter* SkRasterPipelineBlitter::Create(const SkPixmap& dst, *blend = SkBlendMode::kSrc; } + if (is_constant && *blend == SkBlendMode::kSrc) { + uint64_t color; // Big enough for largest dst format, F16. + SkRasterPipeline p; + p.extend(*pipeline); + blitter->fDstPtr = &color; + blitter->append_store(&p); + p.run(0,0, 1); + + switch (dst.shiftPerPixel()) { + case 1: + blitter->fBlitH = [blitter,color](size_t x, size_t, size_t n) { + sk_memset16((uint16_t*)blitter->fDstPtr + x, color, n); + }; + break; + case 2: + blitter->fBlitH = [blitter,color](size_t x, size_t, size_t n) { + sk_memset32((uint32_t*)blitter->fDstPtr + x, color, n); + }; + break; + case 3: + blitter->fBlitH = [blitter,color](size_t x, size_t, size_t n) { + sk_memset64((uint64_t*)blitter->fDstPtr + x, color, n); + }; + break; + default: break; + } + } + return blitter; } @@ -176,18 +201,15 @@ void SkRasterPipelineBlitter::append_load_d(SkRasterPipeline* p) const { } } -void SkRasterPipelineBlitter::append_swizzles(SkRasterPipeline* p) const { +void SkRasterPipelineBlitter::append_store(SkRasterPipeline* p) const { if (fDst.info().gammaCloseToSRGB()) { p->append(SkRasterPipeline::to_srgb); } if (fDst.info().colorType() == kBGRA_8888_SkColorType) { p->append(SkRasterPipeline::swap_rb); } -} -void SkRasterPipelineBlitter::append_store(SkRasterPipeline* p) const { SkASSERT(supported(fDst.info())); - switch (fDst.info().colorType()) { case kRGB_565_SkColorType: p->append(SkRasterPipeline::store_565, &fDstPtr); break; case kBGRA_8888_SkColorType: @@ -216,19 +238,9 @@ void SkRasterPipelineBlitter::blitH(int x, int y, int w) { this->append_blend(&p); this->maybe_clamp(&p); } - this->append_swizzles(&p); - if (fBlend == SkBlendMode::kSrc && fShaderIsConstant) { - auto trivial = &fTrivialBlendColor; - p.append(SkRasterPipeline::store_f32, &trivial); - p.run(0,0, 1); - - p = SkRasterPipeline(); - p.append(SkRasterPipeline::constant_color, trivial); - } this->append_store(&p); fBlitH = p.compile(); } - fDstPtr = fDst.writable_addr(0,y); fBlitH(x,y, w); } @@ -247,7 +259,6 @@ void SkRasterPipelineBlitter::blitAntiH(int x, int y, const SkAlpha aa[], const p.append(SkRasterPipeline::lerp_1_float, &fCurrentCoverage); } this->maybe_clamp(&p); - this->append_swizzles(&p); this->append_store(&p); fBlitAntiH = p.compile(); } @@ -286,7 +297,6 @@ void SkRasterPipelineBlitter::blitMask(const SkMask& mask, const SkIRect& clip) p.append(SkRasterPipeline::lerp_u8, &fMaskPtr); } this->maybe_clamp(&p); - this->append_swizzles(&p); this->append_store(&p); fBlitMaskA8 = p.compile(); } @@ -298,7 +308,6 @@ void SkRasterPipelineBlitter::blitMask(const SkMask& mask, const SkIRect& clip) this->append_blend(&p); p.append(SkRasterPipeline::lerp_565, &fMaskPtr); this->maybe_clamp(&p); - this->append_swizzles(&p); this->append_store(&p); fBlitMaskLCD16 = p.compile(); } |