1 /* 2 * Copyright (C) 2006, 2007, 2008, 2011 Apple Inc. All rights reserved. 3 * Copyright (C) 2007 Alp Toker <alp (at) atoker.com> 4 * Copyright (C) 2008 Torch Mobile, Inc. 5 * Copyright (C) 2013 Google Inc. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 20 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 21 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 22 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 23 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 24 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #ifndef Gradient_h 30 #define Gradient_h 31 32 #include "platform/PlatformExport.h" 33 #include "platform/geometry/FloatPoint.h" 34 #include "platform/graphics/Color.h" 35 #include "platform/graphics/GraphicsTypes.h" 36 #include "platform/transforms/AffineTransform.h" 37 #include "wtf/PassRefPtr.h" 38 #include "wtf/RefCounted.h" 39 #include "wtf/RefPtr.h" 40 #include "wtf/Vector.h" 41 42 class SkShader; 43 44 namespace blink { 45 46 class PLATFORM_EXPORT Gradient : public RefCounted<Gradient> { 47 public: 48 static PassRefPtr<Gradient> create(const FloatPoint& p0, const FloatPoint& p1) 49 { 50 return adoptRef(new Gradient(p0, p1)); 51 } 52 static PassRefPtr<Gradient> create(const FloatPoint& p0, float r0, const FloatPoint& p1, float r1, float aspectRatio = 1) 53 { 54 return adoptRef(new Gradient(p0, r0, p1, r1, aspectRatio)); 55 } 56 ~Gradient(); 57 58 struct ColorStop { 59 float stop; 60 Color color; 61 62 ColorStop(float s, const Color& c) : stop(s), color(c) { } 63 }; 64 void addColorStop(const ColorStop&); 65 void addColorStop(float value, const Color& color) { addColorStop(ColorStop(value, color)); } 66 67 bool hasAlpha() const; 68 bool shaderChanged() const { return !m_gradient; } 69 70 bool isRadial() const { return m_radial; } 71 bool isZeroSize() const { return m_p0.x() == m_p1.x() && m_p0.y() == m_p1.y() && (!m_radial || m_r0 == m_r1); } 72 73 const FloatPoint& p0() const { return m_p0; } 74 const FloatPoint& p1() const { return m_p1; } 75 76 void setP0(const FloatPoint& p) 77 { 78 if (m_p0 == p) 79 return; 80 81 m_p0 = p; 82 } 83 84 void setP1(const FloatPoint& p) 85 { 86 if (m_p1 == p) 87 return; 88 89 m_p1 = p; 90 } 91 92 float startRadius() const { return m_r0; } 93 float endRadius() const { return m_r1; } 94 95 void setStartRadius(float r) 96 { 97 if (m_r0 == r) 98 return; 99 100 m_r0 = r; 101 } 102 103 void setEndRadius(float r) 104 { 105 if (m_r1 == r) 106 return; 107 108 m_r1 = r; 109 } 110 111 float aspectRatio() const { return m_aspectRatio; } 112 113 SkShader* shader(); 114 115 void setDrawsInPMColorSpace(bool drawInPMColorSpace); 116 117 void setSpreadMethod(GradientSpreadMethod); 118 GradientSpreadMethod spreadMethod() { return m_spreadMethod; } 119 void setGradientSpaceTransform(const AffineTransform& gradientSpaceTransformation); 120 AffineTransform gradientSpaceTransform() { return m_gradientSpaceTransformation; } 121 122 private: 123 Gradient(const FloatPoint& p0, const FloatPoint& p1); 124 Gradient(const FloatPoint& p0, float r0, const FloatPoint& p1, float r1, float aspectRatio); 125 126 void destroyShader(); 127 128 void sortStopsIfNecessary(); 129 130 FloatPoint m_p0; 131 FloatPoint m_p1; 132 float m_r0; 133 float m_r1; 134 float m_aspectRatio; // For elliptical gradient, width / height. 135 Vector<ColorStop, 2> m_stops; 136 bool m_radial; 137 bool m_stopsSorted; 138 bool m_drawInPMColorSpace; 139 GradientSpreadMethod m_spreadMethod; 140 AffineTransform m_gradientSpaceTransformation; 141 142 RefPtr<SkShader> m_gradient; 143 }; 144 145 } // namespace blink 146 147 #endif 148