Added support for elliptical labels.
Added support for elliptical markup lines.
@brand: Brand name of label or card. E.g. "Avery."
@part: Part name or number of label or card. E.g. "8160."
+@equiv_part:
@description: A description of the template. E.g. "Mailing labels."
@paper_id: A paper ID. E.g. "A4" or "US-Letter."
@page_width: Page width in points. Used only if paper_id is "Other."
@page_height: Page height in points. Used only if paper_id is "Other."
-@aliases: A list of alternate names for this template. Often a single template can be used for
-multiple products.
+@product_url:
@category_ids: A list of category IDs that this template belongs to.
@frames: A list of (#lglTemplateFrame *) structures. GLabels currently only supports one frame
per template -- future versions may support multiple frames per template.
+@aliases: A list of alternate names for this template. Often a single template can be used for
+multiple products.
<!-- ##### STRUCT lglTemplateAlias ##### -->
<para>
</para>
@utf8_filename:
-@Returns:
<!-- ##### FUNCTION lgl_xml_template_parse_templates_doc ##### -->
</para>
@templates_doc:
-@Returns:
<!-- ##### FUNCTION lgl_xml_template_parse_template_node ##### -->
}
+/**
+ * lgl_template_frame_ellipse_new:
+ * @id: ID of frame. (This should currently always be "0").
+ * @w: width of frame in points.
+ * @h: height of frame in points.
+ * @r: radius of rounded corners in points. (Should be 0 for square corners.)
+ * @x_waste: Amount of overprint to allow in the horizontal direction.
+ * @y_waste: Amount of overprint to allow in the vertical direction.
+ *
+ * This function creates a new template frame for an elliptical label or card.
+ *
+ * Returns: Pointer to newly allocated #lglTemplateFrame structure.
+ *
+ */
+lglTemplateFrame *
+lgl_template_frame_ellipse_new (const gchar *id,
+ gdouble w,
+ gdouble h,
+ gdouble waste)
+{
+ lglTemplateFrame *frame;
+
+ frame = g_new0 (lglTemplateFrame, 1);
+
+ frame->shape = LGL_TEMPLATE_FRAME_SHAPE_ELLIPSE;
+ frame->ellipse.id = g_strdup (id);
+
+ frame->ellipse.w = w;
+ frame->ellipse.h = h;
+ frame->ellipse.waste = waste;
+
+ return frame;
+}
+
+
/**
* lgl_template_frame_round_new:
* @id: ID of frame. (This should currently always be "0").
*w = frame->rect.w;
*h = frame->rect.h;
break;
+ case LGL_TEMPLATE_FRAME_SHAPE_ELLIPSE:
+ *w = frame->ellipse.w;
+ *h = frame->ellipse.h;
+ break;
case LGL_TEMPLATE_FRAME_SHAPE_ROUND:
*w = 2.0 * frame->round.r;
*h = 2.0 * frame->round.r;
}
+/**
+ * lgl_template_markup_ellipse_new:
+ * @x1: x coordinate of top-left corner of ellipse.
+ * @y1: y coordinate of top-left corner of ellipse.
+ * @w: width of ellipse.
+ * @h: height of ellipse.
+ *
+ * This function creates a new ellipse markup structure.
+ *
+ * Returns: a newly allocated #lglTemplateMarkup structure.
+ *
+ */
+lglTemplateMarkup *
+lgl_template_markup_ellipse_new (gdouble x1,
+ gdouble y1,
+ gdouble w,
+ gdouble h)
+{
+ lglTemplateMarkup *markup;
+
+ markup = g_new0 (lglTemplateMarkup, 1);
+
+ markup->type = LGL_TEMPLATE_MARKUP_ELLIPSE;
+ markup->ellipse.x1 = x1;
+ markup->ellipse.y1 = y1;
+ markup->ellipse.w = w;
+ markup->ellipse.h = h;
+
+ return markup;
+}
+
+
/**
* lgl_template_dup:
* @orig_template: Template to duplicate.
orig_frame->rect.y_waste);
break;
+ case LGL_TEMPLATE_FRAME_SHAPE_ELLIPSE:
+ frame =
+ lgl_template_frame_ellipse_new (orig_frame->all.id,
+ orig_frame->ellipse.w,
+ orig_frame->ellipse.h,
+ orig_frame->ellipse.waste);
+ break;
+
case LGL_TEMPLATE_FRAME_SHAPE_ROUND:
frame =
lgl_template_frame_round_new (orig_frame->all.id,
typedef union _lglTemplateFrame lglTemplateFrame;
typedef struct _lglTemplateFrameAll lglTemplateFrameAll;
typedef struct _lglTemplateFrameRect lglTemplateFrameRect;
+typedef struct _lglTemplateFrameEllipse lglTemplateFrameEllipse;
typedef struct _lglTemplateFrameRound lglTemplateFrameRound;
typedef struct _lglTemplateFrameCD lglTemplateFrameCD;
typedef struct _lglTemplateMarkupLine lglTemplateMarkupLine;
typedef struct _lglTemplateMarkupCircle lglTemplateMarkupCircle;
typedef struct _lglTemplateMarkupRect lglTemplateMarkupRect;
+typedef struct _lglTemplateMarkupEllipse lglTemplateMarkupEllipse;
typedef struct _lglTemplateOrigin lglTemplateOrigin;
*/
typedef enum {
LGL_TEMPLATE_FRAME_SHAPE_RECT,
+ LGL_TEMPLATE_FRAME_SHAPE_ELLIPSE,
LGL_TEMPLATE_FRAME_SHAPE_ROUND,
LGL_TEMPLATE_FRAME_SHAPE_CD,
} lglTemplateFrameShape;
gdouble y_waste; /* Amount of vert overprint allowed. */
};
+struct _lglTemplateFrameEllipse {
+
+ /* Begin Common Fields */
+ lglTemplateFrameShape shape; /* Always LGL_TEMPLATE_FRAME_SHAPE_ELLIPSE. */
+
+ gchar *id; /* Id, currently always "0" */
+ GList *layouts; /* List of lglTemplateLayouts */
+ GList *markups; /* List of lglTemplateMarkups */
+ /* End Common Fields */
+
+ gdouble w; /* Width */
+ gdouble h; /* Height */
+ gdouble waste; /* Amount of overprint allowed. */
+};
+
struct _lglTemplateFrameRound {
/* Begin Common Fields */
union _lglTemplateFrame{
- lglTemplateFrameShape shape;
+ lglTemplateFrameShape shape;
- lglTemplateFrameAll all;
- lglTemplateFrameRect rect;
- lglTemplateFrameRound round;
- lglTemplateFrameCD cd;
+ lglTemplateFrameAll all;
+ lglTemplateFrameRect rect;
+ lglTemplateFrameEllipse ellipse;
+ lglTemplateFrameRound round;
+ lglTemplateFrameCD cd;
};
LGL_TEMPLATE_MARKUP_LINE,
LGL_TEMPLATE_MARKUP_CIRCLE,
LGL_TEMPLATE_MARKUP_RECT,
+ LGL_TEMPLATE_MARKUP_ELLIPSE,
} lglTemplateMarkupType;
gdouble r; /* Radius of corners. */
};
+struct _lglTemplateMarkupEllipse {
+
+ lglTemplateMarkupType type; /* Always LGL_TEMPLATE_MARKUP_ELLIPSE */
+
+ gdouble x1, y1; /* Upper left corner */
+ gdouble w, h; /* Width and height. */
+};
+
union _lglTemplateMarkup {
- lglTemplateMarkupType type;
+ lglTemplateMarkupType type;
- lglTemplateMarkupMargin margin;
- lglTemplateMarkupLine line;
- lglTemplateMarkupCircle circle;
- lglTemplateMarkupRect rect;
+ lglTemplateMarkupMargin margin;
+ lglTemplateMarkupLine line;
+ lglTemplateMarkupCircle circle;
+ lglTemplateMarkupRect rect;
+ lglTemplateMarkupEllipse ellipse;
};
void lgl_template_add_frame (lglTemplate *template,
lglTemplateFrame *frame);
+lglTemplateAlias *lgl_template_alias_new (const gchar *brand,
+ const gchar *part);
+
lglTemplateFrame *lgl_template_frame_rect_new (const gchar *id,
gdouble w,
gdouble h,
gdouble x_waste,
gdouble y_waste);
-lglTemplateAlias *lgl_template_alias_new (const gchar *brand,
- const gchar *part);
+lglTemplateFrame *lgl_template_frame_ellipse_new (const gchar *id,
+ gdouble w,
+ gdouble h,
+ gdouble waste);
lglTemplateFrame *lgl_template_frame_round_new (const gchar *id,
gdouble r,
gdouble h,
gdouble r);
+lglTemplateMarkup *lgl_template_markup_ellipse_new (gdouble x1,
+ gdouble y1,
+ gdouble w,
+ gdouble h);
+
lglTemplate *lgl_template_dup (const lglTemplate *orig_template);
void lgl_template_free (lglTemplate *template);
lglTemplate *template);
static void xml_parse_label_rectangle_node (xmlNodePtr label_node,
lglTemplate *template);
+static void xml_parse_label_ellipse_node (xmlNodePtr label_node,
+ lglTemplate *template);
static void xml_parse_label_round_node (xmlNodePtr label_node,
lglTemplate *template);
static void xml_parse_label_cd_node (xmlNodePtr label_node,
lglTemplateFrame *frame);
static void xml_parse_markup_rect_node (xmlNodePtr markup_node,
lglTemplateFrame *frame);
+static void xml_parse_markup_ellipse_node (xmlNodePtr markup_node,
+ lglTemplateFrame *frame);
static void xml_parse_alias_node (xmlNodePtr alias_node,
lglTemplate *template);
static void xml_create_markup_rect_node (const lglTemplateMarkup *circle,
xmlNodePtr root,
const xmlNsPtr ns);
+static void xml_create_markup_ellipse_node (const lglTemplateMarkup *circle,
+ xmlNodePtr root,
+ const xmlNsPtr ns);
static void xml_create_alias_node (const lglTemplateAlias *alias,
xmlNodePtr root,
const xmlNsPtr ns);
xml_parse_meta_node (node, template);
} else if (lgl_xml_is_node (node, "Label-rectangle")) {
xml_parse_label_rectangle_node (node, template);
+ } else if (lgl_xml_is_node (node, "Label-ellipse")) {
+ xml_parse_label_ellipse_node (node, template);
} else if (lgl_xml_is_node (node, "Label-round")) {
xml_parse_label_round_node (node, template);
} else if (lgl_xml_is_node (node, "Label-cd")) {
}
}
+
/*--------------------------------------------------------------------------*/
/* PRIVATE. Parse XML Template->Label-rectangle Node. */
/*--------------------------------------------------------------------------*/
xml_parse_markup_circle_node (node, frame);
} else if (lgl_xml_is_node (node, "Markup-rect")) {
xml_parse_markup_rect_node (node, frame);
+ } else if (lgl_xml_is_node (node, "Markup-ellipse")) {
+ xml_parse_markup_ellipse_node (node, frame);
+ } else if (!xmlNodeIsText (node)) {
+ if (!lgl_xml_is_node (node, "comment")) {
+ g_message ("bad node = \"%s\"",node->name);
+ }
+ }
+ }
+
+ g_free (id);
+}
+
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE. Parse XML Template->Label-ellipse Node. */
+/*--------------------------------------------------------------------------*/
+static void
+xml_parse_label_ellipse_node (xmlNodePtr label_node,
+ lglTemplate *template)
+{
+ gchar *id;
+ gchar *tmp;
+ gdouble waste;
+ gdouble w, h;
+ lglTemplateFrame *frame;
+ xmlNodePtr node;
+
+ id = lgl_xml_get_prop_string (label_node, "id", NULL);
+
+ w = lgl_xml_get_prop_length (label_node, "width", 0);
+ h = lgl_xml_get_prop_length (label_node, "height", 0);
+ waste = lgl_xml_get_prop_length (label_node, "waste", 0);
+
+ frame = lgl_template_frame_ellipse_new ((gchar *)id, w, h, waste);
+ lgl_template_add_frame (template, frame);
+
+ for (node = label_node->xmlChildrenNode; node != NULL;
+ node = node->next) {
+ if (lgl_xml_is_node (node, "Layout")) {
+ xml_parse_layout_node (node, frame);
+ } else if (lgl_xml_is_node (node, "Markup-margin")) {
+ xml_parse_markup_margin_node (node, frame);
+ } else if (lgl_xml_is_node (node, "Markup-line")) {
+ xml_parse_markup_line_node (node, frame);
+ } else if (lgl_xml_is_node (node, "Markup-circle")) {
+ xml_parse_markup_circle_node (node, frame);
+ } else if (lgl_xml_is_node (node, "Markup-rect")) {
+ xml_parse_markup_rect_node (node, frame);
+ } else if (lgl_xml_is_node (node, "Markup-ellipse")) {
+ xml_parse_markup_ellipse_node (node, frame);
} else if (!xmlNodeIsText (node)) {
if (!lgl_xml_is_node (node, "comment")) {
g_message ("bad node = \"%s\"",node->name);
g_free (id);
}
+
/*--------------------------------------------------------------------------*/
/* PRIVATE. Parse XML Template->Label-round Node. */
/*--------------------------------------------------------------------------*/
xml_parse_markup_circle_node (node, frame);
} else if (lgl_xml_is_node (node, "Markup-rect")) {
xml_parse_markup_rect_node (node, frame);
+ } else if (lgl_xml_is_node (node, "Markup-ellipse")) {
+ xml_parse_markup_ellipse_node (node, frame);
} else if (!xmlNodeIsText (node)) {
if (!lgl_xml_is_node (node, "comment")) {
g_message ("bad node = \"%s\"",node->name);
xml_parse_markup_circle_node (node, frame);
} else if (lgl_xml_is_node (node, "Markup-rect")) {
xml_parse_markup_rect_node (node, frame);
+ } else if (lgl_xml_is_node (node, "Markup-ellipse")) {
+ xml_parse_markup_ellipse_node (node, frame);
} else if (!xmlNodeIsText (node)) {
if (!lgl_xml_is_node (node, "comment")) {
g_message ("bad node = \"%s\"",node->name);
}
+
/*--------------------------------------------------------------------------*/
/* PRIVATE. Parse XML Template->Label->Markup-rect Node. */
/*--------------------------------------------------------------------------*/
}
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE. Parse XML Template->Label->Markup-ellipse Node. */
+/*--------------------------------------------------------------------------*/
+static void
+xml_parse_markup_ellipse_node (xmlNodePtr markup_node,
+ lglTemplateFrame *frame)
+{
+ gdouble x1, y1, w, h, r;
+ xmlNodePtr node;
+
+ x1 = lgl_xml_get_prop_length (markup_node, "x1", 0);
+ y1 = lgl_xml_get_prop_length (markup_node, "y1", 0);
+ w = lgl_xml_get_prop_length (markup_node, "w", 0);
+ h = lgl_xml_get_prop_length (markup_node, "h", 0);
+
+ lgl_template_frame_add_markup (frame, lgl_template_markup_ellipse_new (x1, y1, w, h));
+
+ for (node = markup_node->xmlChildrenNode; node != NULL;
+ node = node->next) {
+ if (!xmlNodeIsText (node)) {
+ if (!lgl_xml_is_node (node, "comment")) {
+ g_message ("bad node = \"%s\"",node->name);
+ }
+ }
+ }
+
+}
+
+
/*--------------------------------------------------------------------------*/
/* PRIVATE. Parse XML Template->Alias Node. */
/*--------------------------------------------------------------------------*/
lgl_xml_set_prop_length (node, "y_waste", frame->rect.y_waste);
break;
+ case LGL_TEMPLATE_FRAME_SHAPE_ELLIPSE:
+ node = xmlNewChild(root, ns, (xmlChar *)"Label-ellipse", NULL);
+ lgl_xml_set_prop_string (node, "id", frame->all.id);
+ lgl_xml_set_prop_length (node, "width", frame->ellipse.w);
+ lgl_xml_set_prop_length (node, "height", frame->ellipse.h);
+ lgl_xml_set_prop_length (node, "waste", frame->ellipse.waste);
+ break;
+
case LGL_TEMPLATE_FRAME_SHAPE_ROUND:
node = xmlNewChild(root, ns, (xmlChar *)"Label-round", NULL);
lgl_xml_set_prop_string (node, "id", frame->all.id);
case LGL_TEMPLATE_MARKUP_RECT:
xml_create_markup_rect_node (markup, node, ns);
break;
+ case LGL_TEMPLATE_MARKUP_ELLIPSE:
+ xml_create_markup_ellipse_node (markup, node, ns);
+ break;
default:
g_message ("Unknown markup type");
break;
}
+
/*--------------------------------------------------------------------------*/
/* PRIVATE. Add XML Template->Label->Markup-rect Node. */
/*--------------------------------------------------------------------------*/
}
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE. Add XML Template->Label->Markup-ellipse Node. */
+/*--------------------------------------------------------------------------*/
+static void
+xml_create_markup_ellipse_node (const lglTemplateMarkup *markup,
+ xmlNodePtr root,
+ const xmlNsPtr ns)
+{
+ xmlNodePtr node;
+
+ node = xmlNewChild(root, ns, (xmlChar *)"Markup-ellipse", NULL);
+
+ lgl_xml_set_prop_length (node, "x1", markup->ellipse.x1);
+ lgl_xml_set_prop_length (node, "y1", markup->ellipse.y1);
+ lgl_xml_set_prop_length (node, "w", markup->ellipse.w);
+ lgl_xml_set_prop_length (node, "h", markup->ellipse.h);
+
+}
+
+
/*--------------------------------------------------------------------------*/
/* PRIVATE. Add XML Template->Alias Node. */
/*--------------------------------------------------------------------------*/
const lglTemplate *template,
gboolean rotate_flag,
gboolean waste_flag);
+static void gl_cairo_ellipse_label_path (cairo_t *cr,
+ const lglTemplate *template,
+ gboolean rotate_flag,
+ gboolean waste_flag);
static void gl_cairo_round_label_path (cairo_t *cr,
const lglTemplate *template,
gboolean rotate_flag,
gl_cairo_rect_label_path (cr, template, rotate_flag, waste_flag);
break;
+ case LGL_TEMPLATE_FRAME_SHAPE_ELLIPSE:
+ gl_cairo_ellipse_label_path (cr, template, rotate_flag, waste_flag);
+ break;
+
case LGL_TEMPLATE_FRAME_SHAPE_ROUND:
gl_cairo_round_label_path (cr, template, rotate_flag, waste_flag);
break;
}
+/*--------------------------------------------------------------------------*/
+/* Create elliptical label path */
+/*--------------------------------------------------------------------------*/
+static void
+gl_cairo_ellipse_label_path (cairo_t *cr,
+ const lglTemplate *template,
+ gboolean rotate_flag,
+ gboolean waste_flag)
+{
+ const lglTemplateFrame *frame;
+ gdouble w, h;
+ gdouble waste;
+
+ gl_debug (DEBUG_PATH, "START");
+
+ frame = (lglTemplateFrame *)template->frames->data;
+
+ if (rotate_flag)
+ {
+ lgl_template_frame_get_size (frame, &h, &w);
+ }
+ else
+ {
+ lgl_template_frame_get_size (frame, &w, &h);
+ }
+
+ waste = 0.0;
+ if (waste_flag)
+ {
+ waste = frame->ellipse.waste;
+ }
+
+ cairo_save (cr);
+ cairo_translate (cr, -waste, -waste);
+ gl_cairo_ellipse_path (cr, (w+waste)/2.0, (h+waste)/2.0);
+ cairo_restore (cr);
+
+ gl_debug (DEBUG_PATH, "END");
+}
+
+
/*--------------------------------------------------------------------------*/
/* Create round label path */
/*--------------------------------------------------------------------------*/
const lglTemplateMarkup *markup,
glLabel *label);
+static void gl_cairo_markup_margin_ellipse_path (cairo_t *cr,
+ const lglTemplateMarkup *markup,
+ glLabel *label);
+
static void gl_cairo_markup_margin_round_path (cairo_t *cr,
const lglTemplateMarkup *markup,
glLabel *label);
static void gl_cairo_markup_rect_path (cairo_t *cr,
const lglTemplateMarkup *markup);
+static void gl_cairo_markup_ellipse_path (cairo_t *cr,
+ const lglTemplateMarkup *markup);
+
/*--------------------------------------------------------------------------*/
/* Create markup path */
case LGL_TEMPLATE_MARKUP_RECT:
gl_cairo_markup_rect_path (cr, markup);
break;
+ case LGL_TEMPLATE_MARKUP_ELLIPSE:
+ gl_cairo_markup_ellipse_path (cr, markup);
+ break;
default:
g_message ("Unknown template markup type");
break;
gl_cairo_markup_margin_rect_path (cr, markup, label);
break;
+ case LGL_TEMPLATE_FRAME_SHAPE_ELLIPSE:
+ gl_cairo_markup_margin_ellipse_path (cr, markup, label);
+ break;
+
case LGL_TEMPLATE_FRAME_SHAPE_ROUND:
gl_cairo_markup_margin_round_path (cr, markup, label);
break;
}
+/*---------------------------------------------------------------------------*/
+/* PRIVATE. Draw elliptical margin. */
+/*---------------------------------------------------------------------------*/
+static void
+gl_cairo_markup_margin_ellipse_path (cairo_t *cr,
+ const lglTemplateMarkup *markup,
+ glLabel *label)
+{
+ const lglTemplate *template;
+ const lglTemplateFrame *frame;
+ gdouble w, h, r, m;
+
+ gl_debug (DEBUG_PATH, "START");
+
+ template = gl_label_get_template (label);
+ frame = (lglTemplateFrame *)template->frames->data;
+
+ m = markup->margin.size;
+
+ lgl_template_frame_get_size (frame, &w, &h);
+ w = w - 2*m;
+ h = h - 2*m;
+
+ cairo_save (cr);
+ cairo_translate (cr, m, m);
+ gl_cairo_ellipse_path (cr, w/2.0, h/2.0);
+ cairo_restore (cr);
+
+ gl_debug (DEBUG_PATH, "END");
+}
+
+
/*---------------------------------------------------------------------------*/
/* PRIVATE. Draw round margin. */
/*---------------------------------------------------------------------------*/
}
+/*---------------------------------------------------------------------------*/
+/* PRIVATE. Draw ellipse markup. */
+/*---------------------------------------------------------------------------*/
+static void
+gl_cairo_markup_ellipse_path (cairo_t *cr,
+ const lglTemplateMarkup *markup)
+{
+ gdouble x1 = markup->ellipse.x1;
+ gdouble y1 = markup->ellipse.y1;
+ gdouble w = markup->ellipse.w;
+ gdouble h = markup->ellipse.h;
+
+ gl_debug (DEBUG_PATH, "START");
+
+ cairo_save (cr);
+ cairo_translate (cr, x1, y1);
+ gl_cairo_ellipse_path (cr, w/2.0, h/2.0);
+ cairo_restore (cr);
+
+ gl_debug (DEBUG_PATH, "END");
+}
+
+
/*
* Local Variables: -- emacs
CBR |
MSI |
PLS |
- IEC16022)"
+ IEC16022)"
-->
<!-- Data encoding method -->
<!-- :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -->
<!-- Template Section -->
<!-- :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -->
-<!ENTITY % label_element "Label-rectangle | Label-round | Label-cd">
+<!ENTITY % label_element "Label-rectangle | Label-round | Label-ellipse | Label-cd">
<!ENTITY % markup_element "Markup-margin | Markup-line | Markup-circle | Markup-rect">
<!ELEMENT Template (Meta*, (%label_element;)*, Alias*)>
brand %STRING_TYPE; #REQUIRED
part %STRING_TYPE; #REQUIRED
name %STRING_TYPE; #IMPLIED
- equiv %STRING_TYPE; #IMPLIED
+ equiv %STRING_TYPE; #IMPLIED
size %STRING_TYPE; #IMPLIED
width %LENGTH_TYPE; #IMPLIED
height %LENGTH_TYPE; #IMPLIED
waste %LENGTH_TYPE; #IMPLIED
>
+<!ELEMENT Label-ellipse ((%markup_element;)*, Layout+)>
+<!ATTLIST Label-ellipse
+ id %STRING_TYPE; #REQUIRED
+ width %LENGTH_TYPE; #REQUIRED
+ height %LENGTH_TYPE; #REQUIRED
+ waste %LENGTH_TYPE; #IMPLIED
+>
+
<!ELEMENT Label-cd ((%markup_element;)*, Layout+)>
<!ATTLIST Label-cd
id %STRING_TYPE; #REQUIRED
<!ENTITY % shadow_attrs
"shadow %BOOLEAN_TYPE; #IMPLIED
- shadow_x %FLOAT_TYPE; #IMPLIED
- shadow_y %FLOAT_TYPE; #IMPLIED
- shadow_color %UINT_TYPE; #IMPLIED
- shadow_opacity %FLOAT_TYPE; #IMPLIED"
+ shadow_x %FLOAT_TYPE; #IMPLIED
+ shadow_y %FLOAT_TYPE; #IMPLIED
+ shadow_color %UINT_TYPE; #IMPLIED
+ shadow_opacity %FLOAT_TYPE; #IMPLIED"
>
<!ELEMENT Object-text (Span)>
font_weight %FONT_WEIGHT_TYPE; #IMPLIED
font_italic %BOOLEAN_TYPE; #IMPLIED
color %UINT_TYPE; #IMPLIED
- color_field %STRING_TYPE; #IMPLIED
+ color_field %STRING_TYPE; #IMPLIED
line_spacing %LENGTH_TYPE; #IMPLIED
>