| #include "rive/shapes/image.hpp" |
| #include "rive/backboard.hpp" |
| #include "rive/importers/backboard_importer.hpp" |
| #include "rive/assets/file_asset.hpp" |
| #include "rive/assets/image_asset.hpp" |
| |
| using namespace rive; |
| |
| void Image::draw(Renderer* renderer) |
| { |
| if (m_ImageAsset == nullptr || renderOpacity() == 0.0f) |
| { |
| return; |
| } |
| |
| if (!clip(renderer)) |
| { |
| // We didn't clip, so make sure to save as we'll be doing some |
| // transformations. |
| renderer->save(); |
| } |
| |
| auto renderImage = m_ImageAsset->renderImage(); |
| auto width = renderImage->width(); |
| auto height = renderImage->height(); |
| |
| const Mat2D& transform = worldTransform(); |
| renderer->transform(transform); |
| |
| Mat2D originTranslation( |
| 1.0f, 0.0f, 0.0f, 1.0f, -width / 2.0f, -height / 2.0f); |
| renderer->transform(originTranslation); |
| |
| renderer->drawImage(renderImage, blendMode(), renderOpacity()); |
| |
| renderer->restore(); |
| } |
| |
| StatusCode Image::import(ImportStack& importStack) |
| { |
| auto backboardImporter = |
| importStack.latest<BackboardImporter>(Backboard::typeKey); |
| if (backboardImporter == nullptr) |
| { |
| return StatusCode::MissingObject; |
| } |
| backboardImporter->addFileAssetReferencer(this); |
| |
| return Super::import(importStack); |
| } |
| |
| void Image::assets(const std::vector<FileAsset*>& assets) |
| { |
| if (assetId() < 0 || assetId() >= assets.size()) |
| { |
| return; |
| } |
| auto asset = assets[assetId()]; |
| if (asset->is<ImageAsset>()) |
| { |
| m_ImageAsset = asset->as<ImageAsset>(); |
| } |
| } |
| |
| Core* Image::clone() const |
| { |
| Image* twin = ImageBase::clone()->as<Image>(); |
| twin->m_ImageAsset = m_ImageAsset; |
| return twin; |
| } |