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 WebCore { 45 46 class FloatRect; 47 class IntSize; 48 49 class PLATFORM_EXPORT Gradient : public RefCounted<Gradient> { 50 public: 51 static PassRefPtr<Gradient> create(const FloatPoint& p0, const FloatPoint& p1) 52 { 53 return adoptRef(new Gradient(p0, p1)); 54 } 55 static PassRefPtr<Gradient> create(const FloatPoint& p0, float r0, const FloatPoint& p1, float r1, float aspectRatio = 1) 56 { 57 return adoptRef(new Gradient(p0, r0, p1, r1, aspectRatio)); 58 } 59 ~Gradient(); 60 61 struct ColorStop { 62 float stop; 63 Color color; 64 65 ColorStop(float s, const Color& c) : stop(s), color(c) { } 66 }; 67 void addColorStop(const ColorStop&); 68 void addColorStop(float value, const Color& color) { addColorStop(ColorStop(value, color)); } 69 70 bool hasAlpha() const; 71 bool shaderChanged() const { return !m_gradient; } 72 73 bool isRadial() const { return m_radial; } 74 bool isZeroSize() const { return m_p0.x() == m_p1.x() && m_p0.y() == m_p1.y() && (!m_radial || m_r0 == m_r1); } 75 76 const FloatPoint& p0() const { return m_p0; } 77 const FloatPoint& p1() const { return m_p1; } 78 79 void setP0(const FloatPoint& p) 80 { 81 if (m_p0 == p) 82 return; 83 84 m_p0 = p; 85 } 86 87 void setP1(const FloatPoint& p) 88 { 89 if (m_p1 == p) 90 return; 91 92 m_p1 = p; 93 } 94 95 float startRadius() const { return m_r0; } 96 float endRadius() const { return m_r1; } 97 98 void setStartRadius(float r) 99 { 100 if (m_r0 == r) 101 return; 102 103 m_r0 = r; 104 } 105 106 void setEndRadius(float r) 107 { 108 if (m_r1 == r) 109 return; 110 111 m_r1 = r; 112 } 113 114 float aspectRatio() const { return m_aspectRatio; } 115 116 SkShader* shader(); 117 118 void setDrawsInPMColorSpace(bool drawInPMColorSpace); 119 120 void setSpreadMethod(GradientSpreadMethod); 121 GradientSpreadMethod spreadMethod() { return m_spreadMethod; } 122 void setGradientSpaceTransform(const AffineTransform& gradientSpaceTransformation); 123 AffineTransform gradientSpaceTransform() { return m_gradientSpaceTransformation; } 124 125 private: 126 Gradient(const FloatPoint& p0, const FloatPoint& p1); 127 Gradient(const FloatPoint& p0, float r0, const FloatPoint& p1, float r1, float aspectRatio); 128 129 void destroyShader(); 130 131 void sortStopsIfNecessary(); 132 133 FloatPoint m_p0; 134 FloatPoint m_p1; 135 float m_r0; 136 float m_r1; 137 float m_aspectRatio; // For elliptical gradient, width / height. 138 Vector<ColorStop, 2> m_stops; 139 bool m_radial; 140 bool m_stopsSorted; 141 bool m_drawInPMColorSpace; 142 GradientSpreadMethod m_spreadMethod; 143 AffineTransform m_gradientSpaceTransformation; 144 145 RefPtr<SkShader> m_gradient; 146 }; 147 148 } // namespace WebCore 149 150 #endif 151