void QSG8BitTextMaskShader::updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect) { QSGTextMaskShader::updateState(state, newEffect, oldEffect); QSGTextMaskMaterial *material = static_cast<QSGTextMaskMaterial *>(newEffect); QSGTextMaskMaterial *oldMaterial = static_cast<QSGTextMaskMaterial *>(oldEffect); if (oldMaterial == 0 || material->color() != oldMaterial->color() || state.isOpacityDirty()) { QVector4D color = qsg_premultiply(material->color(), state.opacity()); program()->setUniformValue(m_color_id, color); } }
void QSG24BitTextMaskShader::updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect) { QSGTextMaskShader::updateState(state, newEffect, oldEffect); QSGTextMaskMaterial *material = static_cast<QSGTextMaskMaterial *>(newEffect); QSGTextMaskMaterial *oldMaterial = static_cast<QSGTextMaskMaterial *>(oldEffect); if (oldMaterial == 0 || material->color() != oldMaterial->color() || state.isOpacityDirty()) { QVector4D color = material->color(); if (m_useSRGB) color = qt_sRGB_to_linear_RGB(color); state.context()->functions()->glBlendColor(color.x(), color.y(), color.z(), color.w()); color = qsg_premultiply(color, state.opacity()); program()->setUniformValue(m_color_id, color.w()); } }
void QSGTextMaskShader::updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect) { QSGTextMaskMaterial *material = static_cast<QSGTextMaskMaterial *>(newEffect); QSGTextMaskMaterial *oldMaterial = static_cast<QSGTextMaskMaterial *>(oldEffect); Q_ASSERT(oldEffect == 0 || newEffect->type() == oldEffect->type()); bool updated = material->ensureUpToDate(); Q_ASSERT(material->texture()); Q_ASSERT(oldMaterial == 0 || oldMaterial->texture()); if (updated || oldMaterial == 0 || oldMaterial->texture()->textureId() != material->texture()->textureId()) { program()->setUniformValue(m_textureScale_id, QVector2D(1.0 / material->cacheTextureWidth(), 1.0 / material->cacheTextureHeight())); glBindTexture(GL_TEXTURE_2D, material->texture()->textureId()); // Set the mag/min filters to be nearest. We only need to do this when the texture // has been recreated. if (updated) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); } } if (state.isMatrixDirty()) { QMatrix4x4 transform = state.modelViewMatrix(); qreal xTranslation = transform(0, 3); qreal yTranslation = transform(1, 3); // Remove translation and check identity to see if matrix is only translating. // If it is, we can round the translation to make sure the text is pixel aligned, // which is the only thing that works with GL_NEAREST filtering. Adding rotations // and scales to native rendered text is not a prioritized use case, since the // default rendering type is designed for that. transform(0, 3) = 0.0; transform(1, 3) = 0.0; if (transform.isIdentity()) { transform(0, 3) = qRound(xTranslation); transform(1, 3) = qRound(yTranslation); transform = state.projectionMatrix() * transform; program()->setUniformValue(m_matrix_id, transform); } else { program()->setUniformValue(m_matrix_id, state.combinedMatrix()); } } }