| Index: src/core/SkLinearBitmapPipeline.cpp
|
| diff --git a/src/core/SkLinearBitmapPipeline.cpp b/src/core/SkLinearBitmapPipeline.cpp
|
| index d77f28bb5b97d220cf8fe558bcfc53fd94498e2a..32c4d1b071620bd93e882aef8f304dad678bf3fb 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;
|
| }
|
|
|
| @@ -721,8 +688,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;
|
| }
|
|
|
| @@ -741,3 +707,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;
|
| + }
|
| +}
|
|
|