aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkLinearBitmapPipeline.cpp
diff options
context:
space:
mode:
authorGravatar herb <herb@google.com>2016-11-15 14:07:13 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2016-11-15 14:07:13 -0800
commitbe42c994b41a6d99b4bbf370aa1634350c773219 (patch)
tree7d216ac515feaceb83b55e9c3c34ebd1b20d4eca /src/core/SkLinearBitmapPipeline.cpp
parent3928c6b6165cf2d13d3b5f50762d7f621706a946 (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.cpp95
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;
+ }
+}