Animator.cpp revision 2218472d23483f09341bf655d55db21dcbabc1b6
1e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck/*
2e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * Copyright (C) 2014 The Android Open Source Project
3e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck *
4e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * Licensed under the Apache License, Version 2.0 (the "License");
5e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * you may not use this file except in compliance with the License.
6e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * You may obtain a copy of the License at
7e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck *
8e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck *      http://www.apache.org/licenses/LICENSE-2.0
9e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck *
10e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * Unless required by applicable law or agreed to in writing, software
11e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * distributed under the License is distributed on an "AS IS" BASIS,
12e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * See the License for the specific language governing permissions and
14e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * limitations under the License.
15e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck */
16e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
17e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#define LOG_TAG "RT-Animator"
18e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
19e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include "Animator.h"
20e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
21e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <set>
22e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
2352244fff29042926e21fa897ef5ab11148e35299John Reck#include "RenderNode.h"
24e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include "RenderProperties.h"
25e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
26e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Recknamespace android {
27e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Recknamespace uirenderer {
28e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
29e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck/************************************************************
30ff941dcd815021bb20d6504eb486acb1e50592c3John Reck *  BaseRenderNodeAnimator
31e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck ************************************************************/
32e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
33ff941dcd815021bb20d6504eb486acb1e50592c3John ReckBaseRenderNodeAnimator::BaseRenderNodeAnimator(float finalValue)
34ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        : mFinalValue(finalValue)
35ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        , mDeltaValue(0)
36ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        , mFromValue(0)
37ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        , mInterpolator(0)
38ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        , mPlayState(NEEDS_START)
39e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        , mStartTime(0)
40ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette        , mDelayUntil(0)
41ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette        , mDuration(300)
42ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette        , mStartDelay(0) {
43ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette
44e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
45e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
46ff941dcd815021bb20d6504eb486acb1e50592c3John ReckBaseRenderNodeAnimator::~BaseRenderNodeAnimator() {
47e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    setInterpolator(NULL);
48e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
49e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
50ff941dcd815021bb20d6504eb486acb1e50592c3John Reckvoid BaseRenderNodeAnimator::setInterpolator(Interpolator* interpolator) {
51e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    delete mInterpolator;
52e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    mInterpolator = interpolator;
53e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
54e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
55ff941dcd815021bb20d6504eb486acb1e50592c3John Reckvoid BaseRenderNodeAnimator::setStartValue(float value) {
56ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    LOG_ALWAYS_FATAL_IF(mPlayState != NEEDS_START,
57ff941dcd815021bb20d6504eb486acb1e50592c3John Reck            "Cannot set the start value after the animator has started!");
58ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    mFromValue = value;
59ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    mDeltaValue = (mFinalValue - mFromValue);
60ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    mPlayState = PENDING;
61ff941dcd815021bb20d6504eb486acb1e50592c3John Reck}
62ff941dcd815021bb20d6504eb486acb1e50592c3John Reck
63ff941dcd815021bb20d6504eb486acb1e50592c3John Reckvoid BaseRenderNodeAnimator::setupStartValueIfNecessary(RenderNode* target, TreeInfo& info) {
64ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    if (mPlayState == NEEDS_START) {
65ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        setStartValue(getValue(target));
66ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    }
67ff941dcd815021bb20d6504eb486acb1e50592c3John Reck}
68ff941dcd815021bb20d6504eb486acb1e50592c3John Reck
69ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverettevoid BaseRenderNodeAnimator::setDuration(nsecs_t duration) {
70ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette    mDuration = duration;
71ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette}
72ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette
73ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverettevoid BaseRenderNodeAnimator::setStartDelay(nsecs_t startDelay) {
74ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette    mStartDelay = startDelay;
75ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette}
76ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette
77ff941dcd815021bb20d6504eb486acb1e50592c3John Reckbool BaseRenderNodeAnimator::animate(RenderNode* target, TreeInfo& info) {
78ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette    if (mPlayState == PENDING && mStartDelay > 0 && mDelayUntil == 0) {
79ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette        mDelayUntil = info.frameTimeMs + mStartDelay;
80ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette        return false;
81ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette    }
82ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette
83ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette    if (mDelayUntil > info.frameTimeMs) {
84ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette        return false;
85ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette    }
86ad2f8e334f3ef22d3e412b0660a2e1f996f94116Alan Viverette
87e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    if (mPlayState == PENDING) {
88e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        mPlayState = RUNNING;
8952244fff29042926e21fa897ef5ab11148e35299John Reck        mStartTime = info.frameTimeMs;
90e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        // No interpolator was set, use the default
91e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        if (!mInterpolator) {
92e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck            setInterpolator(Interpolator::createDefaultInterpolator());
93e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        }
94e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
95e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
96e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    float fraction = 1.0f;
97e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    if (mPlayState == RUNNING) {
9852244fff29042926e21fa897ef5ab11148e35299John Reck        fraction = mDuration > 0 ? (float)(info.frameTimeMs - mStartTime) / mDuration : 1.0f;
99e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        if (fraction >= 1.0f) {
100e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck            fraction = 1.0f;
101e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck            mPlayState = FINISHED;
102e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        }
103e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
104e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    fraction = mInterpolator->interpolate(fraction);
105ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    setValue(target, mFromValue + (mDeltaValue * fraction));
106e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
107e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    if (mPlayState == FINISHED) {
10852244fff29042926e21fa897ef5ab11148e35299John Reck        callOnFinishedListener(info);
109e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        return true;
110e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
111e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    return false;
112e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
113e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
114ff941dcd815021bb20d6504eb486acb1e50592c3John Reckvoid BaseRenderNodeAnimator::callOnFinishedListener(TreeInfo& info) {
11552244fff29042926e21fa897ef5ab11148e35299John Reck    if (mListener.get()) {
11652244fff29042926e21fa897ef5ab11148e35299John Reck        if (!info.animationHook) {
11752244fff29042926e21fa897ef5ab11148e35299John Reck            mListener->onAnimationFinished(this);
11852244fff29042926e21fa897ef5ab11148e35299John Reck        } else {
11952244fff29042926e21fa897ef5ab11148e35299John Reck            info.animationHook->callOnFinished(this, mListener.get());
12052244fff29042926e21fa897ef5ab11148e35299John Reck        }
12152244fff29042926e21fa897ef5ab11148e35299John Reck    }
12252244fff29042926e21fa897ef5ab11148e35299John Reck}
12352244fff29042926e21fa897ef5ab11148e35299John Reck
124e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck/************************************************************
12552244fff29042926e21fa897ef5ab11148e35299John Reck *  RenderPropertyAnimator
12652244fff29042926e21fa897ef5ab11148e35299John Reck ************************************************************/
12752244fff29042926e21fa897ef5ab11148e35299John Reck
128ff941dcd815021bb20d6504eb486acb1e50592c3John Reckstruct RenderPropertyAnimator::PropertyAccessors {
129ff941dcd815021bb20d6504eb486acb1e50592c3John Reck   RenderNode::DirtyPropertyMask dirtyMask;
130ff941dcd815021bb20d6504eb486acb1e50592c3John Reck   GetFloatProperty getter;
131ff941dcd815021bb20d6504eb486acb1e50592c3John Reck   SetFloatProperty setter;
132ff941dcd815021bb20d6504eb486acb1e50592c3John Reck};
133ff941dcd815021bb20d6504eb486acb1e50592c3John Reck
13452244fff29042926e21fa897ef5ab11148e35299John Reck// Maps RenderProperty enum to accessors
13552244fff29042926e21fa897ef5ab11148e35299John Reckconst RenderPropertyAnimator::PropertyAccessors RenderPropertyAnimator::PROPERTY_ACCESSOR_LUT[] = {
136ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    {RenderNode::TRANSLATION_X, &RenderProperties::getTranslationX, &RenderProperties::setTranslationX },
137ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    {RenderNode::TRANSLATION_Y, &RenderProperties::getTranslationY, &RenderProperties::setTranslationY },
138ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    {RenderNode::TRANSLATION_X, &RenderProperties::getTranslationZ, &RenderProperties::setTranslationZ },
139ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    {RenderNode::SCALE_X, &RenderProperties::getScaleX, &RenderProperties::setScaleX },
140ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    {RenderNode::SCALE_Y, &RenderProperties::getScaleY, &RenderProperties::setScaleY },
141ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    {RenderNode::ROTATION, &RenderProperties::getRotation, &RenderProperties::setRotation },
142ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    {RenderNode::ROTATION_X, &RenderProperties::getRotationX, &RenderProperties::setRotationX },
143ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    {RenderNode::ROTATION_Y, &RenderProperties::getRotationY, &RenderProperties::setRotationY },
144ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    {RenderNode::X, &RenderProperties::getX, &RenderProperties::setX },
145ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    {RenderNode::Y, &RenderProperties::getY, &RenderProperties::setY },
146ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    {RenderNode::Z, &RenderProperties::getZ, &RenderProperties::setZ },
147ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    {RenderNode::ALPHA, &RenderProperties::getAlpha, &RenderProperties::setAlpha },
14852244fff29042926e21fa897ef5ab11148e35299John Reck};
14952244fff29042926e21fa897ef5ab11148e35299John Reck
150ff941dcd815021bb20d6504eb486acb1e50592c3John ReckRenderPropertyAnimator::RenderPropertyAnimator(RenderProperty property, float finalValue)
151ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        : BaseRenderNodeAnimator(finalValue)
152ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        , mPropertyAccess(&(PROPERTY_ACCESSOR_LUT[property])) {
153ff941dcd815021bb20d6504eb486acb1e50592c3John Reck}
154ff941dcd815021bb20d6504eb486acb1e50592c3John Reck
155ff941dcd815021bb20d6504eb486acb1e50592c3John Reckvoid RenderPropertyAnimator::onAttached(RenderNode* target) {
156c6b3264e16f1d2b72e7f9508559981ce9970157cJohn Reck    if (mPlayState == NEEDS_START
157c6b3264e16f1d2b72e7f9508559981ce9970157cJohn Reck            && target->isPropertyFieldDirty(mPropertyAccess->dirtyMask)) {
158ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        setStartValue((target->stagingProperties().*mPropertyAccess->getter)());
159ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    }
160ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    (target->mutateStagingProperties().*mPropertyAccess->setter)(finalValue());
16152244fff29042926e21fa897ef5ab11148e35299John Reck}
16252244fff29042926e21fa897ef5ab11148e35299John Reck
1632218472d23483f09341bf655d55db21dcbabc1b6John Reckuint32_t RenderPropertyAnimator::dirtyMask() {
1642218472d23483f09341bf655d55db21dcbabc1b6John Reck    return mPropertyAccess->dirtyMask;
1652218472d23483f09341bf655d55db21dcbabc1b6John Reck}
1662218472d23483f09341bf655d55db21dcbabc1b6John Reck
167ff941dcd815021bb20d6504eb486acb1e50592c3John Reckfloat RenderPropertyAnimator::getValue(RenderNode* target) const {
168ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    return (target->properties().*mPropertyAccess->getter)();
16952244fff29042926e21fa897ef5ab11148e35299John Reck}
17052244fff29042926e21fa897ef5ab11148e35299John Reck
171ff941dcd815021bb20d6504eb486acb1e50592c3John Reckvoid RenderPropertyAnimator::setValue(RenderNode* target, float value) {
172ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    (target->animatorProperties().*mPropertyAccess->setter)(value);
17352244fff29042926e21fa897ef5ab11148e35299John Reck}
17452244fff29042926e21fa897ef5ab11148e35299John Reck
17552244fff29042926e21fa897ef5ab11148e35299John Reck/************************************************************
17652244fff29042926e21fa897ef5ab11148e35299John Reck *  CanvasPropertyPrimitiveAnimator
17752244fff29042926e21fa897ef5ab11148e35299John Reck ************************************************************/
17852244fff29042926e21fa897ef5ab11148e35299John Reck
17952244fff29042926e21fa897ef5ab11148e35299John ReckCanvasPropertyPrimitiveAnimator::CanvasPropertyPrimitiveAnimator(
180ff941dcd815021bb20d6504eb486acb1e50592c3John Reck                CanvasPropertyPrimitive* property, float finalValue)
181ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        : BaseRenderNodeAnimator(finalValue)
18252244fff29042926e21fa897ef5ab11148e35299John Reck        , mProperty(property) {
18352244fff29042926e21fa897ef5ab11148e35299John Reck}
18452244fff29042926e21fa897ef5ab11148e35299John Reck
185ff941dcd815021bb20d6504eb486acb1e50592c3John Reckfloat CanvasPropertyPrimitiveAnimator::getValue(RenderNode* target) const {
18652244fff29042926e21fa897ef5ab11148e35299John Reck    return mProperty->value;
18752244fff29042926e21fa897ef5ab11148e35299John Reck}
18852244fff29042926e21fa897ef5ab11148e35299John Reck
189ff941dcd815021bb20d6504eb486acb1e50592c3John Reckvoid CanvasPropertyPrimitiveAnimator::setValue(RenderNode* target, float value) {
19052244fff29042926e21fa897ef5ab11148e35299John Reck    mProperty->value = value;
19152244fff29042926e21fa897ef5ab11148e35299John Reck}
19252244fff29042926e21fa897ef5ab11148e35299John Reck
19352244fff29042926e21fa897ef5ab11148e35299John Reck/************************************************************
19452244fff29042926e21fa897ef5ab11148e35299John Reck *  CanvasPropertySkPaintAnimator
19552244fff29042926e21fa897ef5ab11148e35299John Reck ************************************************************/
19652244fff29042926e21fa897ef5ab11148e35299John Reck
19752244fff29042926e21fa897ef5ab11148e35299John ReckCanvasPropertyPaintAnimator::CanvasPropertyPaintAnimator(
198ff941dcd815021bb20d6504eb486acb1e50592c3John Reck                CanvasPropertyPaint* property, PaintField field, float finalValue)
199ff941dcd815021bb20d6504eb486acb1e50592c3John Reck        : BaseRenderNodeAnimator(finalValue)
20052244fff29042926e21fa897ef5ab11148e35299John Reck        , mProperty(property)
20152244fff29042926e21fa897ef5ab11148e35299John Reck        , mField(field) {
20252244fff29042926e21fa897ef5ab11148e35299John Reck}
20352244fff29042926e21fa897ef5ab11148e35299John Reck
204ff941dcd815021bb20d6504eb486acb1e50592c3John Reckfloat CanvasPropertyPaintAnimator::getValue(RenderNode* target) const {
20552244fff29042926e21fa897ef5ab11148e35299John Reck    switch (mField) {
20652244fff29042926e21fa897ef5ab11148e35299John Reck    case STROKE_WIDTH:
20752244fff29042926e21fa897ef5ab11148e35299John Reck        return mProperty->value.getStrokeWidth();
20852244fff29042926e21fa897ef5ab11148e35299John Reck    case ALPHA:
20952244fff29042926e21fa897ef5ab11148e35299John Reck        return mProperty->value.getAlpha();
21052244fff29042926e21fa897ef5ab11148e35299John Reck    }
21152244fff29042926e21fa897ef5ab11148e35299John Reck    LOG_ALWAYS_FATAL("Unknown field %d", (int) mField);
21252244fff29042926e21fa897ef5ab11148e35299John Reck    return -1;
21352244fff29042926e21fa897ef5ab11148e35299John Reck}
21452244fff29042926e21fa897ef5ab11148e35299John Reck
215531ee701ddca2d1604fcce8e5d6d8837a3f651acJohn Reckstatic uint8_t to_uint8(float value) {
216531ee701ddca2d1604fcce8e5d6d8837a3f651acJohn Reck    int c = (int) (value + .5f);
217531ee701ddca2d1604fcce8e5d6d8837a3f651acJohn Reck    return static_cast<uint8_t>( c < 0 ? 0 : c > 255 ? 255 : c );
218531ee701ddca2d1604fcce8e5d6d8837a3f651acJohn Reck}
219531ee701ddca2d1604fcce8e5d6d8837a3f651acJohn Reck
220ff941dcd815021bb20d6504eb486acb1e50592c3John Reckvoid CanvasPropertyPaintAnimator::setValue(RenderNode* target, float value) {
22152244fff29042926e21fa897ef5ab11148e35299John Reck    switch (mField) {
22252244fff29042926e21fa897ef5ab11148e35299John Reck    case STROKE_WIDTH:
22352244fff29042926e21fa897ef5ab11148e35299John Reck        mProperty->value.setStrokeWidth(value);
22452244fff29042926e21fa897ef5ab11148e35299John Reck        return;
22552244fff29042926e21fa897ef5ab11148e35299John Reck    case ALPHA:
226531ee701ddca2d1604fcce8e5d6d8837a3f651acJohn Reck        mProperty->value.setAlpha(to_uint8(value));
22752244fff29042926e21fa897ef5ab11148e35299John Reck        return;
22852244fff29042926e21fa897ef5ab11148e35299John Reck    }
22952244fff29042926e21fa897ef5ab11148e35299John Reck    LOG_ALWAYS_FATAL("Unknown field %d", (int) mField);
230e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
231e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
232e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} /* namespace uirenderer */
233e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} /* namespace android */
234