aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--gm/displacement.cpp18
-rw-r--r--include/core/SkScalar.h2
-rw-r--r--src/effects/SkDisplacementMapEffect.cpp37
3 files changed, 30 insertions, 27 deletions
diff --git a/gm/displacement.cpp b/gm/displacement.cpp
index 5317a31508..888051dffc 100644
--- a/gm/displacement.cpp
+++ b/gm/displacement.cpp
@@ -86,40 +86,40 @@ protected:
drawClippedBitmap(canvas, 0, 0, paint);
paint.setImageFilter(SkNEW_ARGS(SkDisplacementMapEffect,
(SkDisplacementMapEffect::kB_ChannelSelectorType,
- SkDisplacementMapEffect::kA_ChannelSelectorType, 0.2f, displ)))->unref();
+ SkDisplacementMapEffect::kA_ChannelSelectorType, 16.0f, displ)))->unref();
drawClippedBitmap(canvas, 100, 0, paint);
paint.setImageFilter(SkNEW_ARGS(SkDisplacementMapEffect,
(SkDisplacementMapEffect::kR_ChannelSelectorType,
- SkDisplacementMapEffect::kB_ChannelSelectorType, 0.4f, displ)))->unref();
+ SkDisplacementMapEffect::kB_ChannelSelectorType, 32.0f, displ)))->unref();
drawClippedBitmap(canvas, 200, 0, paint);
paint.setImageFilter(SkNEW_ARGS(SkDisplacementMapEffect,
(SkDisplacementMapEffect::kG_ChannelSelectorType,
- SkDisplacementMapEffect::kA_ChannelSelectorType, 0.6f, displ)))->unref();
+ SkDisplacementMapEffect::kA_ChannelSelectorType, 48.0f, displ)))->unref();
drawClippedBitmap(canvas, 300, 0, paint);
paint.setImageFilter(SkNEW_ARGS(SkDisplacementMapEffect,
(SkDisplacementMapEffect::kR_ChannelSelectorType,
- SkDisplacementMapEffect::kA_ChannelSelectorType, 0.8f, displ)))->unref();
+ SkDisplacementMapEffect::kA_ChannelSelectorType, 64.0f, displ)))->unref();
drawClippedBitmap(canvas, 400, 0, paint);
paint.setImageFilter(SkNEW_ARGS(SkDisplacementMapEffect,
(SkDisplacementMapEffect::kR_ChannelSelectorType,
- SkDisplacementMapEffect::kG_ChannelSelectorType, 0.5f, displ)))->unref();
+ SkDisplacementMapEffect::kG_ChannelSelectorType, 40.0f, displ)))->unref();
drawClippedBitmap(canvas, 0, 100, paint);
paint.setImageFilter(SkNEW_ARGS(SkDisplacementMapEffect,
(SkDisplacementMapEffect::kB_ChannelSelectorType,
- SkDisplacementMapEffect::kA_ChannelSelectorType, 0.5f, displ)))->unref();
+ SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ)))->unref();
drawClippedBitmap(canvas, 100, 100, paint);
paint.setImageFilter(SkNEW_ARGS(SkDisplacementMapEffect,
(SkDisplacementMapEffect::kR_ChannelSelectorType,
- SkDisplacementMapEffect::kB_ChannelSelectorType, 0.5f, displ)))->unref();
+ SkDisplacementMapEffect::kB_ChannelSelectorType, 40.0f, displ)))->unref();
drawClippedBitmap(canvas, 200, 100, paint);
paint.setImageFilter(SkNEW_ARGS(SkDisplacementMapEffect,
(SkDisplacementMapEffect::kG_ChannelSelectorType,
- SkDisplacementMapEffect::kA_ChannelSelectorType, 0.5f, displ)))->unref();
+ SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ)))->unref();
drawClippedBitmap(canvas, 300, 100, paint);
paint.setImageFilter(SkNEW_ARGS(SkDisplacementMapEffect,
(SkDisplacementMapEffect::kR_ChannelSelectorType,
- SkDisplacementMapEffect::kA_ChannelSelectorType, 0.5f, displ)))->unref();
+ SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ)))->unref();
drawClippedBitmap(canvas, 400, 100, paint);
}
diff --git a/include/core/SkScalar.h b/include/core/SkScalar.h
index b775472139..a699fe9a99 100644
--- a/include/core/SkScalar.h
+++ b/include/core/SkScalar.h
@@ -132,6 +132,7 @@
#define SkScalarFloorToInt(x) sk_float_floor2int(x)
#define SkScalarCeilToInt(x) sk_float_ceil2int(x)
#define SkScalarRoundToInt(x) sk_float_round2int(x)
+ #define SkScalarTruncToInt(x) static_cast<int>(x)
/** Returns the absolute value of the specified SkScalar
*/
@@ -248,6 +249,7 @@
#define SkScalarFloorToInt(x) SkFixedFloorToInt(x)
#define SkScalarCeilToInt(x) SkFixedCeilToInt(x)
#define SkScalarRoundToInt(x) SkFixedRoundToInt(x)
+ #define SkScalarTruncToInt(x) (((x) < 0) ? SkScalarCeilToInt(x) : SkScalarFloorToInt(x))
#define SkScalarAbs(x) SkFixedAbs(x)
#define SkScalarCopySign(x, y) SkCopySign32(x, y)
diff --git a/src/effects/SkDisplacementMapEffect.cpp b/src/effects/SkDisplacementMapEffect.cpp
index b270501d4b..9c89a6a9a6 100644
--- a/src/effects/SkDisplacementMapEffect.cpp
+++ b/src/effects/SkDisplacementMapEffect.cpp
@@ -50,26 +50,26 @@ template<SkDisplacementMapEffect::ChannelSelectorType typeX,
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 @@ const GrBackendEffectFactory& GrDisplacementMapEffect::getFactory() const {
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 @@ void GrDisplacementMapEffect::getConstantColorComponents(GrColor* color,
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 @@ GrEffectRef* GrDisplacementMapEffect::TestCreate(SkMWCRandom* random,
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 @@ void GrGLDisplacementMapEffect::setData(const GrGLUniformManager& uman, const Gr
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,