diff options
author | 2016-11-15 14:07:13 -0800 | |
---|---|---|
committer | 2016-11-15 14:07:13 -0800 | |
commit | be42c994b41a6d99b4bbf370aa1634350c773219 (patch) | |
tree | 7d216ac515feaceb83b55e9c3c34ebd1b20d4eca /src/core/SkLinearBitmapPipeline.cpp | |
parent | 3928c6b6165cf2d13d3b5f50762d7f621706a946 (diff) |
Move the matrix stage of SkLinearBitmapPipeline over to using SkSmallAllocator.
The rest of the stages will follow. When all stages are completed,
this should significantly reduce stack use in the typical case.
This a step in removing the baroque stage system and moving towards
a SkRasterPipeline stage system.
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2484273002
Review-Url: https://codereview.chromium.org/2484273002
Diffstat (limited to 'src/core/SkLinearBitmapPipeline.cpp')
-rw-r--r-- | src/core/SkLinearBitmapPipeline.cpp | 95 |
1 files changed, 57 insertions, 38 deletions
diff --git a/src/core/SkLinearBitmapPipeline.cpp b/src/core/SkLinearBitmapPipeline.cpp index d6634bc711..ca42e0240d 100644 --- a/src/core/SkLinearBitmapPipeline.cpp +++ b/src/core/SkLinearBitmapPipeline.cpp @@ -88,9 +88,9 @@ public: : fNext{next} , fStrategy{std::forward<Args>(args)...}{ } - MatrixStage(Next* next, const MatrixStage& stage) + MatrixStage(Next* next, MatrixStage* stage) : fNext{next} - , fStrategy{stage.fStrategy} { } + , fStrategy{stage->fStrategy} { } void SK_VECTORCALL pointListFew(int n, Sk4s xs, Sk4s ys) override { fStrategy.processPoints(&xs, &ys); @@ -128,39 +128,6 @@ template <typename Next = SkLinearBitmapPipeline::PointProcessorInterface> using PerspectiveMatrix = MatrixStage<PerspectiveMatrixStrategy, Next>; -static SkLinearBitmapPipeline::PointProcessorInterface* choose_matrix( - SkLinearBitmapPipeline::PointProcessorInterface* next, - const SkMatrix& inverse, - SkLinearBitmapPipeline::MatrixStage* matrixProc) { - if (inverse.hasPerspective()) { - matrixProc->initStage<PerspectiveMatrix<>>( - next, - SkVector{inverse.getTranslateX(), inverse.getTranslateY()}, - SkVector{inverse.getScaleX(), inverse.getScaleY()}, - SkVector{inverse.getSkewX(), inverse.getSkewY()}, - SkVector{inverse.getPerspX(), inverse.getPerspY()}, - inverse.get(SkMatrix::kMPersp2)); - } else if (inverse.getSkewX() != 0.0f || inverse.getSkewY() != 0.0f) { - matrixProc->initStage<AffineMatrix<>>( - next, - SkVector{inverse.getTranslateX(), inverse.getTranslateY()}, - SkVector{inverse.getScaleX(), inverse.getScaleY()}, - SkVector{inverse.getSkewX(), inverse.getSkewY()}); - } else if (inverse.getScaleX() != 1.0f || inverse.getScaleY() != 1.0f) { - matrixProc->initStage<ScaleMatrix<>>( - next, - SkVector{inverse.getTranslateX(), inverse.getTranslateY()}, - SkVector{inverse.getScaleX(), inverse.getScaleY()}); - } else if (inverse.getTranslateX() != 0.0f || inverse.getTranslateY() != 0.0f) { - matrixProc->initStage<TranslateMatrix<>>( - next, - SkVector{inverse.getTranslateX(), inverse.getTranslateY()}); - } else { - return next; - } - return matrixProc->get(); -} - //////////////////////////////////////////////////////////////////////////////////////////////////// // Tile Stage @@ -658,7 +625,7 @@ SkLinearBitmapPipeline::SkLinearBitmapPipeline( srcPixmap, paintColor, &fSampleStage, &fAccessor); auto tilerStage = choose_tiler(samplerStage, dimensions, xTile, yTile, filterQuality, dx, &fTileStage); - fFirstStage = choose_matrix(tilerStage, adjustedInverse, &fMatrixStage); + fFirstStage = ChooseMatrix(tilerStage, adjustedInverse); fLastStage = blenderStage; } @@ -720,8 +687,7 @@ SkLinearBitmapPipeline::SkLinearBitmapPipeline( auto sampleStage = fSampleStage.get(); auto tilerStage = pipeline.fTileStage.cloneStageTo(sampleStage, &fTileStage); tilerStage = (tilerStage != nullptr) ? tilerStage : sampleStage; - auto matrixStage = pipeline.fMatrixStage.cloneStageTo(tilerStage, &fMatrixStage); - matrixStage = (matrixStage != nullptr) ? matrixStage : tilerStage; + auto matrixStage = pipeline.fMatrixStageCloner(tilerStage, &fMemory); fFirstStage = matrixStage; } @@ -740,3 +706,56 @@ void SkLinearBitmapPipeline::blitSpan(int x, int y, void* dst, int count) { // first pixel to the center of the last pixel. This implies that length is count-1. fFirstStage->pointSpan(Span{{x + 0.5f, y + 0.5f}, count - 1.0f, count}); } + +SkLinearBitmapPipeline::PointProcessorInterface* +SkLinearBitmapPipeline::ChooseMatrix(PointProcessorInterface* next, const SkMatrix& inverse) { + if (inverse.hasPerspective()) { + auto matrixStage = fMemory.createT<PerspectiveMatrix<>>( + next, + SkVector{inverse.getTranslateX(), inverse.getTranslateY()}, + SkVector{inverse.getScaleX(), inverse.getScaleY()}, + SkVector{inverse.getSkewX(), inverse.getSkewY()}, + SkVector{inverse.getPerspX(), inverse.getPerspY()}, + inverse.get(SkMatrix::kMPersp2)); + fMatrixStageCloner = + [matrixStage](PointProcessorInterface* cloneNext, MemoryAllocator* memory) { + return memory->createT<PerspectiveMatrix<>>(cloneNext, matrixStage); + }; + return matrixStage; + } else if (inverse.getSkewX() != 0.0f || inverse.getSkewY() != 0.0f) { + auto matrixStage = fMemory.createT<AffineMatrix<>>( + next, + SkVector{inverse.getTranslateX(), inverse.getTranslateY()}, + SkVector{inverse.getScaleX(), inverse.getScaleY()}, + SkVector{inverse.getSkewX(), inverse.getSkewY()}); + fMatrixStageCloner = + [matrixStage](PointProcessorInterface* cloneNext, MemoryAllocator* memory) { + return memory->createT<AffineMatrix<>>(cloneNext, matrixStage); + }; + return matrixStage; + } else if (inverse.getScaleX() != 1.0f || inverse.getScaleY() != 1.0f) { + auto matrixStage = fMemory.createT<ScaleMatrix<>>( + next, + SkVector{inverse.getTranslateX(), inverse.getTranslateY()}, + SkVector{inverse.getScaleX(), inverse.getScaleY()}); + fMatrixStageCloner = + [matrixStage](PointProcessorInterface* cloneNext, MemoryAllocator* memory) { + return memory->createT<ScaleMatrix<>>(cloneNext, matrixStage); + }; + return matrixStage; + } else if (inverse.getTranslateX() != 0.0f || inverse.getTranslateY() != 0.0f) { + auto matrixStage = fMemory.createT<TranslateMatrix<>>( + next, + SkVector{inverse.getTranslateX(), inverse.getTranslateY()}); + fMatrixStageCloner = + [matrixStage](PointProcessorInterface* cloneNext, MemoryAllocator* memory) { + return memory->createT<TranslateMatrix<>>(cloneNext, matrixStage); + }; + return matrixStage; + } else { + fMatrixStageCloner = [](PointProcessorInterface* cloneNext, MemoryAllocator* memory) { + return cloneNext; + }; + return next; + } +} |