Index: src/effects/SkDisplacementMapEffect.cpp |
=================================================================== |
--- src/effects/SkDisplacementMapEffect.cpp (revision 8176) |
+++ src/effects/SkDisplacementMapEffect.cpp (working copy) |
@@ -50,26 +50,26 @@ |
void computeDisplacement(SkScalar scale, SkBitmap* dst, SkBitmap* displ, SkBitmap* src) |
{ |
static const SkScalar Inv8bit = SkScalarDiv(SK_Scalar1, SkFloatToScalar(255.0f)); |
- static const SkScalar Half8bit = SkFloatToScalar(255.0f * 0.5f); |
const int dstW = displ->width(); |
const int dstH = displ->height(); |
const int srcW = src->width(); |
const int srcH = src->height(); |
- const SkScalar scaleX = SkScalarMul(SkScalarMul(scale, SkIntToScalar(dstW)), Inv8bit); |
- const SkScalar scaleY = SkScalarMul(SkScalarMul(scale, SkIntToScalar(dstH)), Inv8bit); |
+ const SkScalar scaleForColor = SkScalarMul(scale, Inv8bit); |
+ const SkScalar scaleAdj = SK_ScalarHalf - SkScalarMul(scale, SK_ScalarHalf); |
const SkUnPreMultiply::Scale* table = SkUnPreMultiply::GetScaleTable(); |
for (int y = 0; y < dstH; ++y) { |
const SkPMColor* displPtr = displ->getAddr32(0, y); |
SkPMColor* dstPtr = dst->getAddr32(0, y); |
for (int x = 0; x < dstW; ++x, ++displPtr, ++dstPtr) { |
- const SkScalar displX = |
- SkScalarMul(scaleX, SkIntToScalar(getValue<typeX>(*displPtr, table))-Half8bit); |
- const SkScalar displY = |
- SkScalarMul(scaleY, SkIntToScalar(getValue<typeY>(*displPtr, table))-Half8bit); |
- const int coordX = x + SkScalarRoundToInt(displX); |
- const int coordY = y + SkScalarRoundToInt(displY); |
- *dstPtr = ((coordX < 0) || (coordX >= srcW) || (coordY < 0) || (coordY >= srcH)) ? |
- 0 : *(src->getAddr32(coordX, coordY)); |
+ const SkScalar displX = SkScalarMul(scaleForColor, |
+ SkIntToScalar(getValue<typeX>(*displPtr, table))) + scaleAdj; |
+ const SkScalar displY = SkScalarMul(scaleForColor, |
+ SkIntToScalar(getValue<typeY>(*displPtr, table))) + scaleAdj; |
+ // Truncate the displacement values |
+ const int srcX = x + SkScalarTruncToInt(displX); |
+ const int srcY = y + SkScalarTruncToInt(displY); |
+ *dstPtr = ((srcX < 0) || (srcX >= srcW) || (srcY < 0) || (srcY >= srcH)) ? |
+ 0 : *(src->getAddr32(srcX, srcY)); |
} |
} |
} |
@@ -345,7 +345,7 @@ |
return GrTBackendEffectFactory<GrDisplacementMapEffect>::getInstance(); |
} |
-void GrDisplacementMapEffect::getConstantColorComponents(GrColor* color, |
+void GrDisplacementMapEffect::getConstantColorComponents(GrColor*, |
uint32_t* validFlags) const { |
// Any displacement offset bringing a pixel out of bounds will output a color of (0,0,0,0), |
// so the only way we'd get a constant alpha is if the input color image has a constant alpha |
@@ -360,7 +360,7 @@ |
GR_DEFINE_EFFECT_TEST(GrDisplacementMapEffect); |
GrEffectRef* GrDisplacementMapEffect::TestCreate(SkMWCRandom* random, |
- GrContext* context, |
+ GrContext*, |
GrTexture* textures[]) { |
int texIdxDispl = random->nextBool() ? GrEffectUnitTest::kSkiaPMTextureIdx : |
GrEffectUnitTest::kAlphaTextureIdx; |
@@ -373,7 +373,7 @@ |
SkDisplacementMapEffect::ChannelSelectorType yChannelSelector = |
static_cast<SkDisplacementMapEffect::ChannelSelectorType>( |
random->nextRangeU(1, kMaxComponent)); |
- SkScalar scale = random->nextUScalar1(); |
+ SkScalar scale = random->nextRangeScalar(0, SkFloatToScalar(100.0f)); |
return GrDisplacementMapEffect::Create(xChannelSelector, yChannelSelector, scale, |
textures[texIdxDispl], textures[texIdxColor]); |
@@ -491,10 +491,11 @@ |
stage.getCoordChangeMatrix(), |
colorTex); |
- uman.set2f(fScaleUni, SkScalarToFloat(displacementMap.scale()), |
- colorTex->origin() == kTopLeft_GrSurfaceOrigin ? |
- SkScalarToFloat(displacementMap.scale()) : |
- SkScalarToFloat(-displacementMap.scale())); |
+ SkScalar scaleX = SkScalarDiv(displacementMap.scale(), SkIntToScalar(colorTex->width())); |
+ SkScalar scaleY = SkScalarDiv(displacementMap.scale(), SkIntToScalar(colorTex->height())); |
+ uman.set2f(fScaleUni, SkScalarToFloat(scaleX), |
+ colorTex->origin() == kTopLeft_GrSurfaceOrigin ? |
+ SkScalarToFloat(scaleY) : SkScalarToFloat(-scaleY)); |
} |
GrGLEffect::EffectKey GrGLDisplacementMapEffect::GenKey(const GrEffectStage& stage, |