Reviewed by Eric.
authordarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 3 May 2006 21:15:33 +0000 (21:15 +0000)
committerdarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 3 May 2006 21:15:33 +0000 (21:15 +0000)
        - http://bugzilla.opendarwin.org/show_bug.cgi?id=8696
          another round of GraphicsContext improvements

        * WebCore.xcodeproj/project.pbxproj: Added GraphicsContextCG.cpp.
        * html/CanvasRenderingContext2D.cpp:
        (WebCore::CanvasRenderingContext2D::scale): Use new GraphicsContext function.
        (WebCore::CanvasRenderingContext2D::rotate): Ditto.
        (WebCore::CanvasRenderingContext2D::translate): Ditto.
        * kwq/KWQComboBox.mm: Added include (not sure if this is needed for this patch,
        but it's needed for one of my upcoming ones).

        * platform/GraphicsContext.h: Changed fillColor and setFillColor to use Color
        instead of RGBA32. Removed setColorFromFillColor and setColorFromPen. Added
        scale, rotate, and translate functions.
        * platform/GraphicsContext.cpp:
        (WebCore::GraphicsContext::setFillColor): Changed to use Color instead of RGBA32.
        (WebCore::GraphicsContext::fillColor): Ditto.

        * platform/GraphicsTypes.h: Moved HorizontalAlignment here.
        * platform/Widget.h: Removed HorizontalAlignment from here.

        * platform/cg/GraphicsContextCG.cpp: Added. Started as a copy of GraphicsContextMac.mm.
        (WebCore::GraphicsContext::drawRect): Rewrote to not rely on [NSGraphicsContext currentContext].
        (WebCore::GraphicsContext::drawLine): Ditto.
        (WebCore::GraphicsContext::drawEllipse): Ditto.
        (WebCore::GraphicsContext::drawArc): Ditto.
        (WebCore::GraphicsContext::drawConvexPolygon): Ditto.
        (WebCore::GraphicsContext::fillRect): Ditto.
        (WebCore::GraphicsContext::setLineWidth):  Added check of paintingDisabled().
        (WebCore::GraphicsContext::setMiterLimit): Ditto.
        (WebCore::GraphicsContext::setAlpha): Ditto.
        (WebCore::GraphicsContext::clearRect): Ditto.
        (WebCore::GraphicsContext::strokeRect): Ditto.
        (WebCore::GraphicsContext::setLineCap): Ditto.
        (WebCore::GraphicsContext::setLineJoin): Ditto.
        (WebCore::GraphicsContext::clip): Ditto.
        (WebCore::GraphicsContext::scale): Added.
        (WebCore::GraphicsContext::rotate): Added.
        (WebCore::GraphicsContext::translate): Added.

        * platform/mac/GraphicsContextMac.mm: Moved most of this file into GraphicsContextCG.cpp.
        (WebCore::GraphicsContext::setCompositeOperation): Added check of paintingDisabled().

        * platform/mac/WebCoreSystemInterface.h: Added declarations so this header
        stands alone.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@14174 268f45cc-cd09-0410-ab3c-d52691b4dbfc

13 files changed:
WebCore/ChangeLog
WebCore/WebCore.xcodeproj/project.pbxproj
WebCore/html/CanvasRenderingContext2D.cpp
WebCore/kwq/KWQComboBox.mm
WebCore/kwq/KWQLineEdit.h
WebCore/kwq/KWQTextEdit.h
WebCore/platform/GraphicsContext.cpp
WebCore/platform/GraphicsContext.h
WebCore/platform/GraphicsTypes.h
WebCore/platform/Widget.h
WebCore/platform/cg/GraphicsContextCG.cpp [new file with mode: 0644]
WebCore/platform/mac/GraphicsContextMac.mm
WebCore/platform/mac/WebCoreSystemInterface.h

index 9fff87a..c7a1bf7 100644 (file)
@@ -1,5 +1,55 @@
 2006-05-03  Darin Adler  <darin@apple.com>
 
+        Reviewed by Eric.
+
+        - http://bugzilla.opendarwin.org/show_bug.cgi?id=8696
+          another round of GraphicsContext improvements
+
+        * WebCore.xcodeproj/project.pbxproj: Added GraphicsContextCG.cpp.
+        * html/CanvasRenderingContext2D.cpp:
+        (WebCore::CanvasRenderingContext2D::scale): Use new GraphicsContext function.
+        (WebCore::CanvasRenderingContext2D::rotate): Ditto.
+        (WebCore::CanvasRenderingContext2D::translate): Ditto.
+        * kwq/KWQComboBox.mm: Added include (not sure if this is needed for this patch,
+        but it's needed for one of my upcoming ones).
+
+        * platform/GraphicsContext.h: Changed fillColor and setFillColor to use Color
+        instead of RGBA32. Removed setColorFromFillColor and setColorFromPen. Added
+        scale, rotate, and translate functions.
+        * platform/GraphicsContext.cpp:
+        (WebCore::GraphicsContext::setFillColor): Changed to use Color instead of RGBA32.
+        (WebCore::GraphicsContext::fillColor): Ditto.
+
+        * platform/GraphicsTypes.h: Moved HorizontalAlignment here.
+        * platform/Widget.h: Removed HorizontalAlignment from here.
+
+        * platform/cg/GraphicsContextCG.cpp: Added. Started as a copy of GraphicsContextMac.mm.
+        (WebCore::GraphicsContext::drawRect): Rewrote to not rely on [NSGraphicsContext currentContext].
+        (WebCore::GraphicsContext::drawLine): Ditto.
+        (WebCore::GraphicsContext::drawEllipse): Ditto.
+        (WebCore::GraphicsContext::drawArc): Ditto.
+        (WebCore::GraphicsContext::drawConvexPolygon): Ditto.
+        (WebCore::GraphicsContext::fillRect): Ditto.
+        (WebCore::GraphicsContext::setLineWidth):  Added check of paintingDisabled(). 
+        (WebCore::GraphicsContext::setMiterLimit): Ditto.
+        (WebCore::GraphicsContext::setAlpha): Ditto.
+        (WebCore::GraphicsContext::clearRect): Ditto.
+        (WebCore::GraphicsContext::strokeRect): Ditto.
+        (WebCore::GraphicsContext::setLineCap): Ditto.
+        (WebCore::GraphicsContext::setLineJoin): Ditto.
+        (WebCore::GraphicsContext::clip): Ditto.
+        (WebCore::GraphicsContext::scale): Added.
+        (WebCore::GraphicsContext::rotate): Added.
+        (WebCore::GraphicsContext::translate): Added.
+
+        * platform/mac/GraphicsContextMac.mm: Moved most of this file into GraphicsContextCG.cpp.
+        (WebCore::GraphicsContext::setCompositeOperation): Added check of paintingDisabled().
+
+        * platform/mac/WebCoreSystemInterface.h: Added declarations so this header
+        stands alone.
+
+2006-05-03  Darin Adler  <darin@apple.com>
+
         Reviewed by Justin.
 
         - fix http://bugzilla.opendarwin.org/show_bug.cgi?id=8159
index 360366b..8ba8034 100644 (file)
                935FBC4509BA00B900E230B1 /* EventListener.h in Headers */ = {isa = PBXBuildFile; fileRef = 935FBC4409BA00B900E230B1 /* EventListener.h */; };
                935FBCF209BA143B00E230B1 /* ExceptionCode.h in Headers */ = {isa = PBXBuildFile; fileRef = 935FBCF109BA143B00E230B1 /* ExceptionCode.h */; };
                936B424E09A436CD00BAA820 /* SVGCSSParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A8C0F6F6089701F100BA5114 /* SVGCSSParser.cpp */; };
+               936BDD1D0A031AEB004DF4AB /* GraphicsContextCG.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 936BDD1C0A031AEB004DF4AB /* GraphicsContextCG.cpp */; };
                9380F47309A11AB4001FDB34 /* Widget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9380F47109A11AB4001FDB34 /* Widget.cpp */; };
                9380F47409A11AB4001FDB34 /* Widget.h in Headers */ = {isa = PBXBuildFile; fileRef = 9380F47209A11AB4001FDB34 /* Widget.h */; };
                9380F47809A11ACC001FDB34 /* WidgetMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9380F47709A11ACC001FDB34 /* WidgetMac.mm */; };
                935C477409AC4D8D00A6AAB4 /* GapRects.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GapRects.h; sourceTree = "<group>"; };
                935FBC4409BA00B900E230B1 /* EventListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EventListener.h; sourceTree = "<group>"; };
                935FBCF109BA143B00E230B1 /* ExceptionCode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ExceptionCode.h; sourceTree = "<group>"; };
+               936BDD1C0A031AEB004DF4AB /* GraphicsContextCG.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GraphicsContextCG.cpp; sourceTree = "<group>"; };
                936DD03A09CEAC270056AE8C /* Range.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Range.idl; sourceTree = "<group>"; };
                9380F47109A11AB4001FDB34 /* Widget.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = Widget.cpp; sourceTree = "<group>"; };
                9380F47209A11AB4001FDB34 /* Widget.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = Widget.h; sourceTree = "<group>"; };
                93032CCC09AEC36200F82A18 /* cg */ = {
                        isa = PBXGroup;
                        children = (
+                               936BDD1C0A031AEB004DF4AB /* GraphicsContextCG.cpp */,
                                93032CC709AEC34300F82A18 /* PathCG.cpp */,
                        );
                        path = cg;
                                BCFE8E320A02A1D30009E61D /* WebCoreTextRenderer.mm in Sources */,
                                14DC0D3709FED073007B0235 /* JSNode.cpp in Sources */,
                                142011B60A003133008303F9 /* JSCSSStyleDeclaration.cpp in Sources */,
+                               936BDD1D0A031AEB004DF4AB /* GraphicsContextCG.cpp in Sources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
index e4407fb..17b0bc7 100644 (file)
@@ -273,10 +273,7 @@ void CanvasRenderingContext2D::scale(float sx, float sy)
     GraphicsContext* c = drawingContext();
     if (!c)
         return;
-    // FIXME: Do this through platform-independent GraphicsContext API.
-#if __APPLE__
-    CGContextScaleCTM(c->platformContext(), sx, sy);
-#endif
+    c->scale(FloatSize(sx, sy));
 }
 
 void CanvasRenderingContext2D::rotate(float angleInRadians)
@@ -284,10 +281,7 @@ void CanvasRenderingContext2D::rotate(float angleInRadians)
     GraphicsContext* c = drawingContext();
     if (!c)
         return;
-    // FIXME: Do this through platform-independent GraphicsContext API.
-#if __APPLE__
-    CGContextRotateCTM(c->platformContext(), angleInRadians);
-#endif
+    c->rotate(angleInRadians);
 }
 
 void CanvasRenderingContext2D::translate(float tx, float ty)
@@ -295,10 +289,7 @@ void CanvasRenderingContext2D::translate(float tx, float ty)
     GraphicsContext* c = drawingContext();
     if (!c)
         return;
-    // FIXME: Do this through platform-independent GraphicsContext API.
-#if __APPLE__
-    CGContextTranslateCTM(c->platformContext(), tx, ty);
-#endif
+    c->translate(FloatSize(tx, ty));
 }
 
 void CanvasRenderingContext2D::setStrokeColor(const String& color)
index 5148543..c554575 100644 (file)
@@ -29,6 +29,7 @@
 #import "BlockExceptions.h"
 #import "FoundationExtras.h"
 #import "FrameMac.h"
+#import "KWQLineEdit.h"
 #import "WebCoreFrameBridge.h"
 #import "WebTextRenderer.h"
 #import "WebTextRendererFactory.h"
index 4eba5b3..211e003 100644 (file)
@@ -26,6 +26,7 @@
 #ifndef QLineEdit_H
 #define QLineEdit_H
 
+#include "GraphicsTypes.h"
 #include "PlatformString.h"
 #include "TextDirection.h"
 #include "Widget.h"
index 660b8ed..4a6a2d2 100644 (file)
@@ -26,6 +26,7 @@
 #ifndef QTEXTEDIT_H_
 #define QTEXTEDIT_H_
 
+#include "GraphicsTypes.h"
 #include "ScrollView.h"
 #include "TextDirection.h"
 
index 941ff46..825a8b0 100644 (file)
 #include "config.h"
 #include "GraphicsContext.h"
 
-#include "FloatRect.h"
 #include "Font.h"
-#include "IntRect.h"
-#include "Widget.h"
 
 using namespace std;
 
@@ -39,7 +36,7 @@ struct GraphicsContextState {
     GraphicsContextState() : fillColor(Color::black), paintingDisabled(false) { }
     Font font;
     Pen pen;
-    RGBA32 fillColor;
+    Color fillColor;
     bool paintingDisabled;
 };
         
@@ -133,12 +130,12 @@ void GraphicsContext::setPen(RGBA32 rgb)
     m_common->state.pen.setWidth(0);
 }
 
-void GraphicsContext::setFillColor(RGBA32 color)
+void GraphicsContext::setFillColor(const Color& color)
 {
     m_common->state.fillColor = color;
 }
 
-const RGBA32 GraphicsContext::fillColor() const
+Color GraphicsContext::fillColor() const
 {
     return m_common->state.fillColor;
 }
index 38d85a7..8552ced 100644 (file)
@@ -73,8 +73,8 @@ namespace WebCore {
         void setPen(Pen::PenStyle);
         void setPen(RGBA32);
         
-        const RGBA32 fillColor() const;
-        void setFillColor(RGBA32);
+        Color fillColor() const;
+        void setFillColor(const Color&);
 
         void save();
         void restore();
@@ -150,6 +150,10 @@ namespace WebCore {
 
         void clip(const Path&);
 
+        void scale(const FloatSize&);
+        void rotate(float angleInRadians);
+        void translate(const FloatSize&);
+
 #if SVG_SUPPORT
         KRenderingDeviceContext* createRenderingDeviceContext();
 #endif
@@ -159,19 +163,16 @@ namespace WebCore {
 #endif
 
     private:
-        void setColorFromFillColor();
-        void setColorFromPen();
-        
         void savePlatformState();
         void restorePlatformState();
-        
+
         int focusRingWidth() const;
         int focusRingOffset() const;
         const Vector<IntRect>& focusRingRects() const;
-        
+
         static GraphicsContextPrivate* createGraphicsContextPrivate();
         static void destroyGraphicsContextPrivate(GraphicsContextPrivate*);
-        
+
         GraphicsContextPrivate* m_common;
         GraphicsContextPlatformPrivate* m_data;
     };
index 1393b09..10bbc64 100644 (file)
@@ -54,6 +54,8 @@ namespace WebCore {
 
     enum LineJoin { MiterJoin, RoundJoin, BevelJoin };
 
+    enum HorizontalAlignment { AlignLeft, AlignRight, AlignHCenter };
+
     String compositeOperatorName(CompositeOperator);
     bool parseCompositeOperator(const String&, CompositeOperator&);
 
index 8fc94be..8e4c82c 100644 (file)
@@ -53,8 +53,6 @@ namespace WebCore {
     class WidgetClient;
     class WidgetPrivate;
 
-    enum HorizontalAlignment { AlignLeft, AlignRight, AlignHCenter };
-
     class Widget {
     public:
 
diff --git a/WebCore/platform/cg/GraphicsContextCG.cpp b/WebCore/platform/cg/GraphicsContextCG.cpp
new file mode 100644 (file)
index 0000000..c427525
--- /dev/null
@@ -0,0 +1,518 @@
+/*
+ * Copyright (C) 2003, 2004, 2005, 2006 Apple Computer, Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    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
+ * 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
+ * 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
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include "config.h"
+#include "GraphicsContext.h"
+
+#include "IntPointArray.h"
+#include "KRenderingDeviceQuartz.h"
+#include "Path.h"
+
+using namespace std;
+
+namespace WebCore {
+
+// NSColor, NSBezierPath, and NSGraphicsContext
+// calls in this file are all exception-safe, so we don't block
+// exceptions for those.
+
+void GraphicsContext::savePlatformState()
+{
+    CGContextSaveGState(platformContext());
+}
+
+void GraphicsContext::restorePlatformState()
+{
+    CGContextRestoreGState(platformContext());
+}
+
+// Draws a filled rectangle with a stroked border.
+void GraphicsContext::drawRect(const IntRect& rect)
+{
+    if (paintingDisabled())
+        return;
+
+    CGContextRef context = platformContext();
+
+    if (fillColor().alpha()) {
+        CGContextSetFillColorWithColor(context, cgColor(fillColor()));
+        CGContextFillRect(context, rect);
+    }
+
+    if (pen().style() != Pen::Pen::NoPen) {
+        CGContextSetFillColorWithColor(context, cgColor(pen().color()));
+        CGRect rects[4] = {
+            FloatRect(rect.x(), rect.y(), rect.width(), 1),
+            FloatRect(rect.x(), rect.bottom() - 1, rect.width(), 1),
+            FloatRect(rect.x(), rect.y() + 1, 1, rect.height() - 2),
+            FloatRect(rect.right() - 1, rect.y() + 1, 1, rect.height() - 2)
+        };
+        CGContextFillRects(context, rects, 4);
+    }
+}
+
+// This is only used to draw borders.
+void GraphicsContext::drawLine(const IntPoint& point1, const IntPoint& point2)
+{
+    if (paintingDisabled())
+        return;
+
+    Pen::PenStyle penStyle = pen().style();
+    if (penStyle == Pen::Pen::NoPen)
+        return;
+    float width = pen().width();
+    if (width < 1)
+        width = 1;
+
+    FloatPoint p1 = point1;
+    FloatPoint p2 = point2;
+    bool isVerticalLine = (p1.x() == p2.x());
+    
+    // For odd widths, we add in 0.5 to the appropriate x/y so that the float arithmetic
+    // works out.  For example, with a border width of 3, KHTML will pass us (y1+y2)/2, e.g.,
+    // (50+53)/2 = 103/2 = 51 when we want 51.5.  It is always true that an even width gave
+    // us a perfect position, but an odd width gave us a position that is off by exactly 0.5.
+    if (penStyle == Pen::DotLine || penStyle == Pen::DashLine) {
+        if (isVerticalLine) {
+            p1.move(0, width);
+            p2.move(0, -width);
+        } else {
+            p1.move(width, 0);
+            p2.move(-width, 0);
+        }
+    }
+    
+    if (((int)width) % 2) {
+        if (isVerticalLine) {
+            // We're a vertical line.  Adjust our x.
+            p1.move(0.5, 0);
+            p2.move(0.5, 0);
+        } else {
+            // We're a horizontal line. Adjust our y.
+            p1.move(0, 0.5);
+            p2.move(0, 0.5);
+        }
+    }
+    
+    int patWidth = 0;
+    switch (penStyle) {
+        case Pen::NoPen:
+        case Pen::SolidLine:
+            break;
+        case Pen::DotLine:
+            patWidth = (int)width;
+            break;
+        case Pen::DashLine:
+            patWidth = 3 * (int)width;
+            break;
+    }
+
+    CGContextRef context = platformContext();
+
+    CGContextSaveGState(context);
+
+    CGColorRef colorRef = cgColor(pen().color());
+    CGContextSetFillColorWithColor(context, colorRef);
+    CGContextSetStrokeColorWithColor(context, colorRef);
+
+    CGContextSetShouldAntialias(context, false);
+    
+    if (patWidth) {
+        // Do a rect fill of our endpoints.  This ensures we always have the
+        // appearance of being a border.  We then draw the actual dotted/dashed line.
+        if (isVerticalLine) {
+            CGContextFillRect(context, FloatRect(p1.x() - width / 2, p1.y() - width, width, width));
+            CGContextFillRect(context, FloatRect(p2.x() - width / 2, p2.y(), width, width));
+        } else {
+            CGContextFillRect(context, FloatRect(p1.x() - width, p1.y() - width / 2, width, width));
+            CGContextFillRect(context, FloatRect(p2.x(), p2.y() - width / 2, width, width));
+        }
+
+        // Example: 80 pixels with a width of 30 pixels.
+        // Remainder is 20.  The maximum pixels of line we could paint
+        // will be 50 pixels.
+        int distance = (isVerticalLine ? (point2.y() - point1.y()) : (point2.x() - point1.x())) - 2*(int)width;
+        int remainder = distance % patWidth;
+        int coverage = distance - remainder;
+        int numSegments = coverage / patWidth;
+
+        float patternOffset = 0;
+        // Special case 1px dotted borders for speed.
+        if (patWidth == 1)
+            patternOffset = 1.0;
+        else {
+            bool evenNumberOfSegments = numSegments % 2 == 0;
+            if (remainder)
+                evenNumberOfSegments = !evenNumberOfSegments;
+            if (evenNumberOfSegments) {
+                if (remainder) {
+                    patternOffset += patWidth - remainder;
+                    patternOffset += remainder / 2;
+                } else
+                    patternOffset = patWidth / 2;
+            } else {
+                if (remainder)
+                    patternOffset = (patWidth - remainder)/2;
+            }
+        }
+        
+        const CGFloat dottedLine[2] = { patWidth, patWidth };
+        CGContextSetLineDash(context, patternOffset, dottedLine, 2);
+    }
+    
+    CGContextSetLineWidth(context, width);
+
+    CGContextBeginPath(context);
+    CGContextMoveToPoint(context, p1.x(), p1.y());
+    CGContextAddLineToPoint(context, p2.x(), p2.y());
+
+    CGContextStrokePath(context);
+
+    CGContextRestoreGState(context);
+}
+
+// This method is only used to draw the little circles used in lists.
+void GraphicsContext::drawEllipse(const IntRect& rect)
+{
+    // FIXME: CG added CGContextAddEllipseinRect in Tiger, so we should be able to quite easily draw an ellipse.
+    // This code can only handle circles, not ellipses. But khtml only
+    // uses it for circles.
+    ASSERT(rect.width() == rect.height());
+
+    if (paintingDisabled())
+        return;
+        
+    CGContextRef context = platformContext();
+    CGContextBeginPath(context);
+    float r = (float)rect.width() / 2;
+    CGContextAddArc(context, rect.x() + r, rect.y() + r, r, 0, 2*M_PI, true);
+    CGContextClosePath(context);
+
+    if (fillColor().alpha()) {
+        CGContextSetFillColorWithColor(context, cgColor(fillColor()));
+        if (pen().style() != Pen::NoPen) {
+            // stroke and fill
+            CGContextSetStrokeColorWithColor(context, cgColor(pen().color()));
+            unsigned penWidth = pen().width();
+            if (penWidth == 0) 
+                penWidth++;
+            CGContextSetLineWidth(context, penWidth);
+            CGContextDrawPath(context, kCGPathFillStroke);
+        } else
+            CGContextFillPath(context);
+    } else if (pen().style() != Pen::NoPen) {
+        CGContextSetStrokeColorWithColor(context, cgColor(pen().color()));
+        unsigned penWidth = pen().width();
+        if (penWidth == 0) 
+            penWidth++;
+        CGContextSetLineWidth(context, penWidth);
+        CGContextStrokePath(context);
+    }
+}
+
+
+void GraphicsContext::drawArc(int x, int y, int w, int h, int a, int alen)
+{ 
+    // Only supports arc on circles.  That's all khtml needs.
+    ASSERT(w == h);
+
+    if (paintingDisabled())
+        return;
+    
+    if (pen().style() != Pen::NoPen) {
+        CGContextRef context = platformContext();
+        CGContextBeginPath(context);
+        
+        float r = (float)w / 2;
+        float fa = (float)a / 16;
+        float falen =  fa + (float)alen / 16;
+        CGContextAddArc(context, x + r, y + r, r, -fa * M_PI/180, -falen * M_PI/180, true);
+        
+        CGContextSetStrokeColorWithColor(context, cgColor(pen().color()));
+        CGContextSetLineWidth(context, pen().width());
+        CGContextStrokePath(context);
+    }
+}
+
+void GraphicsContext::drawConvexPolygon(const IntPointArray& points)
+{
+    if (paintingDisabled())
+        return;
+
+    int npoints = points.size();
+    if (npoints <= 1)
+        return;
+
+    CGContextRef context = platformContext();
+
+    CGContextSaveGState(context);
+
+    CGContextSetShouldAntialias(context, false);
+    
+    CGContextBeginPath(context);
+    CGContextMoveToPoint(context, points[0].x(), points[0].y());
+    for (int i = 1; i < npoints; i++)
+        CGContextAddLineToPoint(context, points[i].x(), points[i].y());
+    CGContextClosePath(context);
+
+    if (fillColor().alpha()) {
+        CGContextSetFillColorWithColor(context, cgColor(fillColor()));
+        CGContextEOFillPath(context);
+    }
+
+    if (pen().style() != Pen::NoPen) {
+        CGContextSetStrokeColorWithColor(context, cgColor(pen().color()));
+        CGContextSetLineWidth(context, pen().width());
+        CGContextStrokePath(context);
+    }
+
+    CGContextRestoreGState(context);
+}
+
+void GraphicsContext::fillRect(const IntRect& rect, const Color& color)
+{
+    if (paintingDisabled())
+        return;
+    if (color.alpha()) {
+        CGContextRef context = platformContext();
+        CGContextSetFillColorWithColor(context, cgColor(color));
+        CGContextFillRect(context, rect);
+    }
+}
+
+void GraphicsContext::addClip(const IntRect& rect)
+{
+    if (paintingDisabled())
+        return;
+    CGContextClipToRect(platformContext(), rect);
+}
+
+void GraphicsContext::addRoundedRectClip(const IntRect& rect, const IntSize& topLeft, const IntSize& topRight,
+    const IntSize& bottomLeft, const IntSize& bottomRight)
+{
+    if (paintingDisabled())
+        return;
+
+    // Need sufficient width and height to contain these curves.  Sanity check our top/bottom
+    // values and our width/height values to make sure the curves can all fit.
+    int requiredWidth = max(topLeft.width() + topRight.width(), bottomLeft.width() + bottomRight.width());
+    if (requiredWidth > rect.width())
+        return;
+    int requiredHeight = max(topLeft.height() + bottomLeft.height(), topRight.height() + bottomRight.height());
+    if (requiredHeight > rect.height())
+        return;
+    // Clip to our rect.
+    addClip(rect);
+
+    // OK, the curves can fit.
+    CGContextRef context = platformContext();
+    
+    // Add the four ellipses to the path.  Technically this really isn't good enough, since we could end up
+    // not clipping the other 3/4 of the ellipse we don't care about.  We're relying on the fact that for
+    // normal use cases these ellipses won't overlap one another (or when they do the curvature of one will
+    // be subsumed by the other).
+    CGContextAddEllipseInRect(context, CGRectMake(rect.x(), rect.y(), topLeft.width() * 2, topLeft.height() * 2));
+    CGContextAddEllipseInRect(context, CGRectMake(rect.right() - topRight.width() * 2, rect.y(),
+                                                  topRight.width() * 2, topRight.height() * 2));
+    CGContextAddEllipseInRect(context, CGRectMake(rect.x(), rect.bottom() - bottomLeft.height() * 2,
+                                                  bottomLeft.width() * 2, bottomLeft.height() * 2));
+    CGContextAddEllipseInRect(context, CGRectMake(rect.right() - bottomRight.width() * 2,
+                                                  rect.bottom() - bottomRight.height() * 2,
+                                                  bottomRight.width() * 2, bottomRight.height() * 2));
+    
+    // Now add five rects (one for each edge rect in between the rounded corners and one for the interior).
+    CGContextAddRect(context, CGRectMake(rect.x() + topLeft.width(), rect.y(),
+                                         rect.width() - topLeft.width() - topRight.width(),
+                                         max(topLeft.height(), topRight.height())));
+    CGContextAddRect(context, CGRectMake(rect.x() + bottomLeft.width(), 
+                                         rect.bottom() - max(bottomLeft.height(), bottomRight.height()),
+                                         rect.width() - bottomLeft.width() - bottomRight.width(),
+                                         max(bottomLeft.height(), bottomRight.height())));
+    CGContextAddRect(context, CGRectMake(rect.x(), rect.y() + topLeft.height(),
+                                         max(topLeft.width(), bottomLeft.width()), rect.height() - topLeft.height() - bottomLeft.height()));
+    CGContextAddRect(context, CGRectMake(rect.right() - max(topRight.width(), bottomRight.width()),
+                                         rect.y() + topRight.height(),
+                                         max(topRight.width(), bottomRight.width()), rect.height() - topRight.height() - bottomRight.height()));
+    CGContextAddRect(context, CGRectMake(rect.x() + max(topLeft.width(), bottomLeft.width()),
+                                         rect.y() + max(topLeft.height(), topRight.height()),
+                                         rect.width() - max(topLeft.width(), bottomLeft.width()) - max(topRight.width(), bottomRight.width()),
+                                         rect.height() - max(topLeft.height(), topRight.height()) - max(bottomLeft.height(), bottomRight.height())));
+    CGContextClip(context);
+}
+
+#if SVG_SUPPORT
+KRenderingDeviceContext* GraphicsContext::createRenderingDeviceContext()
+{
+    return new KRenderingDeviceContextQuartz(platformContext());
+}
+#endif
+
+void GraphicsContext::beginTransparencyLayer(float opacity)
+{
+    if (paintingDisabled())
+        return;
+    CGContextRef context = platformContext();
+    CGContextSaveGState(context);
+    CGContextSetAlpha(context, opacity);
+    CGContextBeginTransparencyLayer(context, 0);
+}
+
+void GraphicsContext::endTransparencyLayer()
+{
+    if (paintingDisabled())
+        return;
+    CGContextRef context = platformContext();
+    CGContextEndTransparencyLayer(context);
+    CGContextRestoreGState(context);
+}
+
+void GraphicsContext::setShadow(const IntSize& size, int blur, const Color& color)
+{
+    if (paintingDisabled())
+        return;
+    // Check for an invalid color, as this means that the color was not set for the shadow
+    // and we should therefore just use the default shadow color.
+    CGContextRef context = platformContext();
+    if (!color.isValid())
+        CGContextSetShadow(context, CGSizeMake(size.width(), -size.height()), blur); // y is flipped.
+    else {
+        CGColorRef colorCG = cgColor(color);
+        CGContextSetShadowWithColor(context,
+                                    CGSizeMake(size.width(), -size.height()), // y is flipped.
+                                    blur, 
+                                    colorCG);
+        CGColorRelease(colorCG);
+    }
+}
+
+void GraphicsContext::clearShadow()
+{
+    if (paintingDisabled())
+        return;
+    CGContextSetShadowWithColor(platformContext(), CGSizeZero, 0, NULL);
+}
+
+void GraphicsContext::setLineWidth(float width)
+{
+    if (paintingDisabled())
+        return;
+    CGContextSetLineWidth(platformContext(), width);
+}
+
+void GraphicsContext::setMiterLimit(float limit)
+{
+    if (paintingDisabled())
+        return;
+    CGContextSetMiterLimit(platformContext(), limit);
+}
+
+void GraphicsContext::setAlpha(float alpha)
+{
+    if (paintingDisabled())
+        return;
+    CGContextSetAlpha(platformContext(), alpha);
+}
+
+void GraphicsContext::clearRect(const FloatRect& r)
+{
+    if (paintingDisabled())
+        return;
+    CGContextClearRect(platformContext(), r);
+}
+
+void GraphicsContext::strokeRect(const FloatRect& r, float lineWidth)
+{
+    if (paintingDisabled())
+        return;
+    CGContextStrokeRectWithWidth(platformContext(), r, lineWidth);
+}
+
+void GraphicsContext::setLineCap(LineCap cap)
+{
+    if (paintingDisabled())
+        return;
+    switch (cap) {
+        case ButtCap:
+            CGContextSetLineCap(platformContext(), kCGLineCapButt);
+            break;
+        case RoundCap:
+            CGContextSetLineCap(platformContext(), kCGLineCapRound);
+            break;
+        case SquareCap:
+            CGContextSetLineCap(platformContext(), kCGLineCapSquare);
+            break;
+    }
+}
+
+void GraphicsContext::setLineJoin(LineJoin join)
+{
+    if (paintingDisabled())
+        return;
+    switch (join) {
+        case MiterJoin:
+            CGContextSetLineJoin(platformContext(), kCGLineJoinMiter);
+            break;
+        case RoundJoin:
+            CGContextSetLineJoin(platformContext(), kCGLineJoinRound);
+            break;
+        case BevelJoin:
+            CGContextSetLineJoin(platformContext(), kCGLineJoinBevel);
+            break;
+    }
+}
+
+void GraphicsContext::clip(const Path& path)
+{
+    if (paintingDisabled())
+        return;
+    CGContextRef context = platformContext();
+    CGContextBeginPath(context);
+    CGContextAddPath(context, path.platformPath());
+    CGContextClip(context);
+}
+
+void GraphicsContext::scale(const FloatSize& size)
+{
+    if (paintingDisabled())
+        return;
+    CGContextScaleCTM(platformContext(), size.width(), size.height());
+}
+
+void GraphicsContext::rotate(float angle)
+{
+    if (paintingDisabled())
+        return;
+    CGContextRotateCTM(platformContext(), angle);
+}
+
+void GraphicsContext::translate(const FloatSize& size)
+{
+    if (paintingDisabled())
+        return;
+    CGContextTranslateCTM(platformContext(), size.width(), size.height());
+}
+
+}
index 25ea0a2..2937de7 100644 (file)
 #import "config.h"
 #import "GraphicsContext.h"
 
-#import "BlockExceptions.h"
-#import "FloatRect.h"
-#import "Font.h"
-#import "FoundationExtras.h"
-#import "IntPointArray.h"
-#import "KRenderingDeviceQuartz.h"
-#import "Path.h"
 #import "WebCoreSystemInterface.h"
 
-// FIXME: A lot more of this should use CoreGraphics instead of AppKit.
-// FIXME: A lot more of this should move into GraphicsContextCG.cpp.
-
-using namespace std;
+// FIXME: More of this should use CoreGraphics instead of AppKit.
+// FIXME: More of this should move into GraphicsContextCG.cpp.
 
 namespace WebCore {
 
@@ -55,13 +46,6 @@ public:
     IntRect m_focusRingClip; // Work around CG bug in focus ring clipping.
 };
 
-// A fillRect helper to work around the fact that NSRectFill uses copy mode, not source over.
-static inline void fillRectSourceOver(const FloatRect& rect, const Color& col)
-{
-    [nsColor(col) set];
-    NSRectFillUsingOperation(rect, NSCompositeSourceOver);
-}
-
 GraphicsContextPlatformPrivate::GraphicsContextPlatformPrivate(CGContextRef cgContext)
 {
     m_cgContext = cgContext;
@@ -86,274 +70,6 @@ GraphicsContext::~GraphicsContext()
     delete m_data;
 }
 
-void GraphicsContext::savePlatformState()
-{
-    CGContextSaveGState(platformContext());
-}
-
-void GraphicsContext::restorePlatformState()
-{
-    CGContextRestoreGState(platformContext());
-}
-
-// Draws a filled rectangle with a stroked border.
-void GraphicsContext::drawRect(const IntRect& rect)
-{
-    if (paintingDisabled())
-        return;
-
-    // FIXME: This function currently works only when the current context is the current NSGraphicsContext.
-    ASSERT(platformContext() == [[NSGraphicsContext currentContext] graphicsPort]);
-
-    if (fillColor() & 0xFF000000)
-        fillRectSourceOver(rect, fillColor());
-
-    if (pen().style() != Pen::Pen::NoPen) {
-        setColorFromPen();
-        NSFrameRect(rect);
-    }
-}
-
-void GraphicsContext::setColorFromFillColor()
-{
-    // FIXME: This function currently works only when the current context is the current NSGraphicsContext.
-    ASSERT(platformContext() == [[NSGraphicsContext currentContext] graphicsPort]);
-
-    [nsColor(fillColor()) set];
-}
-  
-void GraphicsContext::setColorFromPen()
-{
-    // FIXME: This function currently works only when the current context is the current NSGraphicsContext.
-    ASSERT(platformContext() == [[NSGraphicsContext currentContext] graphicsPort]);
-
-    [nsColor(pen().color()) set];
-}
-  
-// This is only used to draw borders.
-void GraphicsContext::drawLine(const IntPoint& point1, const IntPoint& point2)
-{
-    if (paintingDisabled())
-        return;
-
-    // FIXME: This function currently works only when the current context is the current NSGraphicsContext.
-    ASSERT(platformContext() == [[NSGraphicsContext currentContext] graphicsPort]);
-
-    Pen::PenStyle penStyle = pen().style();
-    if (penStyle == Pen::Pen::NoPen)
-        return;
-    float width = pen().width();
-    if (width < 1)
-        width = 1;
-
-    NSPoint p1 = point1;
-    NSPoint p2 = point2;
-    bool isVerticalLine = (p1.x == p2.x);
-    
-    // For odd widths, we add in 0.5 to the appropriate x/y so that the float arithmetic
-    // works out.  For example, with a border width of 3, KHTML will pass us (y1+y2)/2, e.g.,
-    // (50+53)/2 = 103/2 = 51 when we want 51.5.  It is always true that an even width gave
-    // us a perfect position, but an odd width gave us a position that is off by exactly 0.5.
-    if (penStyle == Pen::DotLine || penStyle == Pen::DashLine) {
-        if (isVerticalLine) {
-            p1.y += width;
-            p2.y -= width;
-        } else {
-            p1.x += width;
-            p2.x -= width;
-        }
-    }
-    
-    if (((int)width)%2) {
-        if (isVerticalLine) {
-            // We're a vertical line.  Adjust our x.
-            p1.x += 0.5;
-            p2.x += 0.5;
-        } else {
-            // We're a horizontal line. Adjust our y.
-            p1.y += 0.5;
-            p2.y += 0.5;
-        }
-    }
-    
-    NSBezierPath *path = [[NSBezierPath alloc] init];
-    [path setLineWidth:width];
-
-    int patWidth = 0;
-    switch (penStyle) {
-    case Pen::NoPen:
-    case Pen::SolidLine:
-        break;
-    case Pen::DotLine:
-        patWidth = (int)width;
-        break;
-    case Pen::DashLine:
-        patWidth = 3*(int)width;
-        break;
-    }
-
-    CGContextSaveGState(platformContext());
-
-    setColorFromPen();
-
-    CGContextSetShouldAntialias(platformContext(), false);
-    
-    if (patWidth) {
-        // Do a rect fill of our endpoints.  This ensures we always have the
-        // appearance of being a border.  We then draw the actual dotted/dashed line.
-        const Color& penColor = pen().color();
-        if (isVerticalLine) {
-            fillRectSourceOver(FloatRect(p1.x-width/2, p1.y-width, width, width), penColor);
-            fillRectSourceOver(FloatRect(p2.x-width/2, p2.y, width, width), penColor);
-        } else {
-            fillRectSourceOver(FloatRect(p1.x-width, p1.y-width/2, width, width), penColor);
-            fillRectSourceOver(FloatRect(p2.x, p2.y-width/2, width, width), penColor);
-        }
-        
-        // Example: 80 pixels with a width of 30 pixels.
-        // Remainder is 20.  The maximum pixels of line we could paint
-        // will be 50 pixels.
-        int distance = (isVerticalLine ? (point2.y() - point1.y()) : (point2.x() - point1.x())) - 2*(int)width;
-        int remainder = distance%patWidth;
-        int coverage = distance-remainder;
-        int numSegments = coverage/patWidth;
-
-        float patternOffset = 0;
-        // Special case 1px dotted borders for speed.
-        if (patWidth == 1)
-            patternOffset = 1.0;
-        else {
-            bool evenNumberOfSegments = numSegments%2 == 0;
-            if (remainder)
-                evenNumberOfSegments = !evenNumberOfSegments;
-            if (evenNumberOfSegments) {
-                if (remainder) {
-                    patternOffset += patWidth - remainder;
-                    patternOffset += remainder/2;
-                }
-                else
-                    patternOffset = patWidth/2;
-            }
-            else if (!evenNumberOfSegments) {
-                if (remainder)
-                    patternOffset = (patWidth - remainder)/2;
-            }
-        }
-        
-        const CGFloat dottedLine[2] = { patWidth, patWidth };
-        [path setLineDash:dottedLine count:2 phase:patternOffset];
-    }
-    
-    [path moveToPoint:p1];
-    [path lineToPoint:p2];
-
-    [path stroke];
-    
-    [path release];
-
-    CGContextRestoreGState(platformContext());
-}
-
-
-// This method is only used to draw the little circles used in lists.
-void GraphicsContext::drawEllipse(const IntRect& rect)
-{
-    // FIXME: CG added CGContextAddEllipseinRect in Tiger, so we should be able to quite easily draw an ellipse.
-    // This code can only handle circles, not ellipses. But khtml only
-    // uses it for circles.
-    ASSERT(rect.width() == rect.height());
-
-    if (paintingDisabled())
-        return;
-        
-    CGContextRef context = platformContext();
-    CGContextBeginPath(context);
-    float r = (float)rect.width() / 2;
-    CGContextAddArc(context, rect.x() + r, rect.y() + r, r, 0, 2*M_PI, true);
-    CGContextClosePath(context);
-
-    if (fillColor() & 0xFF000000) {
-        setColorFromFillColor();
-        if (pen().style() != Pen::NoPen) {
-            // stroke and fill
-            setColorFromPen();
-            unsigned penWidth = pen().width();
-            if (penWidth == 0) 
-                penWidth++;
-            CGContextSetLineWidth(context, penWidth);
-            CGContextDrawPath(context, kCGPathFillStroke);
-        } else
-            CGContextFillPath(context);
-    }
-    if (pen().style() != Pen::NoPen) {
-        setColorFromPen();
-        unsigned penWidth = pen().width();
-        if (penWidth == 0) 
-            penWidth++;
-        CGContextSetLineWidth(context, penWidth);
-        CGContextStrokePath(context);
-    }
-}
-
-
-void GraphicsContext::drawArc(int x, int y, int w, int h, int a, int alen)
-{ 
-    // Only supports arc on circles.  That's all khtml needs.
-    ASSERT(w == h);
-
-    if (paintingDisabled())
-        return;
-    
-    if (pen().style() != Pen::NoPen) {
-        CGContextRef context = platformContext();
-        CGContextBeginPath(context);
-        
-        float r = (float)w / 2;
-        float fa = (float)a / 16;
-        float falen =  fa + (float)alen / 16;
-        CGContextAddArc(context, x + r, y + r, r, -fa * M_PI/180, -falen * M_PI/180, true);
-        
-        setColorFromPen();
-        CGContextSetLineWidth(context, pen().width());
-        CGContextStrokePath(context);
-    }
-}
-
-void GraphicsContext::drawConvexPolygon(const IntPointArray& points)
-{
-    if (paintingDisabled())
-        return;
-
-    int npoints = points.size();
-    if (npoints <= 1)
-        return;
-
-    CGContextRef context = platformContext();
-
-    CGContextSaveGState(context);
-
-    CGContextSetShouldAntialias(context, false);
-    
-    CGContextBeginPath(context);
-    CGContextMoveToPoint(context, points[0].x(), points[0].y());
-    for (int i = 1; i < npoints; i++)
-        CGContextAddLineToPoint(context, points[i].x(), points[i].y());
-    CGContextClosePath(context);
-
-    if (fillColor() & 0xFF000000) {
-        setColorFromFillColor();
-        CGContextEOFillPath(context);
-    }
-
-    if (pen().style() != Pen::NoPen) {
-        setColorFromPen();
-        CGContextSetLineWidth(context, pen().width());
-        CGContextStrokePath(context);
-    }
-
-    CGContextRestoreGState(context);
-}
-
 static int getBlendedColorComponent(int c, int a)
 {
     // We use white.
@@ -383,80 +99,6 @@ Color GraphicsContext::selectedTextBackgroundColor() const
     return col;
 }
 
-void GraphicsContext::fillRect(const IntRect& rect, const Color& color)
-{
-    if (paintingDisabled())
-        return;
-
-    // FIXME: This function currently works only when the current context is the current NSGraphicsContext.
-    ASSERT(platformContext() == [[NSGraphicsContext currentContext] graphicsPort]);
-
-    if (color.alpha())
-        fillRectSourceOver(rect, color.rgb());
-}
-
-void GraphicsContext::addClip(const IntRect& rect)
-{
-    if (paintingDisabled())
-        return;
-
-    CGContextClipToRect(platformContext(), rect);
-}
-
-void GraphicsContext::addRoundedRectClip(const IntRect& rect, const IntSize& topLeft, const IntSize& topRight,
-    const IntSize& bottomLeft, const IntSize& bottomRight)
-{
-    if (paintingDisabled())
-        return;
-
-    // Need sufficient width and height to contain these curves.  Sanity check our top/bottom
-    // values and our width/height values to make sure the curves can all fit.
-    int requiredWidth = max(topLeft.width() + topRight.width(), bottomLeft.width() + bottomRight.width());
-    if (requiredWidth > rect.width())
-        return;
-    int requiredHeight = max(topLeft.height() + bottomLeft.height(), topRight.height() + bottomRight.height());
-    if (requiredHeight > rect.height())
-        return;
-    // Clip to our rect.
-    addClip(rect);
-
-    // OK, the curves can fit.
-    CGContextRef context = platformContext();
-    
-    // Add the four ellipses to the path.  Technically this really isn't good enough, since we could end up
-    // not clipping the other 3/4 of the ellipse we don't care about.  We're relying on the fact that for
-    // normal use cases these ellipses won't overlap one another (or when they do the curvature of one will
-    // be subsumed by the other).
-    CGContextAddEllipseInRect(context, CGRectMake(rect.x(), rect.y(), topLeft.width() * 2, topLeft.height() * 2));
-    CGContextAddEllipseInRect(context, CGRectMake(rect.right() - topRight.width() * 2, rect.y(),
-                                                  topRight.width() * 2, topRight.height() * 2));
-    CGContextAddEllipseInRect(context, CGRectMake(rect.x(), rect.bottom() - bottomLeft.height() * 2,
-                                                  bottomLeft.width() * 2, bottomLeft.height() * 2));
-    CGContextAddEllipseInRect(context, CGRectMake(rect.right() - bottomRight.width() * 2,
-                                                  rect.bottom() - bottomRight.height() * 2,
-                                                  bottomRight.width() * 2, bottomRight.height() * 2));
-    
-    // Now add five rects (one for each edge rect in between the rounded corners and one for the interior).
-    CGContextAddRect(context, CGRectMake(rect.x() + topLeft.width(), rect.y(),
-                                         rect.width() - topLeft.width() - topRight.width(),
-                                         max(topLeft.height(), topRight.height())));
-    CGContextAddRect(context, CGRectMake(rect.x() + bottomLeft.width(), 
-                                         rect.bottom() - max(bottomLeft.height(), bottomRight.height()),
-                                         rect.width() - bottomLeft.width() - bottomRight.width(),
-                                         max(bottomLeft.height(), bottomRight.height())));
-    CGContextAddRect(context, CGRectMake(rect.x(), rect.y() + topLeft.height(),
-                                         max(topLeft.width(), bottomLeft.width()), rect.height() - topLeft.height() - bottomLeft.height()));
-    CGContextAddRect(context, CGRectMake(rect.right() - max(topRight.width(), bottomRight.width()),
-                                         rect.y() + topRight.height(),
-                                         max(topRight.width(), bottomRight.width()), rect.height() - topRight.height() - bottomRight.height()));
-    CGContextAddRect(context, CGRectMake(rect.x() + max(topLeft.width(), bottomLeft.width()),
-                                         rect.y() + max(topLeft.height(), topRight.height()),
-                                         rect.width() - max(topLeft.width(), bottomLeft.width()) - max(topRight.width(), bottomRight.width()),
-                                         rect.height() - max(topLeft.height(), topRight.height()) - max(bottomLeft.height(), bottomRight.height())));
-    CGContextClip(context);
-}
-
 void GraphicsContext::setFocusRingClip(const IntRect& r)
 {
     // This method only exists to work around bugs in Mac focus ring clipping.
@@ -469,59 +111,6 @@ void GraphicsContext::clearFocusRingClip()
     m_data->m_focusRingClip = IntRect();
 }
 
-#if SVG_SUPPORT
-KRenderingDeviceContext* GraphicsContext::createRenderingDeviceContext()
-{
-    return new KRenderingDeviceContextQuartz(platformContext());
-}
-#endif
-
-void GraphicsContext::beginTransparencyLayer(float opacity)
-{
-    if (paintingDisabled())
-        return;
-    CGContextRef context = platformContext();
-    CGContextSaveGState(context);
-    CGContextSetAlpha(context, opacity);
-    CGContextBeginTransparencyLayer(context, 0);
-}
-
-void GraphicsContext::endTransparencyLayer()
-{
-    if (paintingDisabled())
-        return;
-    CGContextRef context = platformContext();
-    CGContextEndTransparencyLayer(context);
-    CGContextRestoreGState(context);
-}
-
-void GraphicsContext::setShadow(const IntSize& size, int blur, const Color& color)
-{
-    if (paintingDisabled())
-        return;
-    // Check for an invalid color, as this means that the color was not set for the shadow
-    // and we should therefore just use the default shadow color.
-    CGContextRef context = platformContext();
-    if (!color.isValid())
-        CGContextSetShadow(context, CGSizeMake(size.width(), -size.height()), blur); // y is flipped.
-    else {
-        CGColorRef colorCG = cgColor(color);
-        CGContextSetShadowWithColor(context,
-                                    CGSizeMake(size.width(), -size.height()), // y is flipped.
-                                    blur, 
-                                    colorCG);
-        CGColorRelease(colorCG);
-    }
-}
-
-void GraphicsContext::clearShadow()
-{
-    if (paintingDisabled())
-        return;
-    CGContextRef context = platformContext();
-    CGContextSetShadowWithColor(context, CGSizeZero, 0, NULL);
-}
-
 void GraphicsContext::drawFocusRing(const Color& color)
 {
     if (paintingDisabled())
@@ -575,74 +164,14 @@ CGContextRef GraphicsContext::platformContext() const
     return m_data->m_cgContext;
 }
 
-void GraphicsContext::setLineWidth(float width)
-{
-    CGContextSetLineWidth(platformContext(), width);
-}
-
-void GraphicsContext::setMiterLimit(float limit)
-{
-    CGContextSetMiterLimit(platformContext(), limit);
-}
-
-void GraphicsContext::setAlpha(float alpha)
-{
-    CGContextSetAlpha(platformContext(), alpha);
-}
-
 void GraphicsContext::setCompositeOperation(CompositeOperator op)
 {
+    if (paintingDisabled())
+        return;
     NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
     [[NSGraphicsContext graphicsContextWithGraphicsPort:platformContext() flipped:YES]
         setCompositingOperation:(NSCompositingOperation)op];
     [pool release];
 }
 
-void GraphicsContext::clearRect(const FloatRect& r)
-{
-    CGContextClearRect(platformContext(), r);
-}
-
-void GraphicsContext::strokeRect(const FloatRect& r, float lineWidth)
-{
-    CGContextStrokeRectWithWidth(platformContext(), r, lineWidth);
-}
-
-void GraphicsContext::setLineCap(LineCap cap)
-{
-    switch (cap) {
-        case ButtCap:
-            CGContextSetLineCap(platformContext(), kCGLineCapButt);
-            break;
-        case RoundCap:
-            CGContextSetLineCap(platformContext(), kCGLineCapRound);
-            break;
-        case SquareCap:
-            CGContextSetLineCap(platformContext(), kCGLineCapSquare);
-            break;
-    }
-}
-
-void GraphicsContext::setLineJoin(LineJoin join)
-{
-    switch (join) {
-        case MiterJoin:
-            CGContextSetLineJoin(platformContext(), kCGLineJoinMiter);
-            break;
-        case RoundJoin:
-            CGContextSetLineJoin(platformContext(), kCGLineJoinRound);
-            break;
-        case BevelJoin:
-            CGContextSetLineJoin(platformContext(), kCGLineJoinBevel);
-            break;
-    }
-}
-
-void GraphicsContext::clip(const Path& path)
-{
-    CGContextBeginPath(platformContext());
-    CGContextAddPath(platformContext(), path.platformPath());
-    CGContextClip(platformContext());
-}
-
 }
index a25e81a..7e5eea8 100644 (file)
@@ -26,6 +26,9 @@
 #ifndef WebCoreSystemInterface_h
 #define WebCoreSystemInterface_h
 
+typedef signed char BOOL;
+typedef struct _NSRange NSRange;
+
 #ifdef __cplusplus
 extern "C" {
 #endif