Index: src/effects/SkMagnifierImageFilter.cpp |
diff --git a/src/effects/SkMagnifierImageFilter.cpp b/src/effects/SkMagnifierImageFilter.cpp |
index d0d62c03f13d7c4130fa8c5e0b31ec6603d201cb..8b16516f5a1ffa0f11730d06d274d76b084e2a49 100644 |
--- a/src/effects/SkMagnifierImageFilter.cpp |
+++ b/src/effects/SkMagnifierImageFilter.cpp |
@@ -26,17 +26,17 @@ public: |
static GrEffectRef* Create(GrTexture* texture, |
float xOffset, |
float yOffset, |
- float xZoom, |
- float yZoom, |
- float xInset, |
- float yInset) { |
+ float xInvZoom, |
+ float yInvZoom, |
+ float xInvInset, |
+ float yInvInset) { |
AutoEffectUnref effect(SkNEW_ARGS(GrMagnifierEffect, (texture, |
xOffset, |
yOffset, |
- xZoom, |
- yZoom, |
- xInset, |
- yInset))); |
+ xInvZoom, |
+ yInvZoom, |
+ xInvInset, |
+ yInvInset))); |
return CreateEffectRef(effect); |
} |
@@ -49,10 +49,10 @@ public: |
float x_offset() const { return fXOffset; } |
float y_offset() const { return fYOffset; } |
- float x_zoom() const { return fXZoom; } |
- float y_zoom() const { return fYZoom; } |
- float x_inset() const { return fXInset; } |
- float y_inset() const { return fYInset; } |
+ float x_inv_zoom() const { return fXInvZoom; } |
+ float y_inv_zoom() const { return fYInvZoom; } |
+ float x_inv_inset() const { return fXInvInset; } |
+ float y_inv_inset() const { return fYInvInset; } |
typedef GrGLMagnifierEffect GLEffect; |
@@ -60,17 +60,17 @@ private: |
GrMagnifierEffect(GrTexture* texture, |
float xOffset, |
float yOffset, |
- float xZoom, |
- float yZoom, |
- float xInset, |
- float yInset) |
+ float xInvZoom, |
+ float yInvZoom, |
+ float xInvInset, |
+ float yInvInset) |
: GrSingleTextureEffect(texture, MakeDivByTextureWHMatrix(texture)) |
, fXOffset(xOffset) |
, fYOffset(yOffset) |
- , fXZoom(xZoom) |
- , fYZoom(yZoom) |
- , fXInset(xInset) |
- , fYInset(yInset) {} |
+ , fXInvZoom(xInvZoom) |
+ , fYInvZoom(yInvZoom) |
+ , fXInvInset(xInvInset) |
+ , fYInvInset(yInvInset) {} |
virtual bool onIsEqual(const GrEffect&) const SK_OVERRIDE; |
@@ -78,10 +78,10 @@ private: |
float fXOffset; |
float fYOffset; |
- float fXZoom; |
- float fYZoom; |
- float fXInset; |
- float fYInset; |
+ float fXInvZoom; |
+ float fYInvZoom; |
+ float fXInvInset; |
+ float fYInvInset; |
typedef GrSingleTextureEffect INHERITED; |
}; |
@@ -105,8 +105,8 @@ public: |
private: |
UniformHandle fOffsetVar; |
- UniformHandle fZoomVar; |
- UniformHandle fInsetVar; |
+ UniformHandle fInvZoomVar; |
+ UniformHandle fInvInsetVar; |
typedef GrGLEffect INHERITED; |
}; |
@@ -126,25 +126,25 @@ void GrGLMagnifierEffect::emitCode(GrGLShaderBuilder* builder, |
fOffsetVar = builder->addUniform( |
GrGLShaderBuilder::kFragment_Visibility | |
GrGLShaderBuilder::kVertex_Visibility, |
- kVec2f_GrSLType, "uOffset"); |
- fZoomVar = builder->addUniform( |
+ kVec2f_GrSLType, "Offset"); |
+ fInvZoomVar = builder->addUniform( |
GrGLShaderBuilder::kFragment_Visibility | |
GrGLShaderBuilder::kVertex_Visibility, |
- kVec2f_GrSLType, "uZoom"); |
- fInsetVar = builder->addUniform( |
+ kVec2f_GrSLType, "InvZoom"); |
+ fInvInsetVar = builder->addUniform( |
GrGLShaderBuilder::kFragment_Visibility | |
GrGLShaderBuilder::kVertex_Visibility, |
- kVec2f_GrSLType, "uInset"); |
+ kVec2f_GrSLType, "InvInset"); |
builder->fsCodeAppendf("\t\tvec2 coord = %s;\n", coords2D.c_str()); |
- builder->fsCodeAppendf("\t\tvec2 zoom_coord = %s + %s / %s;\n", |
+ builder->fsCodeAppendf("\t\tvec2 zoom_coord = %s + %s * %s;\n", |
builder->getUniformCStr(fOffsetVar), |
coords2D.c_str(), |
- builder->getUniformCStr(fZoomVar)); |
+ builder->getUniformCStr(fInvZoomVar)); |
builder->fsCodeAppend("\t\tvec2 delta = min(coord, vec2(1.0, 1.0) - coord);\n"); |
- builder->fsCodeAppendf("\t\tdelta = delta / %s;\n", builder->getUniformCStr(fInsetVar)); |
+ builder->fsCodeAppendf("\t\tdelta = delta * %s;\n", builder->getUniformCStr(fInvInsetVar)); |
builder->fsCodeAppend("\t\tfloat weight = 0.0;\n"); |
builder->fsCodeAppend("\t\tif (delta.s < 2.0 && delta.t < 2.0) {\n"); |
@@ -154,7 +154,7 @@ void GrGLMagnifierEffect::emitCode(GrGLShaderBuilder* builder, |
builder->fsCodeAppend("\t\t\tweight = min(dist * dist, 1.0);\n"); |
builder->fsCodeAppend("\t\t} else {\n"); |
builder->fsCodeAppend("\t\t\tvec2 delta_squared = delta * delta;\n"); |
- builder->fsCodeAppend("\t\t\tweight = min(min(delta_squared.s, delta_squared.y), 1.0);\n"); |
+ builder->fsCodeAppend("\t\t\tweight = min(min(delta_squared.x, delta_squared.y), 1.0);\n"); |
builder->fsCodeAppend("\t\t}\n"); |
builder->fsCodeAppend("\t\tvec2 mix_coord = mix(coord, zoom_coord, weight);\n"); |
@@ -172,8 +172,8 @@ void GrGLMagnifierEffect::setData(const GrGLUniformManager& uman, |
const GrDrawEffect& drawEffect) { |
const GrMagnifierEffect& zoom = drawEffect.castEffect<GrMagnifierEffect>(); |
uman.set2f(fOffsetVar, zoom.x_offset(), zoom.y_offset()); |
- uman.set2f(fZoomVar, zoom.x_zoom(), zoom.y_zoom()); |
- uman.set2f(fInsetVar, zoom.x_inset(), zoom.y_inset()); |
+ uman.set2f(fInvZoomVar, zoom.x_inv_zoom(), zoom.y_inv_zoom()); |
+ uman.set2f(fInvInsetVar, zoom.x_inv_inset(), zoom.y_inv_inset()); |
} |
///////////////////////////////////////////////////////////////////// |
@@ -217,10 +217,10 @@ bool GrMagnifierEffect::onIsEqual(const GrEffect& sBase) const { |
return (this->texture(0) == s.texture(0) && |
this->fXOffset == s.fXOffset && |
this->fYOffset == s.fYOffset && |
- this->fXZoom == s.fXZoom && |
- this->fYZoom == s.fYZoom && |
- this->fXInset == s.fXInset && |
- this->fYInset == s.fYInset); |
+ this->fXInvZoom == s.fXInvZoom && |
+ this->fYInvZoom == s.fYInvZoom && |
+ this->fXInvInset == s.fXInvInset && |
+ this->fYInvInset == s.fYInvInset); |
} |
void GrMagnifierEffect::getConstantColorComponents(GrColor* color, uint32_t* validFlags) const { |
@@ -249,13 +249,16 @@ SkMagnifierImageFilter::SkMagnifierImageFilter(SkRect srcRect, SkScalar inset) |
#if SK_SUPPORT_GPU |
bool SkMagnifierImageFilter::asNewEffect(GrEffectRef** effect, GrTexture* texture, const SkMatrix&, const SkIRect&) const { |
if (effect) { |
+ SkScalar yOffset = (texture->origin() == kTopLeft_GrSurfaceOrigin) ? fSrcRect.y() : |
+ (texture->height() - (fSrcRect.y() + fSrcRect.height())); |
+ SkScalar invInset = fInset > 0 ? SkScalarInvert(fInset) : SK_Scalar1; |
*effect = GrMagnifierEffect::Create(texture, |
fSrcRect.x() / texture->width(), |
- fSrcRect.y() / texture->height(), |
- texture->width() / fSrcRect.width(), |
- texture->height() / fSrcRect.height(), |
- fInset / texture->width(), |
- fInset / texture->height()); |
+ yOffset / texture->height(), |
+ fSrcRect.width() / texture->width(), |
+ fSrcRect.height() / texture->height(), |
+ texture->width() * invInset, |
+ texture->height() * invInset); |
} |
return true; |
} |