| /* | |
| * Copyright 2022 Rive | |
| */ | |
| #include "rive/renderer/rive_render_image.hpp" | |
| #include "rive_render_paint.hpp" | |
| #include "gradient.hpp" | |
| namespace rive | |
| { | |
| RiveRenderPaint::RiveRenderPaint() {} | |
| RiveRenderPaint::~RiveRenderPaint() {} | |
| void RiveRenderPaint::color(ColorInt color) | |
| { | |
| m_paintType = gpu::PaintType::solidColor; | |
| m_simpleValue.color = color; | |
| m_gradient.reset(); | |
| } | |
| void RiveRenderPaint::shader(rcp<RenderShader> shader) | |
| { | |
| m_gradient = static_rcp_cast<gpu::Gradient>(std::move(shader)); | |
| m_paintType = | |
| m_gradient ? m_gradient->paintType() : gpu::PaintType::solidColor; | |
| // m_simpleValue.colorRampLocation is unused at this level. A new location | |
| // for a this gradient's color ramp will decided by the render context every | |
| // frame. | |
| m_simpleValue.color = 0xff000000; | |
| } | |
| rcp<gpu::Gradient> RiveRenderPaint::getGradientWithOpacity(float opacity) const | |
| { | |
| if (m_gradient) | |
| { | |
| return m_gradient->getModulated(opacity); | |
| } | |
| return nullptr; | |
| } | |
| void RiveRenderPaint::modulatedImage(const RenderImage* renderImage, | |
| ImageSampler sampler, | |
| const Mat2D& matrix) | |
| { | |
| if (renderImage == nullptr) | |
| { | |
| m_imageTexture = nullptr; | |
| return; | |
| } | |
| m_imageSampler = sampler; | |
| m_imageTransform = matrix; | |
| LITE_RTTI_CAST_OR_RETURN(riveImage, const RiveRenderImage*, renderImage); | |
| m_imageTexture = riveImage->refTexture(); | |
| } | |
| void RiveRenderPaint::image(rcp<gpu::Texture> imageTexture, float opacity) | |
| { | |
| m_paintType = gpu::PaintType::solidColor; | |
| m_simpleValue.color = colorModulateOpacity(0xFFFFFFFF, opacity); | |
| m_gradient.reset(); | |
| m_imageTexture = std::move(imageTexture); | |
| } | |
| void RiveRenderPaint::clipUpdate(uint32_t outerClipID) | |
| { | |
| m_paintType = gpu::PaintType::clipUpdate; | |
| m_simpleValue.outerClipID = outerClipID; | |
| m_gradient.reset(); | |
| m_imageTexture.reset(); | |
| } | |
| bool RiveRenderPaint::getIsOpaque() const | |
| { | |
| if (m_feather != 0) | |
| { | |
| return false; | |
| } | |
| if (m_blendMode != BlendMode::srcOver) | |
| { | |
| return false; | |
| } | |
| if (m_imageTexture != nullptr) | |
| { | |
| // We can't assume opacity with an image (as it might have non-1.0 | |
| // alpha) | |
| return false; | |
| } | |
| switch (m_paintType) | |
| { | |
| case gpu::PaintType::solidColor: | |
| return colorAlpha(m_simpleValue.color) == 0xff; | |
| case gpu::PaintType::linearGradient: | |
| case gpu::PaintType::radialGradient: | |
| return m_gradient->isOpaque(); | |
| case gpu::PaintType::clipUpdate: | |
| return false; | |
| } | |
| RIVE_UNREACHABLE(); | |
| } | |
| } // namespace rive |