15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006, 2007, 2008, 2011 Apple Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2007 Alp Toker <alp@atoker.com> 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008 Torch Mobile, Inc. 553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * Copyright (C) 2013 Google Inc. All rights reserved. 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef Gradient_h 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define Gradient_h 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 32a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/PlatformExport.h" 331e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/FloatPoint.h" 34d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "platform/graphics/Color.h" 35f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "platform/graphics/GraphicsTypes.h" 361e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/transforms/AffineTransform.h" 3793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "wtf/PassRefPtr.h" 3893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "wtf/RefCounted.h" 3993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "wtf/RefPtr.h" 4093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "wtf/Vector.h" 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 425267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)class SkShader; 435267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 44c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 46a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)class PLATFORM_EXPORT Gradient : public RefCounted<Gradient> { 475267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)public: 485267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) static PassRefPtr<Gradient> create(const FloatPoint& p0, const FloatPoint& p1) 495267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) { 505267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return adoptRef(new Gradient(p0, p1)); 515267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 525267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) static PassRefPtr<Gradient> create(const FloatPoint& p0, float r0, const FloatPoint& p1, float r1, float aspectRatio = 1) 535267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) { 545267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return adoptRef(new Gradient(p0, r0, p1, r1, aspectRatio)); 555267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 565267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) ~Gradient(); 575267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 585267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) struct ColorStop { 595267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) float stop; 60d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) Color color; 615267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 62d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ColorStop(float s, const Color& c) : stop(s), color(c) { } 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 645267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) void addColorStop(const ColorStop&); 6507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch void addColorStop(float value, const Color& color) { addColorStop(ColorStop(value, color)); } 665267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 675267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) bool hasAlpha() const; 68d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) bool shaderChanged() const { return !m_gradient; } 695267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 705267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) bool isRadial() const { return m_radial; } 715267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) bool isZeroSize() const { return m_p0.x() == m_p1.x() && m_p0.y() == m_p1.y() && (!m_radial || m_r0 == m_r1); } 725267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 735267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) const FloatPoint& p0() const { return m_p0; } 745267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) const FloatPoint& p1() const { return m_p1; } 755267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 765267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) void setP0(const FloatPoint& p) 775267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) { 785267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (m_p0 == p) 795267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return; 805267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 815267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) m_p0 = p; 825267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 835267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 845267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) void setP1(const FloatPoint& p) 855267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) { 865267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (m_p1 == p) 875267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return; 885267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 895267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) m_p1 = p; 905267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 915267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 925267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) float startRadius() const { return m_r0; } 935267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) float endRadius() const { return m_r1; } 945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 955267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) void setStartRadius(float r) 965267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) { 975267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (m_r0 == r) 985267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return; 995267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1005267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) m_r0 = r; 1015267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 1025267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1035267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) void setEndRadius(float r) 1045267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) { 1055267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (m_r1 == r) 1065267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return; 1075267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1085267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) m_r1 = r; 1095267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 1105267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1115267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) float aspectRatio() const { return m_aspectRatio; } 1125267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1135267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) SkShader* shader(); 1145267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 115521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) void setDrawsInPMColorSpace(bool drawInPMColorSpace); 116521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 1175267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) void setSpreadMethod(GradientSpreadMethod); 1185267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) GradientSpreadMethod spreadMethod() { return m_spreadMethod; } 1195267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) void setGradientSpaceTransform(const AffineTransform& gradientSpaceTransformation); 1205267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) AffineTransform gradientSpaceTransform() { return m_gradientSpaceTransformation; } 1215267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1225267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)private: 1235267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) Gradient(const FloatPoint& p0, const FloatPoint& p1); 1245267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) Gradient(const FloatPoint& p0, float r0, const FloatPoint& p1, float r1, float aspectRatio); 1255267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1265267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) void destroyShader(); 1275267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1285267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) void sortStopsIfNecessary(); 1295267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1305267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) FloatPoint m_p0; 1315267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) FloatPoint m_p1; 1325267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) float m_r0; 1335267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) float m_r1; 1345267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) float m_aspectRatio; // For elliptical gradient, width / height. 13543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) Vector<ColorStop, 2> m_stops; 136d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) bool m_radial; 13743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) bool m_stopsSorted; 138d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) bool m_drawInPMColorSpace; 1395267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) GradientSpreadMethod m_spreadMethod; 1405267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) AffineTransform m_gradientSpaceTransformation; 1415267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 142e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch RefPtr<SkShader> m_gradient; 1435267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}; 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 145c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 148