]> saetta.ns0.it Git - reptool/libreptool/commitdiff
Added object ellipse.
authorAndrea Zagli <azagli@libero.it>
Wed, 28 Mar 2007 16:46:36 +0000 (16:46 +0000)
committerAndrea Zagli <azagli@libero.it>
Wed, 28 Mar 2007 16:46:36 +0000 (16:46 +0000)
Extended RptObjImage, RptObjLine, RptObjText and RptObjRect.

git-svn-id: svn+ssh://saetta.homelinux.org/svn/libreptool/trunk@9 3191ed1d-3fce-41bb-ab4a-0cebc0943b59

14 files changed:
data/reptool.dtd
data/reptool_report.dtd
src/Makefile.am
src/rptcommon.c
src/rptcommon.h
src/rptobjectimage.c
src/rptobjectimage.h
src/rptobjectline.c
src/rptobjectrect.c
src/rptobjecttext.c
src/rptprint.c
src/rptreport.c
tests/test_report_db.rpt
tests/test_rptprint.rptr

index 35a7f41ae42950f59df059d1bd0d4145912f765b..a7b7ae1156fff1b230ba511446c71dcfbc9269f3 100644 (file)
@@ -1,5 +1,5 @@
 <!ENTITY % objects
-  "text*, line*, rect*, image*"
+  "text*, line*, rect*, ellipse*, image*"
 >
 
 <!ENTITY % object_commons_attrs
   fill-color   CDATA #IMPLIED
 >
 
+<!ELEMENT ellipse EMPTY>
+<!ATTLIST ellipse
+  %object_commons_attrs;
+  %object_size_attrs;
+  %object_stroke_attrs;
+  fill-color   CDATA #IMPLIED
+>
+
 <!ELEMENT image EMPTY>
 <!ATTLIST image
   %object_commons_attrs;
index 4b230efe5288c6f7c8f81b47f25bf42f92e3f326..d3a91603192188ee4b7f549fb58f077512e59554 100644 (file)
@@ -1,5 +1,5 @@
 <!ENTITY % objects
-  "text*, line*, rect*, image*"
+  "text*, line*, rect*, ellipse*, image*"
 >
 
 <!ENTITY % object_position_attrs
   fill-color   CDATA #IMPLIED
 >
 
+<!ELEMENT ellipse EMPTY>
+<!ATTLIST ellipse
+  %object_poisition_attrs;
+  %object_size_attrs;
+  %object_stroke_attrs;
+  fill-color   CDATA #IMPLIED
+>
+
 <!ELEMENT image EMPTY>
 <!ATTLIST image
   %object_position_attrs;
index 14ff7759e44865b0975a736cc0863d692aa30745..6854c2f4679083bb1bae7d237edb37cd6a1c5a3f 100644 (file)
@@ -9,6 +9,7 @@ libreptool_la_SOURCES = \
                         rptobjecttext.c \
                         rptobjectline.c \
                         rptobjectrect.c \
+                        rptobjectellipse.c \
                         rptobjectimage.c \
                         rptreport.c \
                         rptprint.c \
@@ -20,6 +21,7 @@ include_HEADERS = \
                   rptobjecttext.h \
                   rptobjectline.h \
                   rptobjectrect.h \
+                  rptobjectellipse.h \
                   rptobjectimage.h \
                   rptreport.h \
                   rptprint.h \
index e4dbf6a39c39ba0f445c8ec2fa275e65da4df235..a1c82c1e3f36c723b93ceb9c8f00954c8bc2dbe6 100644 (file)
@@ -21,7 +21,6 @@
 
 #include "rptcommon.h"
 
-static gchar *convert_to_str_color (RptColor color);
 
 /**
  * rpt_common_get_position:
@@ -49,6 +48,19 @@ rpt_common_get_position (xmlNode *xnode, RptPoint *position)
                }
 }
 
+/**
+ * rpt_common_set_position:
+ * @xnode:
+ * @position:
+ *
+ */
+void
+rpt_common_set_position (xmlNode *xnode, RptPoint position)
+{
+       xmlSetProp (xnode, "x", g_strdup_printf ("%f", position.x));
+       xmlSetProp (xnode, "y", g_strdup_printf ("%f", position.y));
+}
+
 /**
  * rpt_common_get_size:
  * @xnode:
@@ -75,6 +87,19 @@ rpt_common_get_size (xmlNode *xnode, RptSize *size)
                }
 }
 
+/**
+ * rpt_common_set_size:
+ * @xnode:
+ * @size:
+ *
+ */
+void
+rpt_common_set_size (xmlNode *xnode, RptSize size)
+{
+       xmlSetProp (xnode, "width", g_strdup_printf ("%f", size.width));
+       xmlSetProp (xnode, "height", g_strdup_printf ("%f", size.height));
+}
+
 /**
  * rpt_common_get_font:
  * @xnode:
@@ -167,7 +192,7 @@ rpt_common_set_font (xmlNode *xnode, RptFont font)
                {
                        xmlSetProp (xnode, "font-strike", "y");
                }
-       xmlSetProp (xnode, "font-color", convert_to_str_color (font.color));
+       xmlSetProp (xnode, "font-color", rpt_common_convert_to_str_color (font.color));
 }
 
 /**
@@ -263,22 +288,22 @@ rpt_common_set_border (xmlNode *xnode, RptBorder border)
        if (border.top_width > 0.0)
                {
                        xmlSetProp (xnode, "border-top-width", g_strdup_printf ("%f", border.top_width));
-                       xmlSetProp (xnode, "border-top-color", convert_to_str_color (border.top_color));
+                       xmlSetProp (xnode, "border-top-color", rpt_common_convert_to_str_color (border.top_color));
                }
        if (border.right_width > 0.0)
                {
                        xmlSetProp (xnode, "border-right-width", g_strdup_printf ("%f", border.right_width));
-                       xmlSetProp (xnode, "border-right-color", convert_to_str_color (border.right_color));
+                       xmlSetProp (xnode, "border-right-color", rpt_common_convert_to_str_color (border.right_color));
                }
        if (border.bottom_width > 0.0)
                {
                        xmlSetProp (xnode, "border-bottom-width", g_strdup_printf ("%f", border.bottom_width));
-                       xmlSetProp (xnode, "border-bottom-color", convert_to_str_color (border.bottom_color));
+                       xmlSetProp (xnode, "border-bottom-color", rpt_common_convert_to_str_color (border.bottom_color));
                }
        if (border.left_width > 0.0)
                {
                        xmlSetProp (xnode, "border-left-width", g_strdup_printf ("%f", border.left_width));
-                       xmlSetProp (xnode, "border-left-color", convert_to_str_color (border.left_color));
+                       xmlSetProp (xnode, "border-left-color", rpt_common_convert_to_str_color (border.left_color));
                }
 }
 
@@ -398,6 +423,22 @@ rpt_common_get_stroke (xmlNode *xnode, RptStroke *stroke)
                }
 }
 
+/**
+ * rpt_common_set_stroke:
+ * @xnode:
+ * @stroke:
+ *
+ */
+void
+rpt_common_set_stroke (xmlNode *xnode, RptStroke stroke)
+{
+       if (stroke.width != 0.0)
+               {
+                       xmlSetProp (xnode, "stroke-width", g_strdup_printf ("%f", stroke.width));
+               }
+       xmlSetProp (xnode, "stroke-color", rpt_common_convert_to_str_color (stroke.color));
+}
+
 /**
  * rpt_common_parse_color:
  * @str_color:
@@ -452,8 +493,8 @@ rpt_common_parse_color (const gchar *str_color, RptColor *color)
                }
 }
 
-static gchar *
-convert_to_str_color (RptColor color)
+gchar *
+rpt_common_convert_to_str_color (RptColor color)
 {
        gchar *ret = "#";
 
index cde6af73867deee050ad6f8c0fb3f01dbccb077b..5b1bd82971388b52556b72ff375460261252a948 100644 (file)
@@ -99,8 +99,12 @@ typedef struct
 
 void rpt_common_get_position (xmlNode *xnode,
                               RptPoint *position);
+void rpt_common_set_position (xmlNode *xnode,
+                              RptPoint position);
 void rpt_common_get_size (xmlNode *xnode,
                           RptSize *size);
+void rpt_common_set_size (xmlNode *xnode,
+                          RptSize size);
 void rpt_common_get_font (xmlNode *xnode,
                           RptFont *font);
 void rpt_common_set_font (xmlNode *xnode,
@@ -115,8 +119,11 @@ void rpt_common_set_align (xmlNode *xnode,
                            RptAlign align);
 void rpt_common_get_stroke (xmlNode *xnode,
                             RptStroke *stroke);
+void rpt_common_set_stroke (xmlNode *xnode,
+                            RptStroke stroke);
 void rpt_common_parse_color (const gchar *str_color,
                              RptColor *color);
+gchar *rpt_common_convert_to_str_color (RptColor color);
 
 
 G_END_DECLS
index 8f201f8a3c2b2d58c1ccd89e3e781040ec6f7e13..b847d654b8cbe2ddfab0772011a043c271935139 100644 (file)
@@ -23,20 +23,22 @@ enum
 {
        PROP_0,
        PROP_SIZE,
-       PROP_SOURCE
+       PROP_BORDER,
+       PROP_SOURCE,
+       PROP_ADAPT
 };
 
 static void rpt_obj_image_class_init (RptObjImageClass *klass);
 static void rpt_obj_image_init (RptObjImage *rpt_obj_image);
 
 static void rpt_obj_image_set_property (GObject *object,
-                                       guint property_id,
-                                       const GValue *value,
-                                       GParamSpec *pspec);
+                                        guint property_id,
+                                        const GValue *value,
+                                        GParamSpec *pspec);
 static void rpt_obj_image_get_property (GObject *object,
-                                       guint property_id,
-                                       GValue *value,
-                                       GParamSpec *pspec);
+                                        guint property_id,
+                                        GValue *value,
+                                        GParamSpec *pspec);
 
 
 #define RPT_OBJ_IMAGE_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TYPE_RPT_OBJ_IMAGE, RptObjImagePrivate))
@@ -45,7 +47,9 @@ typedef struct _RptObjImagePrivate RptObjImagePrivate;
 struct _RptObjImagePrivate
        {
                RptSize *size;
+               RptBorder *border;
                gchar *source;
+               guint adapt;
        };
 
 GType
@@ -94,12 +98,23 @@ rpt_obj_image_class_init (RptObjImageClass *klass)
                                                               "Size",
                                                               "The object's size.",
                                                               G_PARAM_READWRITE));
+       g_object_class_install_property (object_class, PROP_BORDER,
+                                        g_param_spec_pointer ("border",
+                                                              "Border",
+                                                              "The object's border.",
+                                                              G_PARAM_READWRITE));
        g_object_class_install_property (object_class, PROP_SOURCE,
                                         g_param_spec_string ("source",
                                                              "Source",
                                                              "The image's source.",
                                                              "",
-                                                             G_PARAM_READWRITE));
+                                                             G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+       g_object_class_install_property (object_class, PROP_ADAPT,
+                                        g_param_spec_uint ("adapt",
+                                                           "Adapt",
+                                                           "Whether to adapt the image.",
+                                                           RPT_OBJ_IMAGE_ADAPT_NONE, RPT_OBJ_IMAGE_ADAPT_TO_IMAGE, 0,
+                                                           G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
 }
 
 static void
@@ -111,7 +126,7 @@ rpt_obj_image_init (RptObjImage *rpt_obj_image)
        priv->size->width = 0.0;
        priv->size->height = 0.0;
 
-       priv->source = g_strdup ("");
+       priv->border = (RptBorder *)g_malloc0 (sizeof (RptBorder));
 }
 
 /**
@@ -168,8 +183,18 @@ RptObject
                                        priv = RPT_OBJ_IMAGE_GET_PRIVATE (rpt_obj_image);
 
                                        rpt_common_get_size (xnode, priv->size);
+                                       rpt_common_get_border (xnode, priv->border);
 
                                        priv->source = (gchar *)xmlGetProp (xnode, "source");
+
+                                       if (xmlStrcasecmp (xmlGetProp (xnode, "adapt"), (const xmlChar *)"to-box") == 0)
+                                               {
+                                                       priv->adapt = RPT_OBJ_IMAGE_ADAPT_TO_BOX;
+                                               }
+                                       else if (xmlStrcasecmp (xmlGetProp (xnode, "adapt"), (const xmlChar *)"to-image") == 0)
+                                               {
+                                                       priv->adapt = RPT_OBJ_IMAGE_ADAPT_TO_IMAGE;
+                                               }
                                }
                }
 
@@ -191,7 +216,21 @@ rpt_obj_image_get_xml (RptObject *rpt_objimage, xmlNode *xnode)
 
        xmlSetProp (xnode, "width", g_strdup_printf ("%f", priv->size->width));
        xmlSetProp (xnode, "height", g_strdup_printf ("%f", priv->size->height));
+
+       rpt_common_set_border (xnode, *priv->border);
+
        xmlSetProp (xnode, "source", priv->source);
+
+       switch (priv->adapt)
+               {
+                       case RPT_OBJ_IMAGE_ADAPT_TO_BOX:
+                               xmlSetProp (xnode, "adapt", "to-box");
+                               break;
+
+                       case RPT_OBJ_IMAGE_ADAPT_TO_IMAGE:
+                               xmlSetProp (xnode, "adapt", "to-image");
+                               break;
+               }
 }
 
 static void
@@ -207,10 +246,18 @@ rpt_obj_image_set_property (GObject *object, guint property_id, const GValue *va
                                priv->size = g_memdup (g_value_get_pointer (value), sizeof (RptSize));
                                break;
 
+                       case PROP_BORDER:
+                               priv->border = g_memdup (g_value_get_pointer (value), sizeof (RptBorder));
+                               break;
+
                        case PROP_SOURCE:
                                priv->source = g_strstrip (g_strdup (g_value_get_string (value)));
                                break;
 
+                       case PROP_ADAPT:
+                               priv->adapt = g_value_get_uint (value);
+                               break;
+
                        default:
                                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
                                break;
@@ -230,10 +277,18 @@ rpt_obj_image_get_property (GObject *object, guint property_id, GValue *value, G
                                g_value_set_pointer (value, g_memdup (priv->size, sizeof (RptSize)));
                                break;
 
+                       case PROP_BORDER:
+                               g_value_set_pointer (value, g_memdup (priv->border, sizeof (RptBorder)));
+                               break;
+
                        case PROP_SOURCE:
                                g_value_set_string (value, priv->source);
                                break;
 
+                       case PROP_ADAPT:
+                               g_value_set_uint (value, priv->adapt);
+                               break;
+
                        default:
                                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
                                break;
index c30bf924f3bc40a5750dbff961217363cb96b1ab..49e84bbc81d305049f7f5d668944f3a1dc65fd62 100644 (file)
@@ -52,6 +52,12 @@ struct _RptObjImageClass
 
 GType rpt_obj_image_get_type (void) G_GNUC_CONST;
 
+typedef enum
+{
+       RPT_OBJ_IMAGE_ADAPT_NONE,
+       RPT_OBJ_IMAGE_ADAPT_TO_BOX,
+       RPT_OBJ_IMAGE_ADAPT_TO_IMAGE
+} eRptObjImageAdapt;
 
 RptObject *rpt_obj_image_new (const gchar *name, RptPoint position);
 RptObject *rpt_obj_image_new_from_xml (xmlNode *xnode);
index 4bfc1381d43ea2524a6e9b4452123959918553ef..55a5ac709f7170b48eb507239ba17032e395c4aa 100644 (file)
@@ -22,7 +22,8 @@
 enum
 {
        PROP_0,
-       PROP_SIZE
+       PROP_SIZE,
+       PROP_STROKE
 };
 
 static void rpt_obj_line_class_init (RptObjLineClass *klass);
@@ -44,6 +45,7 @@ typedef struct _RptObjLinePrivate RptObjLinePrivate;
 struct _RptObjLinePrivate
        {
                RptSize *size;
+               RptStroke *stroke;
        };
 
 GType
@@ -92,6 +94,11 @@ rpt_obj_line_class_init (RptObjLineClass *klass)
                                                               "Size",
                                                               "The object's size.",
                                                               G_PARAM_READWRITE));
+       g_object_class_install_property (object_class, PROP_STROKE,
+                                        g_param_spec_pointer ("stroke",
+                                                              "Stroke",
+                                                              "The object's stroke.",
+                                                              G_PARAM_READWRITE));
 }
 
 static void
@@ -102,6 +109,8 @@ rpt_obj_line_init (RptObjLine *rpt_obj_line)
        priv->size = (RptSize *)g_malloc0 (sizeof (RptSize));
        priv->size->width = 0.0;
        priv->size->height = 0.0;
+
+       priv->stroke = (RptStroke *)g_malloc0 (sizeof (RptStroke));
 }
 
 /**
@@ -158,6 +167,7 @@ RptObject
                                        priv = RPT_OBJ_LINE_GET_PRIVATE (rpt_obj_line);
 
                                        rpt_common_get_size (xnode, priv->size);
+                                       rpt_common_get_stroke (xnode, priv->stroke);
                                }
                }
 
@@ -177,8 +187,8 @@ rpt_obj_line_get_xml (RptObject *rpt_objline, xmlNode *xnode)
 
        xmlNodeSetName (xnode, "line");
 
-       xmlSetProp (xnode, "width", g_strdup_printf ("%f", priv->size->width));
-       xmlSetProp (xnode, "height", g_strdup_printf ("%f", priv->size->height));
+       rpt_common_set_size (xnode, *priv->size);
+       rpt_common_set_stroke (xnode, *priv->stroke);
 }
 
 static void
@@ -194,6 +204,10 @@ rpt_obj_line_set_property (GObject *object, guint property_id, const GValue *val
                                priv->size = g_memdup (g_value_get_pointer (value), sizeof (RptSize));
                                break;
 
+                       case PROP_STROKE:
+                               priv->stroke = g_memdup (g_value_get_pointer (value), sizeof (RptStroke));
+                               break;
+
                        default:
                                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
                                break;
@@ -213,6 +227,10 @@ rpt_obj_line_get_property (GObject *object, guint property_id, GValue *value, GP
                                g_value_set_pointer (value, g_memdup (priv->size, sizeof (RptSize)));
                                break;
 
+                       case PROP_STROKE:
+                               g_value_set_pointer (value, g_memdup (priv->stroke, sizeof (RptStroke)));
+                               break;
+
                        default:
                                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
                                break;
index a47bc64beb4b2650ae770ac97a22df169932edd6..f158eb58fb10b8650661bb90a518737127501edf 100644 (file)
@@ -21,7 +21,8 @@
 
 enum
 {
-       PROP_0
+       PROP_0,
+       PROP_FILL_COLOR
 };
 
 static void rpt_obj_rect_class_init (RptObjRectClass *klass);
@@ -42,6 +43,7 @@ static void rpt_obj_rect_get_property (GObject *object,
 typedef struct _RptObjRectPrivate RptObjRectPrivate;
 struct _RptObjRectPrivate
        {
+               RptColor *fill_color;
        };
 
 GType
@@ -84,12 +86,20 @@ rpt_obj_rect_class_init (RptObjRectClass *klass)
        object_class->get_property = rpt_obj_rect_get_property;
 
        rptobject_class->get_xml = rpt_obj_rect_get_xml;
+
+       g_object_class_install_property (object_class, PROP_FILL_COLOR,
+                                        g_param_spec_pointer ("fill-color",
+                                                              "Fill Color",
+                                                              "The object's fill color.",
+                                                              G_PARAM_READWRITE));
 }
 
 static void
 rpt_obj_rect_init (RptObjRect *rpt_obj_rect)
 {
        RptObjRectPrivate *priv = RPT_OBJ_RECT_GET_PRIVATE (rpt_obj_rect);
+
+       priv->fill_color = (RptColor *)g_malloc0 (sizeof (RptColor));
 }
 
 /**
@@ -143,12 +153,24 @@ RptObject
 
                        if (rpt_obj_rect != NULL)
                                {
+                                       const gchar *prop;
                                        RptSize size;
+                                       RptStroke stroke;
 
                                        priv = RPT_OBJ_RECT_GET_PRIVATE (rpt_obj_rect);
 
                                        rpt_common_get_size (xnode, &size);
-                                       g_object_set (G_OBJECT (rpt_obj_rect), "size", &size, NULL);
+                                       rpt_common_get_stroke (xnode, &stroke);
+                                       g_object_set (G_OBJECT (rpt_obj_rect),
+                                                     "size", &size,
+                                                     "stroke", &stroke,
+                                                     NULL);
+
+                                       prop = (const gchar *)xmlGetProp (xnode, "fill-color");
+                                       if (prop != NULL)
+                                               {
+                                                       rpt_common_parse_color (prop, priv->fill_color);
+                                               }
                                }
                }
 
@@ -169,6 +191,11 @@ rpt_obj_rect_get_xml (RptObject *rpt_object, xmlNode *xnode)
        rpt_obj_line_get_xml (rpt_object, xnode);
 
        xmlNodeSetName (xnode, "rect");
+
+       if (priv->fill_color != NULL)
+               {
+                       xmlSetProp (xnode, "fill-color", rpt_common_convert_to_str_color (*priv->fill_color));
+               }
 }
 
 static void
@@ -180,6 +207,10 @@ rpt_obj_rect_set_property (GObject *object, guint property_id, const GValue *val
 
        switch (property_id)
                {
+                       case PROP_FILL_COLOR:
+                               priv->fill_color = g_memdup (g_value_get_pointer (value), sizeof (RptColor));
+                               break;
+
                        default:
                                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
                                break;
@@ -195,6 +226,10 @@ rpt_obj_rect_get_property (GObject *object, guint property_id, GValue *value, GP
 
        switch (property_id)
                {
+                       case PROP_FILL_COLOR:
+                               g_value_set_pointer (value, g_memdup (priv->fill_color, sizeof (RptColor)));
+                               break;
+
                        default:
                                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
                                break;
index 56c8b9fc22c1064bfdb5be5e8d269d2be854a890..9cb063115b006f0b9bf933d0e17c3902019a93c7 100644 (file)
@@ -120,7 +120,7 @@ rpt_obj_text_class_init (RptObjTextClass *klass)
                                                              "Source",
                                                              "The source.",
                                                              "",
-                                                             G_PARAM_READWRITE));
+                                                             G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
 }
 
 static void
@@ -213,7 +213,7 @@ rpt_obj_text_get_xml (RptObject *rpt_objtext, xmlNode *xnode)
 
        rpt_common_set_border (xnode, (RptBorder)*priv->border);
        rpt_common_set_font (xnode, (RptFont)*priv->font);
-       rpt_common_set_align (xnode, (RptAlign)*priv->font);
+       rpt_common_set_align (xnode, (RptAlign)*priv->align);
 }
 
 static void
index 95baa708a6112d7d504620f24d89e50148bd3b39..76e60e9987af24fa07d589987cf649fa337c2fdb 100644 (file)
@@ -18,6 +18,7 @@
 
 #include <stdlib.h>
 #include <string.h>
+#include <math.h>
 
 #include <cairo.h>
 #include <cairo-pdf.h>
@@ -53,6 +54,8 @@ static void rpt_print_line_xml (RptPrint *rpt_print,
                                 xmlNode *xnode);
 static void rpt_print_rect_xml (RptPrint *rpt_print,
                                 xmlNode *xnode);
+static void rpt_print_ellipse_xml (RptPrint *rpt_print,
+                                   xmlNode *xnode);
 static void rpt_print_image_xml (RptPrint *rpt_print,
                                  xmlNode *xnode);
 static void rpt_print_line (RptPrint *rpt_print,
@@ -314,6 +317,8 @@ rpt_print_get_property (GObject *object, guint property_id, GValue *value, GPara
 static void
 rpt_print_page (RptPrint *rpt_print, xmlNode *xnode)
 {
+       RptPrintPrivate *priv = RPT_PRINT_GET_PRIVATE (rpt_print);
+
        xmlNode *cur = xnode->children;
 
        while (cur != NULL)
@@ -330,6 +335,10 @@ rpt_print_page (RptPrint *rpt_print, xmlNode *xnode)
                                {
                                        rpt_print_rect_xml (rpt_print, cur);
                                }
+                       else if (strcmp (cur->name, "ellipse") == 0)
+                               {
+                                       rpt_print_ellipse_xml (rpt_print, cur);
+                               }
                        else if (strcmp (cur->name, "image") == 0)
                                {
                                        rpt_print_image_xml (rpt_print, cur);
@@ -538,6 +547,48 @@ rpt_print_rect_xml (RptPrint *rpt_print, xmlNode *xnode)
        cairo_stroke (priv->cr);
 }
 
+static void
+rpt_print_ellipse_xml (RptPrint *rpt_print, xmlNode *xnode)
+{
+       RptPoint position;
+       RptSize size;
+       RptStroke stroke;
+       RptColor fill_color;
+
+       RptPrintPrivate *priv = RPT_PRINT_GET_PRIVATE (rpt_print);
+
+       rpt_common_get_position (xnode, &position);
+       rpt_common_get_size (xnode, &size);
+       rpt_common_get_stroke (xnode, &stroke);
+
+       gchar *prop = xmlGetProp (xnode, (const xmlChar *)"fill-color");
+       if (prop != NULL)
+               {
+                       fill_color.r = 0.0;
+                       fill_color.g = 0.0;
+                       fill_color.b = 0.0;
+                       fill_color.a = 1.0;
+                       rpt_common_parse_color (prop, &fill_color);
+               }
+
+       cairo_new_path (priv->cr);
+
+       cairo_save (priv->cr);
+       cairo_translate (priv->cr, position.x, position.y);
+       cairo_scale (priv->cr, size.width, size.height);
+       cairo_arc (priv->cr, 0., 0., 1., 0., 2. * M_PI);
+       cairo_restore (priv->cr);
+       
+       if (prop != NULL)
+               {
+                       cairo_set_source_rgba (priv->cr, fill_color.r, fill_color.g, fill_color.b, fill_color.a);
+                       cairo_fill_preserve (priv->cr);
+               }
+
+       cairo_set_source_rgba (priv->cr, stroke.color.r, stroke.color.g, stroke.color.b, stroke.color.a);
+       cairo_stroke (priv->cr);
+}
+
 static void
 rpt_print_image_xml (RptPrint *rpt_print, xmlNode *xnode)
 {
index aed82f1b846c0cb2eae7bbd75188b46a30bbbb03..f27dc8fe42449640d3a280c3a26936c0a05fb699 100644 (file)
@@ -32,6 +32,7 @@
 #include "rptobjecttext.h"
 #include "rptobjectline.h"
 #include "rptobjectrect.h"
+#include "rptobjectellipse.h"
 #include "rptobjectimage.h"
 
 typedef enum
@@ -533,6 +534,10 @@ rpt_report_xml_parse_section (RptReport *rpt_report, xmlNode *xnode, RptReportSe
                                {
                                        rptobj = rpt_obj_rect_new_from_xml (cur);
                                }
+                       else if (strcmp (cur->name, "ellipse") == 0)
+                               {
+                                       rptobj = rpt_obj_ellipse_new_from_xml (cur);
+                               }
                        else if (strcmp (cur->name, "image") == 0)
                                {
                                        rptobj = rpt_obj_image_new_from_xml (cur);
@@ -625,10 +630,10 @@ static xmlNode
        RptReportPrivate *priv = RPT_REPORT_GET_PRIVATE (rpt_report);
 
        xnode = xmlNewNode (NULL, "page");
-       xmlSetProp (xnode, "width", g_strdup_printf ("%f", priv->page->size->width));
-       xmlSetProp (xnode, "height", g_strdup_printf ("%f", priv->page->size->height));
        xmlAddChild (xroot, xnode);
 
+       rpt_common_set_size (xnode, *priv->page->size);
+
        return xnode;
 }
 
index b1fb59dc378ebbcdf8b6fe1d9f1969e2e55b9f03..b30d30fc5c3d16b0ced58732e4af2eb1031af7ce 100644 (file)
                <body height="200">
                        <text name="txt_id" x="50" y="50" width="100" height="50" border-top-width="1.0" border-top-color="#FF0000" source="[id]" />
                        <text name="txt_name" x="200" y="50" width="100" height="50" source="[name]" />
-                       <rect name="rect1" x="400" y="10" width="20" height="20" />
+                       <rect name="rect1" x="400" y="10" width="20" height="20" fill-color="#00FF00" />
                        <image name="img1" x="450" y="10" width="60" height="60" source="tests/gnome-globe.png" />
                </body>
                <page-footer height="80">
                        <line name="line2" x="10" y="10" width="500" height="0" />
                        <text name="footer" x="10" y="20" width="300" height="50" source="the page footer" />
+                       <ellipse name="ellipse1" x="400" y="50" width="20" height="10" stroke-color="#FF0000" fill-color="#00FF00" />
                </page-footer>
        </report>
 </reptool>
index fc5781f7b58d78aabbacaa587f9e60b50ece27ae..3763a038b25d5c8859e0327ca4e89c53b575abce 100644 (file)
@@ -10,5 +10,6 @@
        <page width="595" height="842">
                <text x="10" y="300" width="300" height="800" font-size="30" font-color="#FF0">Text sample on second page</text>
                <line x="10" y="300" width="100" height="0" stroke-color="#0F0" />
+               <ellipse x="200" y="700" width="100" height="30" stroke-color="#FF0000" fill-color="#0000FF" />
        </page>
 </reptool_report>