aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkLinearBitmapPipeline.cpp
diff options
context:
space:
mode:
authorGravatar herb <herb@google.com>2016-03-31 08:48:21 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-03-31 08:48:21 -0700
commit865a289bfec169cb19970c734e9aa855c267f060 (patch)
treedac557a31191181f8b0447317d9203bda9de1927 /src/core/SkLinearBitmapPipeline.cpp
parent5a59a422970eb63dd5af6baa797b25fba9dec5bb (diff)
Add unit repeat tiler.
Diffstat (limited to 'src/core/SkLinearBitmapPipeline.cpp')
-rw-r--r--src/core/SkLinearBitmapPipeline.cpp22
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);
}