Makes sub-pixel antialiased distance-field text looks slightly sharper.
authorYoann Lopes <yoann.lopes@nokia.com>
Thu, 5 May 2011 10:02:20 +0000 (12:02 +0200)
committerYoann Lopes <yoann.lopes@nokia.com>
Thu, 5 May 2011 10:03:20 +0000 (12:03 +0200)
src/declarative/scenegraph/qsgdistancefieldglyphnode_p.cpp

index e332434..c822810 100644 (file)
@@ -60,7 +60,7 @@ protected:
     virtual const char *vertexShader() const;
     virtual const char *fragmentShader() const;
 
-    void updateAlphaRange();
+    virtual void updateAlphaRange();
 
     qreal m_fontScale;
     qreal m_matrixScale;
@@ -506,6 +506,8 @@ protected:
     virtual const char *vertexShader() const;
     virtual const char *fragmentShader() const;
 
+    void updateAlphaRange();
+
 private:
     int m_fontScale_id;
     int m_vecDelta_id;
@@ -618,6 +620,15 @@ void QSGSubPixelDistanceFieldTextMaterialShader::deactivate()
     glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
 }
 
+void QSGSubPixelDistanceFieldTextMaterialShader::updateAlphaRange()
+{
+    qreal combinedScale = m_fontScale * m_matrixScale;
+    qreal alphaMin = qMax(0.0, 0.5 - 0.05 / combinedScale);
+    qreal alphaMax = qMin(0.5 + 0.05 / combinedScale, 1.0);
+    m_program.setUniformValue(m_alphaMin_id, GLfloat(alphaMin));
+    m_program.setUniformValue(m_alphaMax_id, GLfloat(alphaMax));
+}
+
 void QSGSubPixelDistanceFieldTextMaterialShader::updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect)
 {
     Q_ASSERT(oldEffect == 0 || newEffect->type() == oldEffect->type());