void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& proc, FPCoordTransformIter&& transformIter) override { const GrDistanceFieldPathGeoProc& dfpgp = proc.cast<GrDistanceFieldPathGeoProc>(); if (dfpgp.matrix().hasPerspective() && !fMatrix.cheapEqualTo(dfpgp.matrix())) { fMatrix = dfpgp.matrix(); float matrix[3 * 3]; GrGLSLGetMatrix<3>(matrix, fMatrix); pdman.setMatrix3f(fMatrixUniform, matrix); } SkASSERT(dfpgp.numTextureSamplers() >= 1); GrTexture* atlas = dfpgp.textureSampler(0).peekTexture(); SkASSERT(atlas && SkIsPow2(atlas->width()) && SkIsPow2(atlas->height())); if (fAtlasSize.fWidth != atlas->width() || fAtlasSize.fHeight != atlas->height()) { fAtlasSize.set(atlas->width(), atlas->height()); pdman.set2f(fAtlasSizeInvUniform, 1.0f / atlas->width(), 1.0f / atlas->height()); } if (dfpgp.matrix().hasPerspective()) { this->setTransformDataHelper(SkMatrix::I(), pdman, &transformIter); } else { this->setTransformDataHelper(dfpgp.matrix(), pdman, &transformIter); } }
void GrGLMorphologyEffect::onSetData(const GrGLSLProgramDataManager& pdman, const GrProcessor& proc) { const GrMorphologyEffect& m = proc.cast<GrMorphologyEffect>(); GrTexture& texture = *m.texture(0); float pixelSize = 0.0f; switch (m.direction()) { case Gr1DKernelEffect::kX_Direction: pixelSize = 1.0f / texture.width(); break; case Gr1DKernelEffect::kY_Direction: pixelSize = 1.0f / texture.height(); break; default: SkFAIL("Unknown filter direction."); } pdman.set1f(fPixelSizeUni, pixelSize); if (m.useRange()) { const float* range = m.range(); if (m.direction() && texture.origin() == kBottomLeft_GrSurfaceOrigin) { pdman.set2f(fRangeUni, 1.0f - range[1], 1.0f - range[0]); } else { pdman.set2f(fRangeUni, range[0], range[1]); } } }
void GrGLConvolutionEffect::onSetData(const GrGLSLProgramDataManager& pdman, const GrProcessor& processor) { const GrConvolutionEffect& conv = processor.cast<GrConvolutionEffect>(); GrTexture& texture = *conv.texture(0); float imageIncrement[2] = { 0 }; float ySign = texture.origin() != kTopLeft_GrSurfaceOrigin ? 1.0f : -1.0f; switch (conv.direction()) { case Gr1DKernelEffect::kX_Direction: imageIncrement[0] = 1.0f / texture.width(); break; case Gr1DKernelEffect::kY_Direction: imageIncrement[1] = ySign / texture.height(); break; default: SkFAIL("Unknown filter direction."); } pdman.set2fv(fImageIncrementUni, 1, imageIncrement); if (conv.useBounds()) { const float* bounds = conv.bounds(); if (Gr1DKernelEffect::kY_Direction == conv.direction() && texture.origin() != kTopLeft_GrSurfaceOrigin) { pdman.set2f(fBoundsUni, 1.0f - bounds[1], 1.0f - bounds[0]); } else { pdman.set2f(fBoundsUni, bounds[0], bounds[1]); } } int width = Gr1DKernelEffect::WidthFromRadius(conv.radius()); int arrayCount = (width + 3) / 4; SkASSERT(4 * arrayCount >= width); pdman.set4fv(fKernelUni, arrayCount, conv.kernel()); }
void GrColorCubeEffect::GLSLProcessor::onSetData(const GrGLSLProgramDataManager& pdman, const GrProcessor& proc) { const GrColorCubeEffect& colorCube = proc.cast<GrColorCubeEffect>(); SkScalar size = SkIntToScalar(colorCube.colorCubeSize()); pdman.set1f(fColorCubeSizeUni, SkScalarToFloat(size)); pdman.set1f(fColorCubeInvSizeUni, SkScalarToFloat(SkScalarInvert(size))); }
void GrGLConvolutionEffect::onSetData(const GrGLSLProgramDataManager& pdman, const GrProcessor& processor) { const GrConvolutionEffect& conv = processor.cast<GrConvolutionEffect>(); GrTexture& texture = *conv.texture(0); // the code we generated was for a specific kernel radius SkASSERT(conv.radius() == fRadius); float imageIncrement[2] = { 0 }; float ySign = texture.origin() != kTopLeft_GrSurfaceOrigin ? 1.0f : -1.0f; switch (conv.direction()) { case Gr1DKernelEffect::kX_Direction: imageIncrement[0] = 1.0f / texture.width(); break; case Gr1DKernelEffect::kY_Direction: imageIncrement[1] = ySign / texture.height(); break; default: SkFAIL("Unknown filter direction."); } pdman.set2fv(fImageIncrementUni, 1, imageIncrement); if (conv.useBounds()) { const float* bounds = conv.bounds(); if (Gr1DKernelEffect::kY_Direction == conv.direction() && texture.origin() != kTopLeft_GrSurfaceOrigin) { pdman.set2f(fBoundsUni, 1.0f - bounds[1], 1.0f - bounds[0]); } else { pdman.set2f(fBoundsUni, bounds[0], bounds[1]); } } pdman.set1fv(fKernelUni, this->width(), conv.kernel()); }
void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& primProc, FPCoordTransformIter&& transformIter) override { const GrCubicEffect& ce = primProc.cast<GrCubicEffect>(); if (!ce.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(ce.viewMatrix())) { fViewMatrix = ce.viewMatrix(); float viewMatrix[3 * 3]; GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix); pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); } if (!fDevKLMMatrix.cheapEqualTo(ce.devKLMMatrix())) { fDevKLMMatrix = ce.devKLMMatrix(); float devKLMMatrix[3 * 3]; GrGLSLGetMatrix<3>(devKLMMatrix, fDevKLMMatrix); pdman.setMatrix3f(fDevKLMUniform, devKLMMatrix); } if (ce.color() != fColor) { float c[4]; GrColorToRGBAFloat(ce.color(), c); pdman.set4fv(fColorUniform, 1, c); fColor = ce.color(); } this->setTransformDataHelper(SkMatrix::I(), pdman, &transformIter); }
void GrGLMorphologyEffect::onSetData(const GrGLSLProgramDataManager& pdman, const GrProcessor& proc) { const GrMorphologyEffect& m = proc.cast<GrMorphologyEffect>(); GrTexture& texture = *m.texture(0); // the code we generated was for a specific kernel radius, direction and bound usage SkASSERT(m.radius() == fRadius); SkASSERT(m.direction() == fDirection); SkASSERT(m.useRange() == fUseRange); float pixelSize = 0.0f; switch (fDirection) { case Gr1DKernelEffect::kX_Direction: pixelSize = 1.0f / texture.width(); break; case Gr1DKernelEffect::kY_Direction: pixelSize = 1.0f / texture.height(); break; default: SkFAIL("Unknown filter direction."); } pdman.set1f(fPixelSizeUni, pixelSize); if (fUseRange) { const float* range = m.range(); if (fDirection && texture.origin() == kBottomLeft_GrSurfaceOrigin) { pdman.set2f(fRangeUni, 1.0f - range[1], 1.0f - range[0]); } else { pdman.set2f(fRangeUni, range[0], range[1]); } } }
void GrGLMorphologyEffect::onSetData(const GrGLSLProgramDataManager& pdman, const GrFragmentProcessor& proc) { const GrMorphologyEffect& m = proc.cast<GrMorphologyEffect>(); GrSurfaceProxy* proxy = m.textureSampler(0).proxy(); GrTexture& texture = *proxy->peekTexture(); float pixelSize = 0.0f; switch (m.direction()) { case GrMorphologyEffect::Direction::kX: pixelSize = 1.0f / texture.width(); break; case GrMorphologyEffect::Direction::kY: pixelSize = 1.0f / texture.height(); break; default: SK_ABORT("Unknown filter direction."); } pdman.set1f(fPixelSizeUni, pixelSize); if (m.useRange()) { const float* range = m.range(); if (GrMorphologyEffect::Direction::kY == m.direction() && proxy->origin() == kBottomLeft_GrSurfaceOrigin) { pdman.set2f(fRangeUni, 1.0f - (range[1]*pixelSize), 1.0f - (range[0]*pixelSize)); } else { pdman.set2f(fRangeUni, range[0] * pixelSize, range[1] * pixelSize); } } }
void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& gp, FPCoordTransformIter&& transformIter) override { const DefaultGeoProc& dgp = gp.cast<DefaultGeoProc>(); if (!dgp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dgp.viewMatrix())) { fViewMatrix = dgp.viewMatrix(); float viewMatrix[3 * 3]; GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix); pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); } if (dgp.color() != fColor && !dgp.hasVertexColor()) { float c[4]; GrColorToRGBAFloat(dgp.color(), c); pdman.set4fv(fColorUniform, 1, c); fColor = dgp.color(); } if (dgp.coverage() != fCoverage && !dgp.hasVertexCoverage()) { pdman.set1f(fCoverageUniform, GrNormalizeByteToFloat(dgp.coverage())); fCoverage = dgp.coverage(); } this->setTransformDataHelper(dgp.fLocalMatrix, pdman, &transformIter); if (dgp.linearizeColor() && dgp.fColorSpaceXform) { fColorSpaceHelper.setData(pdman, dgp.fColorSpaceXform.get()); } }
void GrGLMagnifierEffect::onSetData(const GrGLSLProgramDataManager& pdman, const GrProcessor& effect) { const GrMagnifierEffect& zoom = effect.cast<GrMagnifierEffect>(); pdman.set2f(fOffsetVar, zoom.xOffset(), zoom.yOffset()); pdman.set2f(fInvZoomVar, zoom.xInvZoom(), zoom.yInvZoom()); pdman.set2f(fInvInsetVar, zoom.xInvInset(), zoom.yInvInset()); pdman.set4f(fBoundsVar, zoom.bounds().x(), zoom.bounds().y(), zoom.bounds().width(), zoom.bounds().height()); }
void GrGLBicubicEffect::onSetData(const GrGLSLProgramDataManager& pdman, const GrProcessor& processor) { const GrBicubicEffect& bicubicEffect = processor.cast<GrBicubicEffect>(); const GrTexture& texture = *processor.texture(0); float imageIncrement[2]; imageIncrement[0] = 1.0f / texture.width(); imageIncrement[1] = 1.0f / texture.height(); pdman.set2fv(fImageIncrementUni, 1, imageIncrement); pdman.setMatrix4f(fCoefficientsUni, bicubicEffect.coefficients()); fDomain.setData(pdman, bicubicEffect.domain(), texture.origin()); }
virtual void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& gp) override { const PLSFinishEffect& fe = gp.cast<PLSFinishEffect>(); pdman.set1f(fUseEvenOdd, fe.fUseEvenOdd); if (fe.color() != fColor && !fe.colorIgnored()) { GrGLfloat c[4]; GrColorToRGBAFloat(fe.color(), c); pdman.set4fv(fColorUniform, 1, c); fColor = fe.color(); } }
void onSetData(const GrGLSLProgramDataManager& pdman, const GrFragmentProcessor& _proc) override { const GrMagnifierEffect& _outer = _proc.cast<GrMagnifierEffect>(); { pdman.set1f(fXInvZoomVar, (_outer.xInvZoom())); pdman.set1f(fYInvZoomVar, (_outer.yInvZoom())); pdman.set1f(fXInvInsetVar, (_outer.xInvInset())); pdman.set1f(fYInvInsetVar, (_outer.yInvInset())); } GrSurfaceProxy& srcProxy = *_outer.textureSampler(0).proxy(); GrTexture& src = *srcProxy.peekTexture(); (void)src; auto bounds = _outer.bounds(); (void)bounds; UniformHandle& boundsUniform = fBoundsUniformVar; (void)boundsUniform; auto srcRect = _outer.srcRect(); (void)srcRect; UniformHandle& xInvZoom = fXInvZoomVar; (void)xInvZoom; UniformHandle& yInvZoom = fYInvZoomVar; (void)yInvZoom; UniformHandle& xInvInset = fXInvInsetVar; (void)xInvInset; UniformHandle& yInvInset = fYInvInsetVar; (void)yInvInset; UniformHandle& offset = fOffsetVar; (void)offset; SkScalar invW = 1.0f / src.width(); SkScalar invH = 1.0f / src.height(); { SkScalar y = srcRect.y() * invH; if (srcProxy.origin() != kTopLeft_GrSurfaceOrigin) { y = 1.0f - (srcRect.height() / bounds.height()) - y; } pdman.set2f(offset, srcRect.x() * invW, y); } { SkScalar y = bounds.y() * invH; if (srcProxy.origin() != kTopLeft_GrSurfaceOrigin) { y = 1.0f - bounds.height() * invH; } pdman.set4f(boundsUniform, bounds.x() * invW, y, SkIntToScalar(src.width()) / bounds.width(), SkIntToScalar(src.height()) / bounds.height()); } }
void GLEllipticalRRectEffect::onSetData(const GrGLSLProgramDataManager& pdman, const GrFragmentProcessor& effect) { const EllipticalRRectEffect& erre = effect.cast<EllipticalRRectEffect>(); const SkRRect& rrect = erre.getRRect(); // If we're using a scale factor to work around precision issues, choose the largest radius // as the scale factor. The inv radii need to be pre-adjusted by the scale factor. if (rrect != fPrevRRect) { SkRect rect = rrect.getBounds(); const SkVector& r0 = rrect.radii(SkRRect::kUpperLeft_Corner); SkASSERT(r0.fX >= kRadiusMin); SkASSERT(r0.fY >= kRadiusMin); switch (erre.getRRect().getType()) { case SkRRect::kSimple_Type: rect.inset(r0.fX, r0.fY); if (fScaleUniform.isValid()) { if (r0.fX > r0.fY) { pdman.set2f(fInvRadiiSqdUniform, 1.f, (r0.fX * r0.fX) / (r0.fY * r0.fY)); pdman.set2f(fScaleUniform, r0.fX, 1.f / r0.fX); } else { pdman.set2f(fInvRadiiSqdUniform, (r0.fY * r0.fY) / (r0.fX * r0.fX), 1.f); pdman.set2f(fScaleUniform, r0.fY, 1.f / r0.fY); } } else { pdman.set2f(fInvRadiiSqdUniform, 1.f / (r0.fX * r0.fX), 1.f / (r0.fY * r0.fY)); } break; case SkRRect::kNinePatch_Type: { const SkVector& r1 = rrect.radii(SkRRect::kLowerRight_Corner); SkASSERT(r1.fX >= kRadiusMin); SkASSERT(r1.fY >= kRadiusMin); rect.fLeft += r0.fX; rect.fTop += r0.fY; rect.fRight -= r1.fX; rect.fBottom -= r1.fY; if (fScaleUniform.isValid()) { float scale = SkTMax(SkTMax(r0.fX, r0.fY), SkTMax(r1.fX, r1.fY)); float scaleSqd = scale * scale; pdman.set4f(fInvRadiiSqdUniform, scaleSqd / (r0.fX * r0.fX), scaleSqd / (r0.fY * r0.fY), scaleSqd / (r1.fX * r1.fX), scaleSqd / (r1.fY * r1.fY)); pdman.set2f(fScaleUniform, scale, 1.f / scale); } else { pdman.set4f(fInvRadiiSqdUniform, 1.f / (r0.fX * r0.fX), 1.f / (r0.fY * r0.fY), 1.f / (r1.fX * r1.fX), 1.f / (r1.fY * r1.fY)); } break; } default: SK_ABORT("RRect should always be simple or nine-patch."); } pdman.set4f(fInnerRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.fBottom); fPrevRRect = rrect; } }
void GrGLPerlinNoise::onSetData(const GrGLSLProgramDataManager& pdman, const GrProcessor& processor) { INHERITED::onSetData(pdman, processor); const GrPerlinNoiseEffect& turbulence = processor.cast<GrPerlinNoiseEffect>(); const SkVector& baseFrequency = turbulence.baseFrequency(); pdman.set2f(fBaseFrequencyUni, baseFrequency.fX, baseFrequency.fY); if (turbulence.stitchTiles()) { const SkPerlinNoiseShader::StitchData& stitchData = turbulence.stitchData(); pdman.set2f(fStitchDataUni, SkIntToScalar(stitchData.fWidth), SkIntToScalar(stitchData.fHeight)); } }
void GrGLSLXferProcessor::setData(const GrGLSLProgramDataManager& pdm, const GrXferProcessor& xp) { if (xp.getDstTexture()) { if (fDstTopLeftUni.isValid()) { pdm.set2f(fDstTopLeftUni, static_cast<float>(xp.dstTextureOffset().fX), static_cast<float>(xp.dstTextureOffset().fY)); pdm.set2f(fDstScaleUni, 1.f / xp.getDstTexture()->width(), 1.f / xp.getDstTexture()->height()); } else { SkASSERT(!fDstScaleUni.isValid()); } } else { SkASSERT(!fDstTopLeftUni.isValid()); SkASSERT(!fDstScaleUni.isValid()); } this->onSetData(pdm, xp); }
void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& primProc, FPCoordTransformIter&& transformIter) override { const GrCCPRPathProcessor& proc = primProc.cast<GrCCPRPathProcessor>(); pdman.set2f(fAtlasAdjustUniform, 1.0f / proc.atlas()->width(), 1.0f / proc.atlas()->height()); this->setTransformDataHelper(SkMatrix::I(), pdman, &transformIter); }
void onSetData(const GrGLSLProgramDataManager& pdman, const GrFragmentProcessor& _proc) override { const GrCircleEffect& _outer = _proc.cast<GrCircleEffect>(); auto edgeType = _outer.edgeType; (void)edgeType; auto center = _outer.center; (void)center; auto radius = _outer.radius; (void)radius; UniformHandle& circle = circleVar; (void)circle; if (radius != prevRadius || center != prevCenter) { SkScalar effectiveRadius = radius; if (GrProcessorEdgeTypeIsInverseFill((GrClipEdgeType)edgeType)) { effectiveRadius -= 0.5f; // When the radius is 0.5 effectiveRadius is 0 which causes an inf * 0 in the // shader. effectiveRadius = SkTMax(0.001f, effectiveRadius); } else { effectiveRadius += 0.5f; } pdman.set4f(circle, center.fX, center.fY, effectiveRadius, SkScalarInvert(effectiveRadius)); prevCenter = center; prevRadius = radius; } }
void GrGLMatrixConvolutionEffect::onSetData(const GrGLSLProgramDataManager& pdman, const GrProcessor& processor) { const GrMatrixConvolutionEffect& conv = processor.cast<GrMatrixConvolutionEffect>(); GrTexture& texture = *conv.texture(0); // the code we generated was for a specific kernel size SkASSERT(conv.kernelSize() == fKernelSize); float imageIncrement[2]; float ySign = texture.origin() == kTopLeft_GrSurfaceOrigin ? 1.0f : -1.0f; imageIncrement[0] = 1.0f / texture.width(); imageIncrement[1] = ySign / texture.height(); pdman.set2fv(fImageIncrementUni, 1, imageIncrement); pdman.set2fv(fKernelOffsetUni, 1, conv.kernelOffset()); pdman.set1fv(fKernelUni, fKernelSize.width() * fKernelSize.height(), conv.kernel()); pdman.set1f(fGainUni, conv.gain()); pdman.set1f(fBiasUni, conv.bias()); fDomain.setData(pdman, conv.domain(), texture.origin()); }
void onSetData(const GrGLSLProgramDataManager& pdman, const GrFragmentProcessor& fp) override { GrColor4f color = fp.cast<ReplaceInputFragmentProcessor>().fColor; if (!fHaveSetColor || color != fPreviousColor) { pdman.set4fv(fColorUni, 1, color.fRGBA); fPreviousColor = color; fHaveSetColor = true; } }
void onSetData(const GrGLSLProgramDataManager& uniManager, const GrProcessor& proc) override { const ColorMatrixEffect& cme = proc.cast<ColorMatrixEffect>(); const float* m = cme.fMatrix; // The GL matrix is transposed from SkColorMatrix. float mt[] = { m[0], m[5], m[10], m[15], m[1], m[6], m[11], m[16], m[2], m[7], m[12], m[17], m[3], m[8], m[13], m[18], }; static const float kScale = 1.0f / 255.0f; float vec[] = { m[4] * kScale, m[9] * kScale, m[14] * kScale, m[19] * kScale, }; uniManager.setMatrix4fv(fMatrixHandle, 1, mt); uniManager.set4fv(fVectorHandle, 1, vec); }
void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& primProc) override { const GrCubicEffect& ce = primProc.cast<GrCubicEffect>(); if (!ce.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(ce.viewMatrix())) { fViewMatrix = ce.viewMatrix(); float viewMatrix[3 * 3]; GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix); pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); } if (ce.color() != fColor) { float c[4]; GrColorToRGBAFloat(ce.color(), c); pdman.set4fv(fColorUniform, 1, c); fColor = ce.color(); } }
void GrGLConvexPolyEffect::onSetData(const GrGLSLProgramDataManager& pdman, const GrProcessor& effect) { const GrConvexPolyEffect& cpe = effect.cast<GrConvexPolyEffect>(); size_t byteSize = 3 * cpe.getEdgeCount() * sizeof(SkScalar); if (0 != memcmp(fPrevEdges, cpe.getEdges(), byteSize)) { pdman.set3fv(fEdgeUniform, cpe.getEdgeCount(), cpe.getEdges()); memcpy(fPrevEdges, cpe.getEdges(), byteSize); } }
virtual void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& gp) override { const MSAAQuadProcessor& qp = gp.cast<MSAAQuadProcessor>(); if (!qp.viewMatrix().isIdentity()) { float viewMatrix[3 * 3]; GrGLSLGetMatrix<3>(viewMatrix, qp.viewMatrix()); pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); } }
void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& gp) override { const GrBitmapTextGeoProc& btgp = gp.cast<GrBitmapTextGeoProc>(); if (btgp.color() != fColor && !btgp.hasVertexColor()) { float c[4]; GrColorToRGBAFloat(btgp.color(), c); pdman.set4fv(fColorUniform, 1, c); fColor = btgp.color(); } }
void onSetData(const GrGLSLProgramDataManager& pdman, const GrFragmentProcessor& p) override { INHERITED::onSetData(pdman, p); const TwoPointConicalEffect& effect = p.cast<TwoPointConicalEffect>(); // kRadialType should imply |r1 - r0| = 1 (after our transformation) SkASSERT(effect.getType() == Type::kStrip || SkScalarNearlyZero(SkTAbs(effect.diffRadius()) - 1)); pdman.set1f(fParamUni, effect.getType() == Type::kRadial ? effect.r0() : effect.r0() * effect.r0()); }
void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& proc) override { #ifdef SK_GAMMA_APPLY_TO_A8 const GrDistanceFieldA8TextGeoProc& dfTexEffect = proc.cast<GrDistanceFieldA8TextGeoProc>(); float distanceAdjust = dfTexEffect.getDistanceAdjust(); if (distanceAdjust != fDistanceAdjust) { pdman.set1f(fDistanceAdjustUni, distanceAdjust); fDistanceAdjust = distanceAdjust; } #endif const GrDistanceFieldA8TextGeoProc& dfa8gp = proc.cast<GrDistanceFieldA8TextGeoProc>(); if (!dfa8gp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dfa8gp.viewMatrix())) { fViewMatrix = dfa8gp.viewMatrix(); float viewMatrix[3 * 3]; GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix); pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); } }
void GLAARectEffect::onSetData(const GrGLSLProgramDataManager& pdman, const GrProcessor& processor) { const AARectEffect& aare = processor.cast<AARectEffect>(); const SkRect& rect = aare.getRect(); if (rect != fPrevRect) { pdman.set4f(fRectUniform, rect.fLeft + 0.5f, rect.fTop + 0.5f, rect.fRight - 0.5f, rect.fBottom - 0.5f); fPrevRect = rect; } }
void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& gp) override { const QuadEdgeEffect& qe = gp.cast<QuadEdgeEffect>(); if (qe.color() != fColor) { float c[4]; GrColorToRGBAFloat(qe.color(), c); pdman.set4fv(fColorUniform, 1, c); fColor = qe.color(); } }
void setData(const GrGLSLProgramDataManager& pd, const GrPrimitiveProcessor& primProc) override { const GrPathProcessor& pathProc = primProc.cast<GrPathProcessor>(); if (pathProc.overrides().readsColor() && pathProc.color() != fColor) { float c[4]; GrColorToRGBAFloat(pathProc.color(), c); pd.set4fv(fColorUniform, 1, c); fColor = pathProc.color(); } }