2007-04-23 Alp Toker <alp@atoker.com>
authorbdash <bdash@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 23 Apr 2007 07:13:21 +0000 (07:13 +0000)
committerbdash <bdash@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 23 Apr 2007 07:13:21 +0000 (07:13 +0000)
        Reviewed by Hyatt.

        * platform/graphics/cairo/GraphicsContextCairo.cpp:
        (WebCore::GraphicsContext::drawEllipse):
        (WebCore::GraphicsContext::drawConvexPolygon):
        Fix stroking and filling of ellipses and polygons.
        * platform/graphics/cairo/ImageCairo.cpp:
        (WebCore::BitmapImage::draw): Make use of a new GraphicsContext
        function to simplify the code.
        (WebCore::Image::drawPattern): Now implemented. This makes content
        with tiled patterns (eg. CSS repeat) render correctly.
        * platform/graphics/gdk/ImageGdk.cpp:
        (WebCore::Image::drawPattern): Remove old stub.

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

WebCore/ChangeLog
WebCore/platform/graphics/cairo/GraphicsContextCairo.cpp
WebCore/platform/graphics/cairo/ImageCairo.cpp
WebCore/platform/graphics/gdk/ImageGdk.cpp

index e19aa5f47a7804db99ecf4bd3622efdc43a32b50..d5285c4b3009981e665479809145fc777cea5d37 100644 (file)
@@ -1,3 +1,19 @@
+2007-04-23  Alp Toker  <alp@atoker.com>
+
+        Reviewed by Hyatt.
+
+        * platform/graphics/cairo/GraphicsContextCairo.cpp:
+        (WebCore::GraphicsContext::drawEllipse):
+        (WebCore::GraphicsContext::drawConvexPolygon):
+        Fix stroking and filling of ellipses and polygons.
+        * platform/graphics/cairo/ImageCairo.cpp:
+        (WebCore::BitmapImage::draw): Make use of a new GraphicsContext
+        function to simplify the code.
+        (WebCore::Image::drawPattern): Now implemented. This makes content
+        with tiled patterns (eg. CSS repeat) render correctly.
+        * platform/graphics/gdk/ImageGdk.cpp:
+        (WebCore::Image::drawPattern): Remove old stub.
+
 2007-04-22  Lars Naesbye Christensen  <lars@naesbye.dk>
 
         Reviewed by Tim Hatcher.
 2007-04-22  Lars Naesbye Christensen  <lars@naesbye.dk>
 
         Reviewed by Tim Hatcher.
index dbbc31cc0a1f823853b03ff9f6e34a62fb50e024..4436cdf525557d4e776fb779ebe59d3cd1849e83 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
 /*
  * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2007 Alp Toker <alp@atoker.com>
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -291,13 +292,16 @@ void GraphicsContext::drawEllipse(const IntRect& rect)
 
     if (fillColor().alpha()) {
         setColor(context, fillColor());
 
     if (fillColor().alpha()) {
         setColor(context, fillColor());
-        cairo_fill(context);
+        cairo_fill_preserve(context);
     }
     }
+
     if (strokeStyle() != NoStroke) {
         setColor(context, strokeColor());
         cairo_set_line_width(context, strokeThickness());
         cairo_stroke(context);
     }
     if (strokeStyle() != NoStroke) {
         setColor(context, strokeColor());
         cairo_set_line_width(context, strokeThickness());
         cairo_stroke(context);
     }
+
+    cairo_new_path(context);
 }
 
 // FIXME: This function needs to be adjusted to match the functionality on the Mac side.
 }
 
 // FIXME: This function needs to be adjusted to match the functionality on the Mac side.
@@ -347,7 +351,7 @@ void GraphicsContext::drawConvexPolygon(size_t npoints, const FloatPoint* points
     if (fillColor().alpha()) {
         setColor(context, fillColor());
         cairo_set_fill_rule(context, CAIRO_FILL_RULE_EVEN_ODD);
     if (fillColor().alpha()) {
         setColor(context, fillColor());
         cairo_set_fill_rule(context, CAIRO_FILL_RULE_EVEN_ODD);
-        cairo_fill(context);
+        cairo_fill_preserve(context);
     }
 
     if (strokeStyle() != NoStroke) {
     }
 
     if (strokeStyle() != NoStroke) {
@@ -355,6 +359,8 @@ void GraphicsContext::drawConvexPolygon(size_t npoints, const FloatPoint* points
         cairo_set_line_width(context, strokeThickness());
         cairo_stroke(context);
     }
         cairo_set_line_width(context, strokeThickness());
         cairo_stroke(context);
     }
+
+    cairo_new_path(context);
     cairo_restore(context);
 }
 
     cairo_restore(context);
 }
 
index 9e1e222db74bb9e5a5cd992884be0e2d825b7da3..0add53572edd528be27b97cabf9c41fd961418b4 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc.  All rights reserved.
 /*
  * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2007 Alp Toker <alp@atoker.com>
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -28,6 +29,7 @@
 
 #if PLATFORM(CAIRO)
 
 
 #if PLATFORM(CAIRO)
 
+#include "AffineTransform.h"
 #include "FloatRect.h"
 #include "GraphicsContext.h"
 #include <cairo.h>
 #include "FloatRect.h"
 #include "GraphicsContext.h"
 #include <cairo.h>
@@ -51,20 +53,6 @@ void FrameData::clear()
 
 // Drawing Routines
 
 
 // Drawing Routines
 
-static void setCompositingOperation(cairo_t* context, CompositeOperator op, bool hasAlpha)
-{
-    // FIXME: Add support for more operators.
-    // FIXME: This should really move to be a graphics context function once we have
-    // a C++ abstraction for GraphicsContext.
-    if (op == CompositeSourceOver && !hasAlpha)
-        op = CompositeCopy;
-
-    if (op == CompositeCopy)
-        cairo_set_operator(context, CAIRO_OPERATOR_SOURCE);
-    else
-        cairo_set_operator(context, CAIRO_OPERATOR_OVER);
-}
-
 void BitmapImage::draw(GraphicsContext* ctxt, const FloatRect& dst, const FloatRect& src, CompositeOperator op)
 {
     cairo_t* context = ctxt->platformContext();
 void BitmapImage::draw(GraphicsContext* ctxt, const FloatRect& dst, const FloatRect& src, CompositeOperator op)
 {
     cairo_t* context = ctxt->platformContext();
@@ -83,8 +71,11 @@ void BitmapImage::draw(GraphicsContext* ctxt, const FloatRect& dst, const FloatR
     cairo_save(context);
 
     // Set the compositing operation.
     cairo_save(context);
 
     // Set the compositing operation.
-    setCompositingOperation(context, op, frameHasAlphaAtIndex(m_currentFrame));
-    
+    if (op == CompositeSourceOver && !frameHasAlphaAtIndex(m_currentFrame))
+        ctxt->setCompositeOperation(CompositeCopy);
+    else
+        ctxt->setCompositeOperation(op);
+
     // If we're drawing a sub portion of the image or scaling then create
     // a pattern transformation on the image and draw the transformed pattern.
     // Test using example site at http://www.meyerweb.com/eric/css/edge/complexspiral/demo.html
     // If we're drawing a sub portion of the image or scaling then create
     // a pattern transformation on the image and draw the transformed pattern.
     // Test using example site at http://www.meyerweb.com/eric/css/edge/complexspiral/demo.html
@@ -107,6 +98,37 @@ void BitmapImage::draw(GraphicsContext* ctxt, const FloatRect& dst, const FloatR
 
 }
 
 
 }
 
+void Image::drawPattern(GraphicsContext* ctxt, const FloatRect& tileRect, const AffineTransform& patternTransform,
+                        const FloatPoint& phase, CompositeOperator op, const FloatRect& destRect)
+{
+    cairo_surface_t* image = nativeImageForCurrentFrame();
+    if (!image) // If it's too early we won't have an image yet.
+        return;
+
+    cairo_t* context = ctxt->platformContext();
+    ctxt->save();
+
+    // TODO: Make use of tileRect.
+
+    cairo_pattern_t* pattern = cairo_pattern_create_for_surface(image);
+    cairo_pattern_set_extend(pattern, CAIRO_EXTEND_REPEAT);
+
+    cairo_matrix_t pattern_matrix = cairo_matrix_t(patternTransform);
+    cairo_matrix_t phase_matrix = {1, 0, 0, 1, phase.x(), phase.y()};
+    cairo_matrix_t combined;
+    cairo_matrix_multiply(&combined, &pattern_matrix, &phase_matrix);
+    cairo_matrix_invert(&combined);
+    cairo_pattern_set_matrix(pattern, &combined);
+
+    ctxt->setCompositeOperation(op);
+    cairo_set_source(context, pattern);
+    cairo_rectangle(context, destRect.x(), destRect.y(), destRect.width(), destRect.height());
+    cairo_fill(context);
+
+    cairo_pattern_destroy(pattern);
+    ctxt->restore();
+}
+
 void BitmapImage::checkForSolidColor()
 {
     // FIXME: It's easy to implement this optimization. Just need to check the RGBA32 buffer to see if it is 1x1.
 void BitmapImage::checkForSolidColor()
 {
     // FIXME: It's easy to implement this optimization. Just need to check the RGBA32 buffer to see if it is 1x1.
index 77ab353ef5b767f0729ff4281ff94b9067aff34d..5a7721ec59de6c3d143ef2c5b3dd04fdd9e9cb56 100644 (file)
@@ -51,10 +51,4 @@ Image* Image::loadPlatformResource(const char *name)
     img->setData(buffer, true);
     return img;
 }
     img->setData(buffer, true);
     return img;
 }
-
-void Image::drawPattern(GraphicsContext* ctxt, const FloatRect& tileRect, const AffineTransform& patternTransform,
-                        const FloatPoint& phase, CompositeOperator op, const FloatRect& destRect)
-{
-    notImplementedGdk();
-}
 }
 }