diff options
author | herb <herb@google.com> | 2016-03-31 08:48:21 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-03-31 08:48:21 -0700 |
commit | 865a289bfec169cb19970c734e9aa855c267f060 (patch) | |
tree | dac557a31191181f8b0447317d9203bda9de1927 /src/core/SkLinearBitmapPipeline.cpp | |
parent | 5a59a422970eb63dd5af6baa797b25fba9dec5bb (diff) |
Add unit repeat tiler.
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1837893004
Review URL: https://codereview.chromium.org/1837893004
Diffstat (limited to 'src/core/SkLinearBitmapPipeline.cpp')
-rw-r--r-- | src/core/SkLinearBitmapPipeline.cpp | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/src/core/SkLinearBitmapPipeline.cpp b/src/core/SkLinearBitmapPipeline.cpp index 4e4226a320..59960ebcb7 100644 --- a/src/core/SkLinearBitmapPipeline.cpp +++ b/src/core/SkLinearBitmapPipeline.cpp @@ -238,6 +238,12 @@ public: processor->breakIntoEdges(span); } + void repeatSpan(Span span, int32_t repeatCount) { + while (repeatCount --> 0) { + processor->pointSpan(span); + } + } + BilerpTileStage* processor; }; @@ -364,13 +370,21 @@ static SkLinearBitmapPipeline::PointProcessorInterface* choose_tiler( SkShader::TileMode xMode, SkShader::TileMode yMode, SkFilterQuality filterQuality, - SkLinearBitmapPipeline::TileStage* tileStage) { + SkScalar dx, + SkLinearBitmapPipeline::TileStage* tileStage) +{ switch (xMode) { case SkShader::kClamp_TileMode: choose_tiler_ymode<XClampStrategy>(yMode, filterQuality, dimensions, next, tileStage); break; case SkShader::kRepeat_TileMode: - choose_tiler_ymode<XRepeatStrategy>(yMode, filterQuality, dimensions, next, tileStage); + if (dx == 1.0f && filterQuality == kNone_SkFilterQuality) { + choose_tiler_ymode<XRepeatUnitScaleStrategy>( + yMode, kNone_SkFilterQuality, dimensions, next, tileStage); + } else { + choose_tiler_ymode<XRepeatStrategy>( + yMode, filterQuality, dimensions, next, tileStage); + } break; case SkShader::kMirror_TileMode: choose_tiler_ymode<XMirrorStrategy>(yMode, filterQuality, dimensions, next, tileStage); @@ -588,6 +602,8 @@ SkLinearBitmapPipeline::SkLinearBitmapPipeline( } } + SkScalar dx = adjustedInverse.getScaleX(); + // If it is an index 8 color type, the sampler converts to unpremul for better fidelity. SkAlphaType alphaType = srcImageInfo.alphaType(); if (srcPixmap.colorType() == kIndex_8_SkColorType) { @@ -600,7 +616,7 @@ SkLinearBitmapPipeline::SkLinearBitmapPipeline( auto samplerStage = choose_pixel_sampler(placementStage, filterQuality, srcPixmap, &fSampleStage); auto tilerStage = choose_tiler(samplerStage, - dimensions, xTile, yTile, filterQuality, &fTiler); + dimensions, xTile, yTile, filterQuality, dx, &fTiler); fFirstStage = choose_matrix(tilerStage, adjustedInverse, &fMatrixStage); } |