lottie: update LOTNode with the gradient stop value.

Change-Id: I85f882418d66341f2667428e293364e2cd916a9e
This commit is contained in:
subhransu mohanty 2018-11-09 10:50:00 +09:00
parent a30e5fe28e
commit c3a7b9f53f
2 changed files with 36 additions and 1 deletions

View File

@ -71,6 +71,12 @@ typedef enum
GradientRadial GradientRadial
} LOTGradientType; } LOTGradientType;
typedef struct
{
float pos;
unsigned char r, g, b, a;
}GradientStop;
typedef struct LOTNode { typedef struct LOTNode {
#define ChangeFlagNone 0x0000 #define ChangeFlagNone 0x0000
@ -101,6 +107,8 @@ typedef struct LOTNode {
struct { struct {
LOTGradientType type; LOTGradientType type;
GradientStop *stopPtr;
unsigned int stopCount;
struct { struct {
float x, y; float x, y;
} start, end, center, focal; } start, end, center, focal;

View File

@ -992,9 +992,34 @@ void LOTRepeaterItem::update(int /*frameNo*/, const VMatrix &/*parentMatrix*/,
void LOTRepeaterItem::renderList(std::vector<VDrawable *> &/*list*/) {} void LOTRepeaterItem::renderList(std::vector<VDrawable *> &/*list*/) {}
static void updateGStops(LOTNode *n, const VGradient *grad)
{
if (grad->mStops.size() != n->mGradient.stopCount) {
if (n->mGradient.stopCount)
free(n->mGradient.stopPtr);
n->mGradient.stopCount = grad->mStops.size();
n->mGradient.stopPtr = (GradientStop *) malloc(n->mGradient.stopCount * sizeof(GradientStop));
}
GradientStop *ptr = n->mGradient.stopPtr;
for (const auto &i : grad->mStops) {
ptr->pos = i.first;
ptr->a = i.second.alpha() * grad->alpha();
ptr->r = i.second.red();
ptr->g = i.second.green();
ptr->b = i.second.blue();
ptr++;
}
}
void LOTDrawable::sync() void LOTDrawable::sync()
{ {
if (!mCNode) mCNode = std::make_unique<LOTNode>(); if (!mCNode) {
mCNode = std::make_unique<LOTNode>();
mCNode->mGradient.stopPtr = nullptr;
mCNode->mGradient.stopCount = 0;
}
mCNode->mFlag = ChangeFlagNone; mCNode->mFlag = ChangeFlagNone;
if (mFlag & DirtyState::None) return; if (mFlag & DirtyState::None) return;
@ -1077,6 +1102,7 @@ void LOTDrawable::sync()
mCNode->mGradient.start.y = mBrush.mGradient->linear.y1; mCNode->mGradient.start.y = mBrush.mGradient->linear.y1;
mCNode->mGradient.end.x = mBrush.mGradient->linear.x2; mCNode->mGradient.end.x = mBrush.mGradient->linear.x2;
mCNode->mGradient.end.y = mBrush.mGradient->linear.y2; mCNode->mGradient.end.y = mBrush.mGradient->linear.y2;
updateGStops(mCNode.get(), mBrush.mGradient);
break; break;
case VBrush::Type::RadialGradient: case VBrush::Type::RadialGradient:
mCNode->mType = LOTBrushType::BrushGradient; mCNode->mType = LOTBrushType::BrushGradient;
@ -1087,6 +1113,7 @@ void LOTDrawable::sync()
mCNode->mGradient.focal.y = mBrush.mGradient->radial.fy; mCNode->mGradient.focal.y = mBrush.mGradient->radial.fy;
mCNode->mGradient.cradius = mBrush.mGradient->radial.cradius; mCNode->mGradient.cradius = mBrush.mGradient->radial.cradius;
mCNode->mGradient.fradius = mBrush.mGradient->radial.fradius; mCNode->mGradient.fradius = mBrush.mGradient->radial.fradius;
updateGStops(mCNode.get(), mBrush.mGradient);
break; break;
default: default:
break; break;