Fix npot bitmap tiling
Review URL: http://codereview.appspot.com/6419073/
git-svn-id: http://skia.googlecode.com/svn/trunk@4736 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp
index 1da5a0a..c92af64 100644
--- a/src/gpu/SkGpuDevice.cpp
+++ b/src/gpu/SkGpuDevice.cpp
@@ -621,8 +621,19 @@
return false;
}
+ // Must set wrap and filter on the sampler before requesting a texture.
GrSamplerState* sampler = grPaint->textureSampler(kShaderTextureIdx);
+ sampler->setWrapX(sk_tile_mode_to_grwrap(tileModes[0]));
+ sampler->setWrapY(sk_tile_mode_to_grwrap(tileModes[1]));
+ GrSamplerState::Filter filter;
+ if (SkShader::kDefault_BitmapType == bmptype && !skPaint.isFilterBitmap()) {
+ filter = GrSamplerState::kNearest_Filter;
+ } else {
+ filter = GrSamplerState::kBilinear_Filter;
+ }
+ sampler->setFilter(filter);
GrTexture* texture = textures[kShaderTextureIdx].set(dev, bitmap, sampler);
+
if (NULL == texture) {
SkDebugf("Couldn't convert bitmap to texture.\n");
return false;
@@ -631,11 +642,9 @@
switch (bmptype) {
case SkShader::kRadial_BitmapType:
sampler->setCustomStage(SkNEW_ARGS(GrRadialGradient, (texture)))->unref();
- sampler->setFilter(GrSamplerState::kBilinear_Filter);
break;
case SkShader::kSweep_BitmapType:
sampler->setCustomStage(SkNEW_ARGS(GrSweepGradient, (texture)))->unref();
- sampler->setFilter(GrSamplerState::kBilinear_Filter);
break;
case SkShader::kTwoPointRadial_BitmapType:
sampler->setCustomStage(SkNEW_ARGS(GrRadial2Gradient,
@@ -643,7 +652,6 @@
twoPointParams[0],
twoPointParams[1],
twoPointParams[2] < 0)))->unref();
- sampler->setFilter(GrSamplerState::kBilinear_Filter);
break;
case SkShader::kTwoPointConical_BitmapType:
sampler->setCustomStage(SkNEW_ARGS(GrConical2Gradient,
@@ -651,23 +659,14 @@
twoPointParams[0],
twoPointParams[1],
twoPointParams[2])))->unref();
- sampler->setFilter(GrSamplerState::kBilinear_Filter);
break;
case SkShader::kLinear_BitmapType:
sampler->setCustomStage(SkNEW_ARGS(GrLinearGradient, (texture)))->unref();
- sampler->setFilter(GrSamplerState::kBilinear_Filter);
break;
default:
- if (skPaint.isFilterBitmap()) {
- sampler->setFilter(GrSamplerState::kBilinear_Filter);
- } else {
- sampler->setFilter(GrSamplerState::kNearest_Filter);
- }
sampler->setCustomStage(SkNEW_ARGS(GrSingleTextureEffect, (texture)))->unref();
break;
}
- sampler->setWrapX(sk_tile_mode_to_grwrap(tileModes[0]));
- sampler->setWrapY(sk_tile_mode_to_grwrap(tileModes[1]));
// since our texture coords will be in local space, we wack the texture
// matrix to map them back into 0...1 before we load it