[xml/sgml-commit] r1288 - in /packages/xmlroff/trunk: debian/changelog libfo/ libfo/area/ libfo/area/fo-area-table-row.c
dleidert-guest at users.alioth.debian.org
dleidert-guest at users.alioth.debian.org
Mon Dec 1 00:23:12 UTC 2008
Author: dleidert-guest
Date: Mon Dec 1 00:23:11 2008
New Revision: 1288
URL: http://svn.debian.org/wsvn/debian-xml-sgml/?sc=1&rev=1288
Log:
xmlroff (0.6.0-1.1) unstable; urgency=low
* Non-maintainer upload.
* Eliminate segfault in fo-area-table-row.c
fo_area_table_row_split_before_height.
Closes: #494227
Added:
packages/xmlroff/trunk/libfo/
packages/xmlroff/trunk/libfo/area/
packages/xmlroff/trunk/libfo/area/fo-area-table-row.c
Modified:
packages/xmlroff/trunk/debian/changelog
Modified: packages/xmlroff/trunk/debian/changelog
URL: http://svn.debian.org/wsvn/debian-xml-sgml/packages/xmlroff/trunk/debian/changelog?rev=1288&op=diff
==============================================================================
--- packages/xmlroff/trunk/debian/changelog (original)
+++ packages/xmlroff/trunk/debian/changelog Mon Dec 1 00:23:11 2008
@@ -1,8 +1,11 @@
-xmlroff (0.6.0-2) UNRELEASED; urgency=low
+xmlroff (0.6.0-1.1) unstable; urgency=low
- * NOT RELEASED YET
+ * Non-maintainer upload.
+ * Eliminate segfault in fo-area-table-row.c
+ fo_area_table_row_split_before_height.
+ Closes: #494227
- -- Daniel Leidert (dale) <daniel.leidert at wgdd.de> Tue, 08 Jul 2008 12:01:52 +0200
+ -- Thomas Viehmann <tv at beamnet.de> Sun, 24 Aug 2008 21:45:53 +0200
xmlroff (0.6.0-1) unstable; urgency=low
Added: packages/xmlroff/trunk/libfo/area/fo-area-table-row.c
URL: http://svn.debian.org/wsvn/debian-xml-sgml/packages/xmlroff/trunk/libfo/area/fo-area-table-row.c?rev=1288&op=file
==============================================================================
--- packages/xmlroff/trunk/libfo/area/fo-area-table-row.c (added)
+++ packages/xmlroff/trunk/libfo/area/fo-area-table-row.c Mon Dec 1 00:23:11 2008
@@ -1,0 +1,463 @@
+/* Fo
+ * fo-area-table-row.c: Area object for table-row formatting objects
+ *
+ * Copyright (C) 2001 Sun Microsystems
+ * Copyright (C) 2007 Menteith Consulting Ltd
+ *
+ * See COPYING for the status of this software.
+ */
+
+#include "fo-utils.h"
+#include "fo-area.h"
+#include "fo-area-private.h"
+#include "fo-area-area.h"
+#include "fo-area-area-private.h"
+#include "fo-area-table-row.h"
+#include "fo-area-table-cell.h"
+#include "fo/fo-table-row.h"
+#include "property/fo-property-block-progression-dimension.h"
+
+struct _FoAreaTableRow
+{
+ FoAreaArea parent_instance;
+};
+
+struct _FoAreaTableRowClass
+{
+ FoAreaAreaClass parent_class;
+};
+
+static void fo_area_table_row_class_init (FoAreaTableRowClass *klass);
+static void fo_area_table_row_finalize (GObject *object);
+
+static void fo_area_table_row_debug_dump_properties (FoArea *area,
+ gint depth);
+static FoArea* fo_area_table_row_size_request (FoArea *child);
+static FoArea* fo_area_table_row_split_before_height (FoArea *area,
+ gfloat max_height);
+static gboolean fo_area_table_row_split_before_height_check (FoArea *area,
+ gfloat max_height);
+
+static gpointer parent_class;
+
+/**
+ * fo_area_table_row_get_type:
+ * @void:
+ *
+ * Register the FoTableRow object type.
+ *
+ * Return value: GType value of the FoTableRow object type.
+ **/
+GType
+fo_area_table_row_get_type (void)
+{
+ static GType object_type = 0;
+
+ if (!object_type)
+ {
+ static const GTypeInfo object_info =
+ {
+ sizeof (FoAreaTableRowClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ (GClassInitFunc) fo_area_table_row_class_init,
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof (FoAreaTableRow),
+ 0, /* n_preallocs */
+ NULL, /* instance_init */
+ NULL /* value_table */
+ };
+
+ object_type = g_type_register_static (FO_TYPE_AREA_AREA,
+ "FoAreaTableRow",
+ &object_info, 0);
+ }
+
+ return object_type;
+}
+
+/**
+ * fo_area_table_row_class_init:
+ * @klass: FoTableRowClass object to initialise
+ *
+ * Implements GClassInitFunc for FoTableRowClass
+ **/
+void
+fo_area_table_row_class_init (FoAreaTableRowClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ FoAreaClass *area_class = FO_AREA_CLASS (klass);
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ object_class->finalize = fo_area_table_row_finalize;
+
+ area_class->debug_dump_properties = fo_area_table_row_debug_dump_properties;
+ area_class->size_request = fo_area_table_row_size_request;
+ area_class->split_before_height = fo_area_table_row_split_before_height;
+ area_class->split_before_height_check =
+ fo_area_table_row_split_before_height_check;
+
+}
+
+/**
+ * fo_area_table_row_finalize:
+ * @object: FoTableRow object to finalize
+ *
+ * Implements GObjectFinalizeFunc for FoTableRow
+ **/
+void
+fo_area_table_row_finalize (GObject *object)
+{
+ FoAreaTableRow *fo_area_table_row;
+
+ fo_area_table_row = FO_AREA_TABLE_ROW (object);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+
+/**
+ * fo_area_table_row_new:
+ *
+ * Creates a new #FoAreaTableRow initialized to default value.
+ *
+ * Return value: the new #FoAreaTableRow
+ **/
+FoArea*
+fo_area_table_row_new (void)
+{
+ return FO_AREA (g_object_new (fo_area_table_row_get_type (), NULL));
+}
+
+
+/**
+ * fo_area_table_row_debug_dump_properties:
+ * @area: The #FoArea object
+ * @depth: Indent level to add to the output
+ *
+ * Logs the value of each significant property of @area then calls
+ * debug_dump_properties method of parent class.
+ **/
+void
+fo_area_table_row_debug_dump_properties (FoArea *area, gint depth)
+{
+ FoAreaTableRow *table_row;
+ gchar *indent = g_strnfill (depth * 2, ' ');
+
+ g_return_if_fail (area != NULL);
+ g_return_if_fail (FO_IS_AREA_TABLE_ROW (area));
+
+ table_row = FO_AREA_TABLE_ROW (area);
+
+ g_free (indent);
+ FO_AREA_CLASS (parent_class)->debug_dump_properties (area, depth + 1);
+}
+
+/**
+ * fo_area_table_row_size_request:
+ * @child: Child area
+ *
+ * Check that the parent area of @child has sufficient space for
+ * @child. If not enough space, request that the parent has
+ * sufficient space allocated for it, then adjust @child and its
+ * siblings as necessary to fit into the resized parent area.
+ *
+ * Return value: Pointer to the last area generated from @child after
+ * any reallocation and resizing
+ **/
+FoArea*
+fo_area_table_row_size_request (FoArea *child)
+{
+ FoArea *use_child_area;
+ FoArea *table_row;
+ FoDatatype *fo_row_bpdim;
+ gfloat max_child_height = 0;
+ gfloat table_row_child_available_ipdim;
+ gfloat table_row_child_available_bpdim;
+ gfloat table_row_use_height = 0;
+ gfloat child_height;
+
+ g_return_val_if_fail (child != NULL, NULL);
+ g_return_val_if_fail (FO_IS_AREA_AREA (child), NULL);
+ g_return_val_if_fail (!FO_AREA_IS_ROOT (child), NULL);
+ g_return_val_if_fail (fo_area_parent (child) != NULL, NULL);
+ g_return_val_if_fail (FO_IS_AREA_TABLE_ROW (fo_area_parent (child)), NULL);
+
+ child_height = fo_area_area_get_height (child);
+
+ table_row = fo_area_parent (child);
+ table_row_child_available_ipdim =
+ MAX (fo_area_get_available_width (table_row),
+ 0);
+ table_row_child_available_bpdim =
+ MAX (fo_area_get_available_height (table_row),
+ 0);
+
+ /* The simple case is when a cell needs less bpdim than was needed
+ for a previous cell in the row. */
+ if (child_height <= table_row_child_available_bpdim)
+ {
+ fo_area_set_available_height (child,
+ table_row_child_available_bpdim);
+ return child;
+ }
+
+ use_child_area = fo_area_first_child (table_row);
+
+ while (use_child_area)
+ {
+ max_child_height =
+ MAX (max_child_height,
+ fo_area_area_get_height (use_child_area));
+ use_child_area = fo_area_next_sibling (use_child_area);
+ }
+
+ fo_row_bpdim =
+ fo_property_get_value (fo_table_row_get_block_progression_dimension (table_row->generated_by));
+
+ if (FO_IS_LENGTH_RANGE (fo_row_bpdim))
+ {
+ FoDatatype *min_datatype = fo_length_range_get_minimum (fo_row_bpdim);
+ FoDatatype *opt_datatype = fo_length_range_get_optimum (fo_row_bpdim);
+ FoDatatype *max_datatype = fo_length_range_get_maximum (fo_row_bpdim);
+
+ if (FO_IS_LENGTH (min_datatype) &&
+ max_child_height <= fo_length_get_value (min_datatype))
+ {
+ table_row_use_height = fo_length_get_value (min_datatype);
+
+#if defined(LIBFO_DEBUG) && 0
+ g_message ("table_row_size_request:: child: %g; min: %g",
+ max_child_height,
+ fo_length_get_value (min_datatype));
+#endif
+ }
+ else if (FO_IS_LENGTH (opt_datatype) &&
+ fo_length_get_value (opt_datatype) < max_child_height)
+ {
+ table_row_use_height = fo_length_get_value (opt_datatype);
+
+#if defined(LIBFO_DEBUG) && 0
+ g_message ("table_row_size_request:: child: %g; opt: %g",
+ max_child_height,
+ fo_length_get_value (opt_datatype));
+#endif
+ }
+ else if (FO_IS_LENGTH (max_datatype) &&
+ fo_length_get_value (max_datatype) < max_child_height)
+ {
+ table_row_use_height = fo_length_get_value (max_datatype);
+
+#if defined(LIBFO_DEBUG) && 0
+ g_message ("table_row_size_request:: child: %g; max: %g",
+ max_child_height,
+ fo_length_get_value (max_datatype));
+#endif
+ }
+ else
+ {
+ table_row_use_height = max_child_height;
+ }
+ }
+ else
+ {
+ g_assert_not_reached ();
+ }
+
+ if (table_row_child_available_bpdim < table_row_use_height)
+ {
+ fo_area_area_set_height (table_row, table_row_use_height);
+ table_row = fo_area_size_request (table_row);
+ table_row_child_available_ipdim = fo_area_get_available_width (table_row);
+ fo_area_set_child_available_ipdim (table_row,
+ table_row_child_available_ipdim);
+ table_row_child_available_bpdim = fo_area_get_available_height (table_row);
+ fo_area_set_child_available_bpdim (table_row,
+ table_row_child_available_bpdim);
+ }
+
+ use_child_area = fo_area_first_child (table_row);
+ max_child_height = 0;
+
+ while (use_child_area)
+ {
+ max_child_height =
+ MAX (max_child_height,
+ fo_area_area_get_height (use_child_area));
+ use_child_area = fo_area_next_sibling (use_child_area);
+ }
+
+ if (max_child_height <= table_row_child_available_bpdim)
+ {
+ use_child_area = fo_area_first_child (table_row);
+
+ while (use_child_area)
+ {
+ fo_area_set_available_width (use_child_area,
+ table_row_child_available_ipdim);
+ fo_area_set_available_height (use_child_area,
+ table_row_child_available_bpdim);
+ /* FIXME: Shouldn't setting available height set off something
+ in child to make it set its own height? */
+ fo_area_area_set_height (use_child_area,
+ table_row_child_available_bpdim);
+ use_child_area = fo_area_next_sibling (use_child_area);
+ }
+
+ /* FIXME: Should this be last area in FO's glist of areas?
+ Currently is *not* the last area of child unless child is
+ the last child of table_row (which is only true when child
+ appended to table_row). */
+ return fo_area_last_child (table_row);
+ }
+ else
+ {
+ use_child_area = fo_area_first_child (table_row);
+
+ while (use_child_area)
+ {
+ if (fo_area_area_get_height (use_child_area) <=
+ table_row_child_available_bpdim)
+ {
+ fo_area_set_available_height (use_child_area,
+ table_row_child_available_bpdim);
+ fo_area_set_available_width (use_child_area,
+ table_row_child_available_ipdim);
+ fo_area_area_set_height (use_child_area,
+ table_row_child_available_bpdim);
+
+ use_child_area = fo_area_next_sibling (use_child_area);
+ }
+ else
+ {
+ use_child_area =
+ fo_area_split_before_height (use_child_area,
+ table_row_child_available_bpdim);
+ table_row = fo_area_parent (use_child_area);
+ table_row_child_available_ipdim =
+ fo_area_get_available_width (table_row);
+ fo_area_set_child_available_ipdim (table_row,
+ table_row_child_available_ipdim);
+ table_row_child_available_bpdim =
+ fo_area_get_available_height (table_row);
+ fo_area_set_child_available_bpdim (table_row,
+ table_row_child_available_bpdim);
+
+ /* Don't change use_child_area since need to test
+ again against table_row_child_available_bpdim. */
+ }
+ }
+ return fo_area_last_child (table_row);
+ }
+}
+
+/* return the new area containing what comes after the split */
+/* leave @area as area remaining after split */
+FoArea*
+fo_area_table_row_split_before_height (FoArea *area,
+ gfloat max_height)
+{
+ FoArea *use_child_area;
+ gboolean can_split = TRUE;
+
+ g_return_val_if_fail (FO_IS_AREA_TABLE_ROW (area), NULL);
+ g_return_val_if_fail (fo_area_n_children (area) > 0, NULL);
+ g_return_val_if_fail (max_height > 0, NULL);
+
+ use_child_area = fo_area_first_child (area);
+
+ while (use_child_area && can_split)
+ {
+ gfloat child_height = fo_area_area_get_height (use_child_area);
+
+ can_split &= ((child_height <= max_height) ||
+ fo_area_split_before_height_check (use_child_area,
+ max_height));
+
+ use_child_area = fo_area_next_sibling (use_child_area);
+ }
+
+ if (can_split)
+ {
+ FoArea *split_child;
+ FoArea *clone = fo_area_clone (area);
+ gfloat max_remaining_child_height = 0;
+ gfloat max_split_child_height = 0;
+
+ /*
+ area->is_last = FALSE;
+
+ clone->is_first = FALSE;
+ ((FoAreaArea *)clone)->border_before = 0;
+ */
+
+ use_child_area = fo_area_first_child (area);
+
+ while (use_child_area)
+ {
+ split_child = fo_area_split_before_height (use_child_area,
+ max_height);
+
+ if (split_child != NULL)
+ {
+ fo_area_unlink (split_child);
+ fo_area_append (clone, split_child);
+
+ max_remaining_child_height =
+ MAX (max_remaining_child_height,
+ fo_area_area_get_height (use_child_area));
+ max_split_child_height =
+ MAX (max_split_child_height,
+ fo_area_area_get_height (split_child));
+ }
+ else
+ g_warning ("Need better fix.");
+
+ use_child_area = fo_area_next_sibling (use_child_area);
+ }
+
+ fo_area_area_set_height (area, max_remaining_child_height);
+ fo_area_area_set_height (clone, max_split_child_height);
+
+ /*
+ fo_area_size_request (area);
+ fo_area_size_request (clone);
+ */
+
+ return clone;
+ }
+ else
+ {
+ return NULL;
+ }
+}
+/* return the new area containing what comes after the split */
+/* leave @area as area remaining after split */
+gboolean
+fo_area_table_row_split_before_height_check (FoArea *area,
+ gfloat max_height)
+{
+ FoArea *use_child_area;
+ gboolean can_split = TRUE;
+
+ g_return_val_if_fail (FO_IS_AREA_TABLE_ROW (area), FALSE);
+ g_return_val_if_fail (fo_area_n_children (area) > 0, FALSE);
+ g_return_val_if_fail (max_height > 0, FALSE);
+
+ use_child_area = fo_area_first_child (area);
+
+ while (use_child_area && can_split)
+ {
+ gfloat child_height = fo_area_area_get_height (use_child_area);
+
+ can_split &= ((child_height <= max_height) ||
+ fo_area_split_before_height_check (use_child_area,
+ max_height));
+
+ use_child_area = fo_area_next_sibling (use_child_area);
+ }
+
+ return can_split;
+}
More information about the debian-xml-sgml-commit
mailing list