11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDrawColor.h"
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDisplayList.h"
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDrawPaint.h"
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkParse.h"
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkScript.h"
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectenum HSV_Choice {
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    kGetHue,
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    kGetSaturation,
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    kGetValue
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic SkScalar RGB_to_HSV(SkColor color, HSV_Choice choice) {
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkScalar red = SkIntToScalar(SkColorGetR(color));
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkScalar green = SkIntToScalar(SkColorGetG(color));
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkScalar blue = SkIntToScalar(SkColorGetB(color));
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkScalar min = SkMinScalar(SkMinScalar(red, green), blue);
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkScalar value = SkMaxScalar(SkMaxScalar(red, green), blue);
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (choice == kGetValue)
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return value/255;
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkScalar delta = value - min;
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkScalar saturation = value == 0 ? 0 : SkScalarDiv(delta, value);
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (choice == kGetSaturation)
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return saturation;
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkScalar hue;
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (saturation == 0)
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        hue = 0;
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    else {
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkScalar part60 = SkScalarDiv(60 * SK_Scalar1, delta);
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (red == value) {
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            hue = SkScalarMul(green - blue, part60);
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            if (hue < 0)
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                hue += 360 * SK_Scalar1;
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        else if (green == value)
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            hue = 120 * SK_Scalar1 + SkScalarMul(blue - red, part60);
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        else  // blue == value
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            hue = 240 * SK_Scalar1 + SkScalarMul(red - green, part60);
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(choice == kGetHue);
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return hue;
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#if defined _WIN32 && _MSC_VER >= 1300  // disable 'red', etc. may be used without having been initialized
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#pragma warning ( push )
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#pragma warning ( disable : 4701 )
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic SkColor HSV_to_RGB(SkColor color, HSV_Choice choice, SkScalar hsv) {
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkScalar hue = choice == kGetHue ? hsv : RGB_to_HSV(color, kGetHue);
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkScalar saturation = choice == kGetSaturation ? hsv : RGB_to_HSV(color, kGetSaturation);
630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkScalar value = choice == kGetValue ? hsv : RGB_to_HSV(color, kGetValue);
640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    value *= 255;
650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkScalar red SK_INIT_TO_AVOID_WARNING;
660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkScalar green SK_INIT_TO_AVOID_WARNING;
670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkScalar blue SK_INIT_TO_AVOID_WARNING;
680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (saturation == 0)    // color is on black-and-white center line
690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        red = green = blue = value;
700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    else {
710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        //SkScalar fraction = SkScalarMod(hue, 60 * SK_Scalar1);
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        int sextant = SkScalarFloor(hue / 60);
730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkScalar fraction = hue / 60 - SkIntToScalar(sextant);
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkScalar p = SkScalarMul(value , SK_Scalar1 - saturation);
750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkScalar q = SkScalarMul(value, SK_Scalar1 - SkScalarMul(saturation, fraction));
760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkScalar t = SkScalarMul(value, SK_Scalar1 -
770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkScalarMul(saturation, SK_Scalar1 - fraction));
780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        switch (sextant % 6) {
790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            case 0: red = value; green = t; blue = p; break;
800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            case 1: red = q; green = value; blue = p; break;
810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            case 2: red = p; green = value; blue = t; break;
820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            case 3: red = p; green = q; blue = value; break;
830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            case 4: red = t;  green = p; blue = value; break;
840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            case 5: red = value; green = p; blue = q; break;
850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    //used to say SkToU8((U8CPU) red) etc
880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return SkColorSetARGB(SkColorGetA(color), SkScalarRound(red),
890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkScalarRound(green), SkScalarRound(blue));
900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#if defined _WIN32 && _MSC_VER >= 1300
930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#pragma warning ( pop )
940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectenum SkDrawColor_Properties {
970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_PROPERTY(alpha),
980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_PROPERTY(blue),
990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_PROPERTY(green),
1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_PROPERTY(hue),
1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_PROPERTY(red),
1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_PROPERTY(saturation),
1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_PROPERTY(value)
1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#if SK_USE_CONDENSED_INFO == 0
1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst SkMemberInfo SkDrawColor::fInfo[] = {
1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER_PROPERTY(alpha, Float),
1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER_PROPERTY(blue, Float),
1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER(color, ARGB),
1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER_PROPERTY(green, Float),
1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER_PROPERTY(hue, Float),
1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER_PROPERTY(red, Float),
1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER_PROPERTY(saturation, Float),
1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER_PROPERTY(value, Float),
1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectDEFINE_GET_MEMBER(SkDrawColor);
1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDrawColor::SkDrawColor() : fDirty(false) {
1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    color = SK_ColorBLACK;
1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fHue = fSaturation = fValue = SK_ScalarNaN;
1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkDrawColor::add() {
1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (fPaint->color != NULL)
1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return true; // error (probably color in paint as attribute as well)
1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fPaint->color = this;
1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fPaint->fOwnsColor = true;
1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDisplayable* SkDrawColor::deepCopy(SkAnimateMaker* maker) {
1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDrawColor* copy = new SkDrawColor();
1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    copy->color = color;
1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    copy->fHue = fHue;
1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    copy->fSaturation = fSaturation;
1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    copy->fValue = fValue;
1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    copy->fDirty = fDirty;
1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return copy;
1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDrawColor::dirty(){
1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fDirty = true;
1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DUMP_ENABLED
1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDrawColor::dump(SkAnimateMaker* maker) {
1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    dumpBase(maker);
1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDebugf("alpha=\"%d\" red=\"%d\" green=\"%d\" blue=\"%d\" />\n",
1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkColorGetA(color)/255, SkColorGetR(color),
1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkColorGetG(color), SkColorGetB(color));
1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
1580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkColor SkDrawColor::getColor() {
1600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (fDirty) {
1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (SkScalarIsNaN(fValue) == false)
1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            color = HSV_to_RGB(color, kGetValue, fValue);
1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (SkScalarIsNaN(fSaturation) == false)
1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            color = HSV_to_RGB(color, kGetSaturation, fSaturation);
1650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (SkScalarIsNaN(fHue) == false)
1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            color = HSV_to_RGB(color, kGetHue, fHue);
1670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fDirty = false;
1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return color;
1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDisplayable* SkDrawColor::getParent() const {
1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return fPaint;
1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkDrawColor::getProperty(int index, SkScriptValue* value) const {
1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    value->fType = SkType_Float;
1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkScalar result;
1790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    switch(index) {
1800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SK_PROPERTY(alpha):
1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            result = SkIntToScalar(SkColorGetA(color)) / 255;
1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
1830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SK_PROPERTY(blue):
1840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            result = SkIntToScalar(SkColorGetB(color));
1850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
1860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SK_PROPERTY(green):
1870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            result = SkIntToScalar(SkColorGetG(color));
1880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SK_PROPERTY(hue):
1900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            result = RGB_to_HSV(color, kGetHue);
1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
1920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SK_PROPERTY(red):
1930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            result = SkIntToScalar(SkColorGetR(color));
1940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
1950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SK_PROPERTY(saturation):
1960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            result = RGB_to_HSV(color, kGetSaturation);
1970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
1980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SK_PROPERTY(value):
1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            result = RGB_to_HSV(color, kGetValue);
2000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
2010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        default:
2020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkASSERT(0);
2030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return false;
2040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
2050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    value->fOperand.fScalar = result;
2060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return true;
2070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkDrawColor::onEndElement(SkAnimateMaker& maker){
2100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fDirty = true;
2110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkDrawColor::setParent(SkDisplayable* parent) {
2140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(parent != NULL);
2150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (parent->getType() == SkType_LinearGradient || parent->getType() == SkType_RadialGradient)
2160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return false;
2170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (parent->isPaint() == false)
2180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return true;
2190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fPaint = (SkDrawPaint*) parent;
2200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
2210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkDrawColor::setProperty(int index, SkScriptValue& value) {
2240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(value.fType == SkType_Float);
2250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkScalar scalar = value.fOperand.fScalar;
2260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    switch (index) {
2270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SK_PROPERTY(alpha):
2280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            uint8_t alpha;
2290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        #ifdef SK_SCALAR_IS_FLOAT
2300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            alpha = scalar == SK_Scalar1 ? 255 : SkToU8((U8CPU) (scalar * 256));
2310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        #else
2320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            alpha = SkToU8((scalar - (scalar >= SK_ScalarHalf)) >> 8);
2330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        #endif
2340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            color = SkColorSetARGB(alpha, SkColorGetR(color),
2350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                SkColorGetG(color), SkColorGetB(color));
2360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
2370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SK_PROPERTY(blue):
2380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            scalar = SkScalarClampMax(scalar, 255 * SK_Scalar1);
2390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            color = SkColorSetARGB(SkColorGetA(color), SkColorGetR(color),
2400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                SkColorGetG(color), SkToU8((U8CPU) scalar));
2410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
2420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SK_PROPERTY(green):
2430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            scalar = SkScalarClampMax(scalar, 255 * SK_Scalar1);
2440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            color = SkColorSetARGB(SkColorGetA(color), SkColorGetR(color),
2450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                SkToU8((U8CPU) scalar), SkColorGetB(color));
2460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
2470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SK_PROPERTY(hue):
2480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fHue = scalar;//RGB_to_HSV(color, kGetHue);
2490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fDirty = true;
2500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
2510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SK_PROPERTY(red):
2520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            scalar = SkScalarClampMax(scalar, 255 * SK_Scalar1);
2530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            color = SkColorSetARGB(SkColorGetA(color), SkToU8((U8CPU) scalar),
2540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                SkColorGetG(color), SkColorGetB(color));
2550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        break;
2560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SK_PROPERTY(saturation):
2570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fSaturation = scalar;//RGB_to_HSV(color, kGetSaturation);
2580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fDirty = true;
2590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
2600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SK_PROPERTY(value):
2610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fValue = scalar;//RGB_to_HSV(color, kGetValue);
2620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fDirty = true;
2630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
2640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        default:
2650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkASSERT(0);
2660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return false;
2670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
2680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return true;
2690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
271