Index: skia/animator/SkDrawColor.cpp |
=================================================================== |
--- skia/animator/SkDrawColor.cpp (revision 16859) |
+++ skia/animator/SkDrawColor.cpp (working copy) |
@@ -1,278 +0,0 @@ |
-/* libs/graphics/animator/SkDrawColor.cpp |
-** |
-** Copyright 2006, The Android Open Source Project |
-** |
-** Licensed under the Apache License, Version 2.0 (the "License"); |
-** you may not use this file except in compliance with the License. |
-** You may obtain a copy of the License at |
-** |
-** http://www.apache.org/licenses/LICENSE-2.0 |
-** |
-** Unless required by applicable law or agreed to in writing, software |
-** distributed under the License is distributed on an "AS IS" BASIS, |
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-** See the License for the specific language governing permissions and |
-** limitations under the License. |
-*/ |
- |
-#include "SkDrawColor.h" |
-#ifdef SK_DEBUG |
-#include "SkDisplayList.h" |
-#endif |
-#include "SkDrawPaint.h" |
-#include "SkParse.h" |
-#include "SkScript.h" |
- |
-enum HSV_Choice { |
- kGetHue, |
- kGetSaturation, |
- kGetValue |
-}; |
- |
-static SkScalar RGB_to_HSV(SkColor color, HSV_Choice choice) { |
- SkScalar red = SkIntToScalar(SkColorGetR(color)); |
- SkScalar green = SkIntToScalar(SkColorGetG(color)); |
- SkScalar blue = SkIntToScalar(SkColorGetB(color)); |
- SkScalar min = SkMinScalar(SkMinScalar(red, green), blue); |
- SkScalar value = SkMaxScalar(SkMaxScalar(red, green), blue); |
- if (choice == kGetValue) |
- return value/255; |
- SkScalar delta = value - min; |
- SkScalar saturation = value == 0 ? 0 : SkScalarDiv(delta, value); |
- if (choice == kGetSaturation) |
- return saturation; |
- SkScalar hue; |
- if (saturation == 0) |
- hue = 0; |
- else { |
- SkScalar part60 = SkScalarDiv(60 * SK_Scalar1, delta); |
- if (red == value) { |
- hue = SkScalarMul(green - blue, part60); |
- if (hue < 0) |
- hue += 360 * SK_Scalar1; |
- } |
- else if (green == value) |
- hue = 120 * SK_Scalar1 + SkScalarMul(blue - red, part60); |
- else // blue == value |
- hue = 240 * SK_Scalar1 + SkScalarMul(red - green, part60); |
- } |
- SkASSERT(choice == kGetHue); |
- return hue; |
-} |
- |
-#if defined _WIN32 && _MSC_VER >= 1300 // disable 'red', etc. may be used without having been initialized |
-#pragma warning ( push ) |
-#pragma warning ( disable : 4701 ) |
-#endif |
- |
-static SkColor HSV_to_RGB(SkColor color, HSV_Choice choice, SkScalar hsv) { |
- SkScalar hue = choice == kGetHue ? hsv : RGB_to_HSV(color, kGetHue); |
- SkScalar saturation = choice == kGetSaturation ? hsv : RGB_to_HSV(color, kGetSaturation); |
- SkScalar value = choice == kGetValue ? hsv : RGB_to_HSV(color, kGetValue); |
- value *= 255; |
- SkScalar red SK_INIT_TO_AVOID_WARNING; |
- SkScalar green SK_INIT_TO_AVOID_WARNING; |
- SkScalar blue SK_INIT_TO_AVOID_WARNING; |
- if (saturation == 0) // color is on black-and-white center line |
- red = green = blue = value; |
- else { |
- //SkScalar fraction = SkScalarMod(hue, 60 * SK_Scalar1); |
- int sextant = SkScalarFloor(hue / 60); |
- SkScalar fraction = hue / 60 - SkIntToScalar(sextant); |
- SkScalar p = SkScalarMul(value , SK_Scalar1 - saturation); |
- SkScalar q = SkScalarMul(value, SK_Scalar1 - SkScalarMul(saturation, fraction)); |
- SkScalar t = SkScalarMul(value, SK_Scalar1 - |
- SkScalarMul(saturation, SK_Scalar1 - fraction)); |
- switch (sextant % 6) { |
- case 0: red = value; green = t; blue = p; break; |
- case 1: red = q; green = value; blue = p; break; |
- case 2: red = p; green = value; blue = t; break; |
- case 3: red = p; green = q; blue = value; break; |
- case 4: red = t; green = p; blue = value; break; |
- case 5: red = value; green = p; blue = q; break; |
- } |
- } |
- //used to say SkToU8((U8CPU) red) etc |
- return SkColorSetARGB(SkColorGetA(color), SkScalarRound(red), |
- SkScalarRound(green), SkScalarRound(blue)); |
-} |
- |
-#if defined _WIN32 && _MSC_VER >= 1300 |
-#pragma warning ( pop ) |
-#endif |
- |
-enum SkDrawColor_Properties { |
- SK_PROPERTY(alpha), |
- SK_PROPERTY(blue), |
- SK_PROPERTY(green), |
- SK_PROPERTY(hue), |
- SK_PROPERTY(red), |
- SK_PROPERTY(saturation), |
- SK_PROPERTY(value) |
-}; |
- |
-#if SK_USE_CONDENSED_INFO == 0 |
- |
-const SkMemberInfo SkDrawColor::fInfo[] = { |
- SK_MEMBER_PROPERTY(alpha, Float), |
- SK_MEMBER_PROPERTY(blue, Float), |
- SK_MEMBER(color, ARGB), |
- SK_MEMBER_PROPERTY(green, Float), |
- SK_MEMBER_PROPERTY(hue, Float), |
- SK_MEMBER_PROPERTY(red, Float), |
- SK_MEMBER_PROPERTY(saturation, Float), |
- SK_MEMBER_PROPERTY(value, Float), |
-}; |
- |
-#endif |
- |
-DEFINE_GET_MEMBER(SkDrawColor); |
- |
-SkDrawColor::SkDrawColor() : fDirty(false) { |
- color = SK_ColorBLACK; |
- fHue = fSaturation = fValue = SK_ScalarNaN; |
-} |
- |
-bool SkDrawColor::add() { |
- if (fPaint->color != NULL) |
- return true; // error (probably color in paint as attribute as well) |
- fPaint->color = this; |
- fPaint->fOwnsColor = true; |
- return false; |
-} |
- |
-SkDisplayable* SkDrawColor::deepCopy(SkAnimateMaker* maker) { |
- SkDrawColor* copy = new SkDrawColor(); |
- copy->color = color; |
- copy->fHue = fHue; |
- copy->fSaturation = fSaturation; |
- copy->fValue = fValue; |
- copy->fDirty = fDirty; |
- return copy; |
-} |
- |
-void SkDrawColor::dirty(){ |
- fDirty = true; |
-} |
- |
-#ifdef SK_DUMP_ENABLED |
-void SkDrawColor::dump(SkAnimateMaker* maker) { |
- dumpBase(maker); |
- SkDebugf("alpha=\"%d\" red=\"%d\" green=\"%d\" blue=\"%d\" />\n", |
- SkColorGetA(color)/255, SkColorGetR(color), |
- SkColorGetG(color), SkColorGetB(color)); |
-} |
-#endif |
- |
-SkColor SkDrawColor::getColor() { |
- if (fDirty) { |
- if (SkScalarIsNaN(fValue) == false) |
- color = HSV_to_RGB(color, kGetValue, fValue); |
- if (SkScalarIsNaN(fSaturation) == false) |
- color = HSV_to_RGB(color, kGetSaturation, fSaturation); |
- if (SkScalarIsNaN(fHue) == false) |
- color = HSV_to_RGB(color, kGetHue, fHue); |
- fDirty = false; |
- } |
- return color; |
-} |
- |
-SkDisplayable* SkDrawColor::getParent() const { |
- return fPaint; |
-} |
- |
-bool SkDrawColor::getProperty(int index, SkScriptValue* value) const { |
- value->fType = SkType_Float; |
- SkScalar result; |
- switch(index) { |
- case SK_PROPERTY(alpha): |
- result = SkIntToScalar(SkColorGetA(color)) / 255; |
- break; |
- case SK_PROPERTY(blue): |
- result = SkIntToScalar(SkColorGetB(color)); |
- break; |
- case SK_PROPERTY(green): |
- result = SkIntToScalar(SkColorGetG(color)); |
- break; |
- case SK_PROPERTY(hue): |
- result = RGB_to_HSV(color, kGetHue); |
- break; |
- case SK_PROPERTY(red): |
- result = SkIntToScalar(SkColorGetR(color)); |
- break; |
- case SK_PROPERTY(saturation): |
- result = RGB_to_HSV(color, kGetSaturation); |
- break; |
- case SK_PROPERTY(value): |
- result = RGB_to_HSV(color, kGetValue); |
- break; |
- default: |
- SkASSERT(0); |
- return false; |
- } |
- value->fOperand.fScalar = result; |
- return true; |
-} |
- |
-void SkDrawColor::onEndElement(SkAnimateMaker& maker){ |
- fDirty = true; |
-} |
- |
-bool SkDrawColor::setParent(SkDisplayable* parent) { |
- SkASSERT(parent != NULL); |
- if (parent->getType() == SkType_LinearGradient || parent->getType() == SkType_RadialGradient) |
- return false; |
- if (parent->isPaint() == false) |
- return true; |
- fPaint = (SkDrawPaint*) parent; |
- return false; |
-} |
- |
-bool SkDrawColor::setProperty(int index, SkScriptValue& value) { |
- SkASSERT(value.fType == SkType_Float); |
- SkScalar scalar = value.fOperand.fScalar; |
- switch (index) { |
- case SK_PROPERTY(alpha): |
- uint8_t alpha; |
- #ifdef SK_SCALAR_IS_FLOAT |
- alpha = scalar == SK_Scalar1 ? 255 : SkToU8((U8CPU) (scalar * 256)); |
- #else |
- alpha = SkToU8((scalar - (scalar >= SK_ScalarHalf)) >> 8); |
- #endif |
- color = SkColorSetARGB(alpha, SkColorGetR(color), |
- SkColorGetG(color), SkColorGetB(color)); |
- break; |
- case SK_PROPERTY(blue): |
- scalar = SkScalarClampMax(scalar, 255 * SK_Scalar1); |
- color = SkColorSetARGB(SkColorGetA(color), SkColorGetR(color), |
- SkColorGetG(color), SkToU8((U8CPU) scalar)); |
- break; |
- case SK_PROPERTY(green): |
- scalar = SkScalarClampMax(scalar, 255 * SK_Scalar1); |
- color = SkColorSetARGB(SkColorGetA(color), SkColorGetR(color), |
- SkToU8((U8CPU) scalar), SkColorGetB(color)); |
- break; |
- case SK_PROPERTY(hue): |
- fHue = scalar;//RGB_to_HSV(color, kGetHue); |
- fDirty = true; |
- break; |
- case SK_PROPERTY(red): |
- scalar = SkScalarClampMax(scalar, 255 * SK_Scalar1); |
- color = SkColorSetARGB(SkColorGetA(color), SkToU8((U8CPU) scalar), |
- SkColorGetG(color), SkColorGetB(color)); |
- break; |
- case SK_PROPERTY(saturation): |
- fSaturation = scalar;//RGB_to_HSV(color, kGetSaturation); |
- fDirty = true; |
- break; |
- case SK_PROPERTY(value): |
- fValue = scalar;//RGB_to_HSV(color, kGetValue); |
- fDirty = true; |
- break; |
- default: |
- SkASSERT(0); |
- return false; |
- } |
- return true; |
-} |
- |