aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/effects
diff options
context:
space:
mode:
authorGravatar joshualitt <joshualitt@chromium.org>2015-08-07 09:55:23 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-08-07 09:55:23 -0700
commit922c8b13c512c3287509936795735c1b31bedba9 (patch)
treed1824fc7a51ddbccfb74f26d8c933457f8b0be9c /src/gpu/effects
parent469a3fe6edb3fb29acf6c03de662a6f00f6804b8 (diff)
Break LCD and Bitmap text dependency on hardcoded atlas values
Diffstat (limited to 'src/gpu/effects')
-rw-r--r--src/gpu/effects/GrBitmapTextGeoProc.cpp28
-rwxr-xr-xsrc/gpu/effects/GrDistanceFieldGeoProc.cpp46
2 files changed, 56 insertions, 18 deletions
diff --git a/src/gpu/effects/GrBitmapTextGeoProc.cpp b/src/gpu/effects/GrBitmapTextGeoProc.cpp
index a0350e99f5..9496dbffc3 100644
--- a/src/gpu/effects/GrBitmapTextGeoProc.cpp
+++ b/src/gpu/effects/GrBitmapTextGeoProc.cpp
@@ -28,18 +28,19 @@ public:
// emit attributes
vsBuilder->emitAttributes(cte);
+ // compute numbers to be hardcoded to convert texture coordinates from int to float
+ SkASSERT(cte.numTextures() == 1);
+ GrTexture* atlas = cte.textureAccess(0).getTexture();
+ SkASSERT(atlas);
+ SkScalar recipWidth = 1.0f / atlas->width();
+ SkScalar recipHeight = 1.0f / atlas->height();
+
GrGLVertToFrag v(kVec2f_GrSLType);
pb->addVarying("TextureCoords", &v);
- // this is only used with text, so our texture bounds always match the glyph atlas
- if (cte.maskFormat() == kA8_GrMaskFormat) {
- vsBuilder->codeAppendf("%s = vec2(" GR_FONT_ATLAS_A8_RECIP_WIDTH ", "
- GR_FONT_ATLAS_RECIP_HEIGHT ")*%s;", v.vsOut(),
- cte.inTextureCoords()->fName);
- } else {
- vsBuilder->codeAppendf("%s = vec2(" GR_FONT_ATLAS_RECIP_WIDTH ", "
- GR_FONT_ATLAS_RECIP_HEIGHT ")*%s;", v.vsOut(),
- cte.inTextureCoords()->fName);
- }
+ vsBuilder->codeAppendf("%s = vec2(%.*f, %.*f) * %s;", v.vsOut(),
+ SK_FLT_DECIMAL_DIG, recipWidth,
+ SK_FLT_DECIMAL_DIG, recipHeight,
+ cte.inTextureCoords()->fName);
// Setup pass through color
if (!cte.colorIgnored()) {
@@ -102,6 +103,13 @@ public:
key |= gp.colorIgnored() ? 0x2 : 0x0;
key |= gp.maskFormat() << 3;
b->add32(key);
+
+ // Currently we hardcode numbers to convert atlas coordinates to normalized floating point
+ SkASSERT(gp.numTextures() == 1);
+ GrTexture* atlas = gp.textureAccess(0).getTexture();
+ SkASSERT(atlas);
+ b->add32(atlas->width());
+ b->add32(atlas->height());
}
private:
diff --git a/src/gpu/effects/GrDistanceFieldGeoProc.cpp b/src/gpu/effects/GrDistanceFieldGeoProc.cpp
index 8af5631cc5..0b97bb2b94 100755
--- a/src/gpu/effects/GrDistanceFieldGeoProc.cpp
+++ b/src/gpu/effects/GrDistanceFieldGeoProc.cpp
@@ -77,11 +77,18 @@ public:
args.fPB->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision);
vsBuilder->codeAppendf("%s = %s;", st.vsOut(), dfTexEffect.inTextureCoords()->fName);
+ // compute numbers to be hardcoded to convert texture coordinates from int to float
+ SkASSERT(dfTexEffect.numTextures() == 1);
+ GrTexture* atlas = dfTexEffect.textureAccess(0).getTexture();
+ SkASSERT(atlas);
+ SkScalar recipWidth = 1.0f / atlas->width();
+ SkScalar recipHeight = 1.0f / atlas->height();
+
GrGLVertToFrag uv(kVec2f_GrSLType);
args.fPB->addVarying("TextureCoords", &uv, kHigh_GrSLPrecision);
- // this is only used with text, so our texture bounds always match the glyph atlas
- vsBuilder->codeAppendf("%s = vec2(" GR_FONT_ATLAS_A8_RECIP_WIDTH ", "
- GR_FONT_ATLAS_RECIP_HEIGHT ")*%s;", uv.vsOut(),
+ vsBuilder->codeAppendf("%s = vec2(%.*f, %.*f) * %s;", uv.vsOut(),
+ SK_FLT_DECIMAL_DIG, recipWidth,
+ SK_FLT_DECIMAL_DIG, recipHeight,
dfTexEffect.inTextureCoords()->fName);
// Use highp to work around aliasing issues
@@ -176,6 +183,13 @@ public:
key |= dfTexEffect.colorIgnored() << 17;
key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25;
b->add32(key);
+
+ // Currently we hardcode numbers to convert atlas coordinates to normalized floating point
+ SkASSERT(gp.numTextures() == 1);
+ GrTexture* atlas = gp.textureAccess(0).getTexture();
+ SkASSERT(atlas);
+ b->add32(atlas->width());
+ b->add32(atlas->height());
}
private:
@@ -525,11 +539,18 @@ public:
args.fPB->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision);
vsBuilder->codeAppendf("%s = %s;", st.vsOut(), dfTexEffect.inTextureCoords()->fName);
+ // compute numbers to be hardcoded to convert texture coordinates from int to float
+ SkASSERT(dfTexEffect.numTextures() == 1);
+ GrTexture* atlas = dfTexEffect.textureAccess(0).getTexture();
+ SkASSERT(atlas);
+ SkScalar recipWidth = 1.0f / atlas->width();
+ SkScalar recipHeight = 1.0f / atlas->height();
+
GrGLVertToFrag uv(kVec2f_GrSLType);
args.fPB->addVarying("TextureCoords", &uv, kHigh_GrSLPrecision);
- // this is only used with text, so our texture bounds always match the glyph atlas
- vsBuilder->codeAppendf("%s = vec2(" GR_FONT_ATLAS_A8_RECIP_WIDTH ", "
- GR_FONT_ATLAS_RECIP_HEIGHT ")*%s;", uv.vsOut(),
+ vsBuilder->codeAppendf("%s = vec2(%.*f, %.*f) * %s;", uv.vsOut(),
+ SK_FLT_DECIMAL_DIG, recipWidth,
+ SK_FLT_DECIMAL_DIG, recipHeight,
dfTexEffect.inTextureCoords()->fName);
// add frag shader code
@@ -545,10 +566,12 @@ public:
fsBuilder->codeAppendf("vec2 uv = %s;\n", uv.fsIn());
fsBuilder->codeAppend(GrGLShaderVar::PrecisionString(kHigh_GrSLPrecision,
pb->ctxInfo().standard()));
+
+ SkScalar lcdDelta = 1.0f / (3.0f * atlas->width());
if (dfTexEffect.getFlags() & kBGR_DistanceFieldEffectFlag) {
- fsBuilder->codeAppend("float delta = -" GR_FONT_ATLAS_LCD_DELTA ";\n");
+ fsBuilder->codeAppendf("float delta = -%.*f;\n", SK_FLT_DECIMAL_DIG, lcdDelta);
} else {
- fsBuilder->codeAppend("float delta = " GR_FONT_ATLAS_LCD_DELTA ";\n");
+ fsBuilder->codeAppendf("float delta = %.*f;\n", SK_FLT_DECIMAL_DIG, lcdDelta);
}
if (isUniformScale) {
fsBuilder->codeAppendf("float dy = abs(dFdy(%s.y));", st.fsIn());
@@ -668,6 +691,13 @@ public:
key |= dfTexEffect.colorIgnored() << 16;
key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25;
b->add32(key);
+
+ // Currently we hardcode numbers to convert atlas coordinates to normalized floating point
+ SkASSERT(gp.numTextures() == 1);
+ GrTexture* atlas = gp.textureAccess(0).getTexture();
+ SkASSERT(atlas);
+ b->add32(atlas->width());
+ b->add32(atlas->height());
}
private: