Replace PassRef with Ref/Ref&& across the board.
[WebKit-https.git] / Source / WebCore / platform / graphics / Gradient.h
index 60a4538..a421346 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2006, 2007, 2008, 2011 Apple Inc. All rights reserved.
+ * Copyright (C) 2006, 2007, 2008, 2011, 2012, 2013 Apple Inc. All rights reserved.
  * Copyright (C) 2007 Alp Toker <alp@atoker.com>
  * Copyright (C) 2008 Torch Mobile, Inc.
  *
  * Copyright (C) 2007 Alp Toker <alp@atoker.com>
  * Copyright (C) 2008 Torch Mobile, Inc.
  *
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
  *
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
  *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 
 #include "AffineTransform.h"
 #include "FloatPoint.h"
 
 #include "AffineTransform.h"
 #include "FloatPoint.h"
-#include "Generator.h"
 #include "GraphicsTypes.h"
 #include <wtf/PassRefPtr.h>
 #include "GraphicsTypes.h"
 #include <wtf/PassRefPtr.h>
+#include <wtf/RefCounted.h>
 #include <wtf/Vector.h>
 
 #if USE(CG)
 
 typedef struct CGContext* CGContextRef;
 
 #include <wtf/Vector.h>
 
 #if USE(CG)
 
 typedef struct CGContext* CGContextRef;
 
-#define USE_CG_SHADING defined(BUILDING_ON_LEOPARD)
-
-#if USE_CG_SHADING
-typedef struct CGShading* CGShadingRef;
-typedef CGShadingRef PlatformGradient;
-#else
 typedef struct CGGradient* CGGradientRef;
 typedef CGGradientRef PlatformGradient;
 typedef struct CGGradient* CGGradientRef;
 typedef CGGradientRef PlatformGradient;
-#endif
 
 
-#elif PLATFORM(QT)
-QT_BEGIN_NAMESPACE
-class QGradient;
-QT_END_NAMESPACE
-typedef QGradient* PlatformGradient;
 #elif USE(CAIRO)
 typedef struct _cairo_pattern cairo_pattern_t;
 typedef cairo_pattern_t* PlatformGradient;
 #elif USE(CAIRO)
 typedef struct _cairo_pattern cairo_pattern_t;
 typedef cairo_pattern_t* PlatformGradient;
-#elif USE(SKIA)
-class SkShader;
-typedef class SkShader* PlatformGradient;
-typedef class SkShader* PlatformPattern;
-#elif PLATFORM(WX)
-class wxGraphicsBrush;
-typedef wxGraphicsBrush* PlatformGradient;
 #else
 typedef void* PlatformGradient;
 #endif
 #else
 typedef void* PlatformGradient;
 #endif
@@ -71,24 +52,25 @@ typedef void* PlatformGradient;
 namespace WebCore {
 
     class Color;
 namespace WebCore {
 
     class Color;
+    class FloatRect;
+    class GraphicsContext;
 
 
-    class Gradient : public Generator {
+    class Gradient : public RefCounted<Gradient> {
     public:
     public:
-        static PassRefPtr<Gradient> create(const FloatPoint& p0, const FloatPoint& p1)
+        static Ref<Gradient> create(const FloatPoint& p0, const FloatPoint& p1)
         {
         {
-            return adoptRef(new Gradient(p0, p1));
+            return adoptRef(*new Gradient(p0, p1));
         }
         }
-        static PassRefPtr<Gradient> create(const FloatPoint& p0, float r0, const FloatPoint& p1, float r1, float aspectRatio = 1)
+        static Ref<Gradient> create(const FloatPoint& p0, float r0, const FloatPoint& p1, float r1, float aspectRatio = 1)
         {
         {
-            return adoptRef(new Gradient(p0, r0, p1, r1, aspectRatio));
+            return adoptRef(*new Gradient(p0, r0, p1, r1, aspectRatio));
         }
         }
-        virtual ~Gradient();
+        WEBCORE_EXPORT ~Gradient();
 
         struct ColorStop;
 
         struct ColorStop;
-        void addColorStop(const ColorStop&);
-        void addColorStop(float, const Color&);
+        WEBCORE_EXPORT void addColorStop(const ColorStop&);
+        WEBCORE_EXPORT void addColorStop(float, const Color&);
 
 
-        void getColor(float value, float* r, float* g, float* b, float* a) const;
         bool hasAlpha() const;
 
         bool isRadial() const { return m_radial; }
         bool hasAlpha() const;
 
         bool isRadial() const { return m_radial; }
@@ -97,18 +79,52 @@ namespace WebCore {
         const FloatPoint& p0() const { return m_p0; }
         const FloatPoint& p1() const { return m_p1; }
 
         const FloatPoint& p0() const { return m_p0; }
         const FloatPoint& p1() const { return m_p1; }
 
-        void setP0(const FloatPoint& p) { m_p0 = p; }
-        void setP1(const FloatPoint& p) { m_p1 = p; }
+        void setP0(const FloatPoint& p)
+        {
+            if (m_p0 == p)
+                return;
+            
+            m_p0 = p;
+            
+            invalidateHash();
+        }
+        
+        void setP1(const FloatPoint& p)
+        {
+            if (m_p1 == p)
+                return;
+            
+            m_p1 = p;
+            
+            invalidateHash();
+        }
 
         float startRadius() const { return m_r0; }
         float endRadius() const { return m_r1; }
 
 
         float startRadius() const { return m_r0; }
         float endRadius() const { return m_r1; }
 
-        void setStartRadius(float r) { m_r0 = r; }
-        void setEndRadius(float r) { m_r1 = r; }
-        
+        void setStartRadius(float r)
+        {
+            if (m_r0 == r)
+                return;
+
+            m_r0 = r;
+
+            invalidateHash();
+        }
+
+        void setEndRadius(float r)
+        {
+            if (m_r1 == r)
+                return;
+
+            m_r1 = r;
+
+            invalidateHash();
+        }
+
         float aspectRatio() const { return m_aspectRatio; }
 
         float aspectRatio() const { return m_aspectRatio; }
 
-#if OS(WINCE) && !PLATFORM(QT)
+#if USE(WINGDI)
         const Vector<ColorStop, 2>& getStops() const;
 #else
         PlatformGradient platformGradient();
         const Vector<ColorStop, 2>& getStops() const;
 #else
         PlatformGradient platformGradient();
@@ -133,11 +149,14 @@ namespace WebCore {
         // Qt and CG transform the gradient at draw time
         AffineTransform gradientSpaceTransform() { return m_gradientSpaceTransformation; }
 
         // Qt and CG transform the gradient at draw time
         AffineTransform gradientSpaceTransform() { return m_gradientSpaceTransformation; }
 
-        virtual void fill(GraphicsContext*, const FloatRect&);
-        virtual void adjustParametersForTiledDrawing(IntSize& size, FloatRect& srcRect);
+        void fill(GraphicsContext*, const FloatRect&);
+        void adjustParametersForTiledDrawing(FloatSize&, FloatRect&);
 
         void setPlatformGradientSpaceTransform(const AffineTransform& gradientSpaceTransformation);
 
 
         void setPlatformGradientSpaceTransform(const AffineTransform& gradientSpaceTransformation);
 
+        unsigned hash() const;
+        void invalidateHash() { m_cachedHash = 0; }
+
 #if USE(CG)
         void paint(CGContextRef);
         void paint(GraphicsContext*);
 #if USE(CG)
         void paint(CGContextRef);
         void paint(GraphicsContext*);
@@ -146,15 +165,15 @@ namespace WebCore {
 #endif
 
     private:
 #endif
 
     private:
-        Gradient(const FloatPoint& p0, const FloatPoint& p1);
+        WEBCORE_EXPORT Gradient(const FloatPoint& p0, const FloatPoint& p1);
         Gradient(const FloatPoint& p0, float r0, const FloatPoint& p1, float r1, float aspectRatio);
 
         void platformInit() { m_gradient = 0; }
         void platformDestroy();
 
         Gradient(const FloatPoint& p0, float r0, const FloatPoint& p1, float r1, float aspectRatio);
 
         void platformInit() { m_gradient = 0; }
         void platformDestroy();
 
-        int findStop(float value) const;
         void sortStopsIfNecessary();
 
         void sortStopsIfNecessary();
 
+        // Keep any parameters relevant to rendering in sync with the structure in Gradient::hash().
         bool m_radial;
         FloatPoint m_p0;
         FloatPoint m_p1;
         bool m_radial;
         FloatPoint m_p0;
         FloatPoint m_p1;
@@ -163,10 +182,11 @@ namespace WebCore {
         float m_aspectRatio; // For elliptical gradient, width / height.
         mutable Vector<ColorStop, 2> m_stops;
         mutable bool m_stopsSorted;
         float m_aspectRatio; // For elliptical gradient, width / height.
         mutable Vector<ColorStop, 2> m_stops;
         mutable bool m_stopsSorted;
-        mutable int m_lastStop;
         GradientSpreadMethod m_spreadMethod;
         AffineTransform m_gradientSpaceTransformation;
 
         GradientSpreadMethod m_spreadMethod;
         AffineTransform m_gradientSpaceTransformation;
 
+        mutable unsigned m_cachedHash;
+
         PlatformGradient m_gradient;
 
 #if USE(CAIRO)
         PlatformGradient m_gradient;
 
 #if USE(CAIRO)