<!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;
<!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;
rptobjecttext.c \
rptobjectline.c \
rptobjectrect.c \
+ rptobjectellipse.c \
rptobjectimage.c \
rptreport.c \
rptprint.c \
rptobjecttext.h \
rptobjectline.h \
rptobjectrect.h \
+ rptobjectellipse.h \
rptobjectimage.h \
rptreport.h \
rptprint.h \
#include "rptcommon.h"
-static gchar *convert_to_str_color (RptColor color);
/**
* rpt_common_get_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:
}
}
+/**
+ * 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:
{
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));
}
/**
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));
}
}
}
}
+/**
+ * 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:
}
}
-static gchar *
-convert_to_str_color (RptColor color)
+gchar *
+rpt_common_convert_to_str_color (RptColor color)
{
gchar *ret = "#";
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,
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
{
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))
struct _RptObjImagePrivate
{
RptSize *size;
+ RptBorder *border;
gchar *source;
+ guint adapt;
};
GType
"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
priv->size->width = 0.0;
priv->size->height = 0.0;
- priv->source = g_strdup ("");
+ priv->border = (RptBorder *)g_malloc0 (sizeof (RptBorder));
}
/**
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;
+ }
}
}
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
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;
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;
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);
enum
{
PROP_0,
- PROP_SIZE
+ PROP_SIZE,
+ PROP_STROKE
};
static void rpt_obj_line_class_init (RptObjLineClass *klass);
struct _RptObjLinePrivate
{
RptSize *size;
+ RptStroke *stroke;
};
GType
"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
priv->size = (RptSize *)g_malloc0 (sizeof (RptSize));
priv->size->width = 0.0;
priv->size->height = 0.0;
+
+ priv->stroke = (RptStroke *)g_malloc0 (sizeof (RptStroke));
}
/**
priv = RPT_OBJ_LINE_GET_PRIVATE (rpt_obj_line);
rpt_common_get_size (xnode, priv->size);
+ rpt_common_get_stroke (xnode, priv->stroke);
}
}
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
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;
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;
enum
{
- PROP_0
+ PROP_0,
+ PROP_FILL_COLOR
};
static void rpt_obj_rect_class_init (RptObjRectClass *klass);
typedef struct _RptObjRectPrivate RptObjRectPrivate;
struct _RptObjRectPrivate
{
+ RptColor *fill_color;
};
GType
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));
}
/**
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);
+ }
}
}
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
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;
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;
"Source",
"The source.",
"",
- G_PARAM_READWRITE));
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
}
static void
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
#include <stdlib.h>
#include <string.h>
+#include <math.h>
#include <cairo.h>
#include <cairo-pdf.h>
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,
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)
{
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);
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)
{
#include "rptobjecttext.h"
#include "rptobjectline.h"
#include "rptobjectrect.h"
+#include "rptobjectellipse.h"
#include "rptobjectimage.h"
typedef enum
{
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);
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;
}
<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>
<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>