From: subhransu mohanty Date: Tue, 15 Jan 2019 07:06:52 +0000 (+0900) Subject: lottie/render: Support rendering lottie image object. X-Git-Tag: submit/tizen/20190116.045417~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=704547bf327d7d1036948314b3f7384c5fa36db2;p=platform%2Fcore%2Fuifw%2Flottie-player.git lottie/render: Support rendering lottie image object. Change-Id: I1b15263cd27248ccef57eff1d771b627cf0f59d8 --- diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index b57833a..aa88896 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -23,6 +23,7 @@ #include "vdasher.h" #include "vpainter.h" #include "vraster.h" +#include "vimageloader.h" /* Lottie Layer Rules * 1. time stretch is pre calculated and applied to all the properties of the @@ -60,6 +61,10 @@ LOTCompItem::createLayerItem(LOTLayerData *layerData) return std::make_unique(layerData); break; } + case LayerType::Image: { + return std::make_unique(layerData); + break; + } default: return nullptr; break; @@ -684,6 +689,66 @@ void LOTSolidLayerItem::renderList(std::vector &list) list.push_back(mRenderNode.get()); } +LOTImageLayerItem::LOTImageLayerItem(LOTLayerData *layerData) + : LOTLayerItem(layerData) +{ +} + +void LOTImageLayerItem::updateContent() +{ + if (!mRenderNode) { + mRenderNode = std::make_unique(); + mRenderNode->mType = VDrawable::Type::Fill; + mRenderNode->mFlag |= VDrawable::DirtyState::All; + // load image + //@TODO find a better way to load + // so that can be shared by multiple layers + if (!mLayerData->mAsset->mImagePath.empty()) { + VBitmap img = VImageLoader::instance().load(mLayerData->mAsset->mImagePath.c_str()); + VBrush brush(img); + mRenderNode->setBrush(brush); + } + } + + if (flag() & DirtyFlagBit::Matrix) { + VPath path; + path.addRect( + VRectF(0, 0, mLayerData->mAsset->mWidth, mLayerData->mAsset->mHeight)); + path.transform(combinedMatrix()); + mRenderNode->mFlag |= VDrawable::DirtyState::Path; + mRenderNode->mPath = path; + mRenderNode->mBrush.setMatrix(combinedMatrix()); + } + + if (flag() & DirtyFlagBit::Alpha) { + //@TODO handle alpha with the image. + } +} + +void LOTImageLayerItem::renderList(std::vector &list) +{ + if (!visible()) return; + + list.push_back(mRenderNode.get()); +} + +void LOTImageLayerItem::buildLayerNode() +{ + LOTLayerItem::buildLayerNode(); + + mDrawableList.clear(); + renderList(mDrawableList); + + mCNodeList.clear(); + for (auto &i : mDrawableList) { + LOTDrawable *lotDrawable = static_cast(i); + lotDrawable->sync(); + mCNodeList.push_back(lotDrawable->mCNode.get()); + } + layerNode()->mNodeList.ptr = mCNodeList.data(); + layerNode()->mNodeList.size = mCNodeList.size(); +} + LOTNullLayerItem::LOTNullLayerItem(LOTLayerData *layerData) : LOTLayerItem(layerData) { diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 339473e..d225699 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -182,6 +182,19 @@ protected: void updateContent() final; }; +class LOTImageLayerItem: public LOTLayerItem +{ +public: + LOTImageLayerItem(LOTLayerData *layerData); + void buildLayerNode() final; +protected: + void updateContent() final; + void renderList(std::vector &list) final; +private: + std::vector mCNodeList; + std::unique_ptr mRenderNode; +}; + class LOTMaskItem { public: