зеркало из https://github.com/mozilla/moz-skia.git
Fix for displacement mapping
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:
Родитель
56a2e0de63
Коммит
4ecd42e4bf
|
@ -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,
|
||||
|
|
Загрузка…
Ссылка в новой задаче