Fixed the skia displacement map effect to match the WebKit displacement map fix.
Review URL: https://codereview.chromium.org/12787007

git-svn-id: http://skia.googlecode.com/svn/trunk@8225 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
sugoi@google.com 2013-03-19 15:07:30 +00:00
Родитель 56a2e0de63
Коммит 4ecd42e4bf
3 изменённых файлов: 30 добавлений и 27 удалений

Просмотреть файл

@ -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);
}

Просмотреть файл

@ -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)

Просмотреть файл

@ -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,