diff options
author | Dodji Seketeli <dodji@src.gnome.org> | 2003-04-12 16:50:32 +0000 |
---|---|---|
committer | Dodji Seketeli <dodji@src.gnome.org> | 2003-04-12 16:50:32 +0000 |
commit | 17114030e0e37f93682c903dd818da1f0e2e6f6b (patch) | |
tree | f52286082af39c649dfbc86015ab080ac2a55abd /src/cr-style.c | |
parent | 4f5560ef67d35121d1087aee9b5e34dece012d8a (diff) | |
download | libcroco-17114030e0e37f93682c903dd818da1f0e2e6f6b.tar.gz |
big tree layout cleanup.
Dodji.
Diffstat (limited to 'src/cr-style.c')
-rw-r--r-- | src/cr-style.c | 1349 |
1 files changed, 0 insertions, 1349 deletions
diff --git a/src/cr-style.c b/src/cr-style.c deleted file mode 100644 index a9404ba..0000000 --- a/src/cr-style.c +++ /dev/null @@ -1,1349 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode:nil; c-basic-offset: 8-*- */ - -/* - * This file is part of The Croco Library - * - * Copyright (C) 2002-2003 Dodji Seketeli <dodji@seketeli.org> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2.1 of - * the GNU Lesser General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the - * GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -/* - *$Id$ - */ -#include <string.h> -#include "cr-style.h" - -/** - *@file - *The definition of the #CRStyle class. - */ - - -/** - *A property ID. - *Each css property has an ID which is - *en entry into a property "population" jump table. - *each entry of the property population jump table - *contains code to tranform the literal form of - *a property value into a strongly typed value. - */ -enum CRPropertyID -{ - PROP_NOT_KNOWN, - PROP_PADDING_TOP, - PROP_PADDING_RIGHT, - PROP_PADDING_BOTTOM, - PROP_PADDING_LEFT, - PROP_BORDER_TOP_WIDTH, - PROP_BORDER_RIGHT_WIDTH, - PROP_BORDER_BOTTOM_WIDTH, - PROP_BORDER_LEFT_WIDTH, - PROP_BORDER_TOP_STYLE, - PROP_BORDER_RIGHT_STYLE, - PROP_BORDER_BOTTOM_STYLE, - PROP_BORDER_LEFT_STYLE, - PROP_MARGIN_TOP, - PROP_MARGIN_RIGHT, - PROP_MARGIN_BOTTOM, - PROP_MARGIN_LEFT, - PROP_DISPLAY, - PROP_POSITION, - PROP_TOP, - PROP_RIGHT, - PROP_BOTTOM, - PROP_LEFT, - PROP_FLOAT, - PROP_WIDTH -} ; - - -typedef struct _CRPropertyDesc CRPropertyDesc ; - -struct _CRPropertyDesc -{ - const guchar * name ; - enum CRPropertyID prop_id ; -} ; - -static CRPropertyDesc gv_prop_table [] = - -{ - {"padding-top", PROP_PADDING_TOP}, - {"padding-right", PROP_PADDING_RIGHT}, - {"padding-bottom", PROP_PADDING_BOTTOM}, - {"padding-left", PROP_PADDING_LEFT}, - {"border-top-width", PROP_BORDER_TOP_WIDTH}, - {"border-right-width", PROP_BORDER_RIGHT_WIDTH}, - {"border-bottom-width", PROP_BORDER_BOTTOM_WIDTH}, - {"border-left-width", PROP_BORDER_LEFT_WIDTH}, - {"border-top-style", PROP_BORDER_TOP_STYLE}, - {"border-right-style", PROP_BORDER_RIGHT_STYLE}, - {"border-bottom-style", PROP_BORDER_BOTTOM_STYLE}, - {"border-left-style", PROP_BORDER_LEFT_STYLE}, - {"margin-top", PROP_MARGIN_TOP}, - {"margin-right", PROP_MARGIN_RIGHT}, - {"margin-bottom", PROP_MARGIN_BOTTOM}, - {"margin-left", PROP_MARGIN_LEFT}, - {"display", PROP_DISPLAY}, - {"position", PROP_POSITION}, - {"top", PROP_TOP}, - {"right", PROP_RIGHT}, - {"bottom", PROP_BOTTOM}, - {"left", PROP_LEFT}, - {"float", PROP_FLOAT}, - {"width", PROP_WIDTH}, - {NULL, 0} - -} ; - -/** - *A the key/value pair of this hash table - *are: - *key => name of the the css propertie found in gv_prop_table - *value => matching property id found in gv_prop_table. - *So this hash table is here just to retrieval of a property id - *from a property name. - */ -static GHashTable *gv_prop_hash = NULL ; - -/** - *incremented by each new instance of #CRStyle - *and decremented at the it destroy time. - *When this reaches zero, gv_prop_hash is destroyed. - */ -static gulong gv_prop_hash_ref_count = 0 ; - -static enum CRStatus -cr_style_init_properties (void) ; - -enum CRDirection -{ - DIR_TOP, - DIR_RIGHT, - DIR_BOTTOM, - DIR_LEFT -} ; - -static enum CRStatus -cr_style_set_props_to_defaults (CRStyle *a_this) ; - -static enum CRStatus -set_prop_padding_x_from_value (CRStyle *a_style, - CRTerm *a_value, - enum CRDirection a_dir) ; - -static enum CRStatus -set_prop_border_x_width_from_value (CRStyle *a_style, - CRTerm *a_value, - enum CRDirection a_dir) ; - -static enum CRStatus -set_prop_border_x_style_from_value (CRStyle *a_style, - CRTerm *a_value, - enum CRDirection a_dir) ; - -static enum CRStatus -set_prop_margin_x_from_value (CRStyle *a_style, CRTerm *a_value, - enum CRDirection a_dir) ; - -static enum CRStatus -set_prop_display_from_value (CRStyle *a_style, CRTerm *a_value) ; - -static enum CRStatus -set_prop_position_from_value (CRStyle *a_style, CRTerm *a_value) ; - -static enum CRStatus -set_prop_x_from_value (CRStyle *a_style, CRTerm *a_value, - enum CRDirection a_dir) ; - -static enum CRStatus -set_prop_float (CRStyle *a_style, CRTerm *a_value) ; - -static enum CRStatus -set_prop_width (CRStyle *a_style, CRTerm *a_value) ; - -static enum CRStatus -cr_style_init_properties (void) -{ - - if (!gv_prop_hash) - { - gulong i = 0 ; - - gv_prop_hash = g_hash_table_new (g_str_hash, - g_str_equal) ; - if (!gv_prop_hash) - { - cr_utils_trace_info ("Out of memory") ; - return CR_ERROR ; - } - - /*load gv_prop_hash from gv_prop_table*/ - for (i = 0 ; gv_prop_table[i].name ; i++) - { - g_hash_table_insert - (gv_prop_hash, - (gpointer)gv_prop_table[i].name, - GINT_TO_POINTER - (gv_prop_table[i].prop_id)) ; - } - } - - return CR_OK ; -} - -/** - *Sets the style properties to their default values - *according to the css2 spec. - *@param a_this the current instance of #CRStyle. - *@return CR_OK upon successfull completion, an error code otherwise. - */ -static enum CRStatus -cr_style_set_props_to_defaults (CRStyle *a_this) -{ - g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ; - - cr_num_set (&a_this->padding_top, - 0, NUM_LENGTH_PX) ; - - cr_num_set (&a_this->padding_top, - 0, NUM_LENGTH_PX) ; - cr_num_set (&a_this->padding_right, - 0, NUM_LENGTH_PX) ; - cr_num_set (&a_this->padding_bottom, - 0, NUM_LENGTH_PX) ; - cr_num_set (&a_this->padding_left, - 0, NUM_LENGTH_PX) ; - - cr_num_set (&a_this->border_top_width, - 0, BORDER_MEDIUM) ; - cr_num_set (&a_this->border_right_width, - 0, BORDER_MEDIUM) ; - cr_num_set (&a_this->border_bottom_width, - 0, BORDER_MEDIUM) ; - cr_num_set (&a_this->border_left_width, - 0, BORDER_MEDIUM) ; - - /*default foreground color is black*/ - cr_rgb_set (&a_this->color, 0, 0, 0, - FALSE) ; - cr_rgb_set_from_rgb (&a_this->border_top_color, - &a_this->color) ; - cr_rgb_set_from_rgb (&a_this->border_right_color, - &a_this->color) ; - cr_rgb_set_from_rgb (&a_this->border_bottom_color, - &a_this->color) ; - cr_rgb_set_from_rgb (&a_this->border_left_color, - &a_this->color) ; - - a_this->border_top_style = BORDER_STYLE_NONE ; - a_this->border_right_style = BORDER_STYLE_NONE ; - a_this->border_bottom_style = BORDER_STYLE_NONE ; - a_this->border_left_style = BORDER_STYLE_NONE ; - - cr_num_set (&a_this->margin_top, 0, NUM_LENGTH_PX) ; - cr_num_set (&a_this->margin_right, 0, NUM_LENGTH_PX) ; - cr_num_set (&a_this->margin_bottom, 0, NUM_LENGTH_PX) ; - cr_num_set (&a_this->margin_left, 0, NUM_LENGTH_PX) ; - - a_this->display = DISPLAY_INLINE ; - a_this->position = POSITION_STATIC ; - - a_this->top.type = OFFSET_AUTO; - cr_num_set (&a_this->top.num, 0, NUM_LENGTH_PX) ; - a_this->right.type = OFFSET_AUTO; - cr_num_set (&a_this->right.num, 0, NUM_LENGTH_PX) ; - a_this->bottom.type = OFFSET_AUTO; - cr_num_set (&a_this->bottom.num, 0, NUM_LENGTH_PX) ; - a_this->left.type = OFFSET_AUTO; - cr_num_set (&a_this->left.num, 0, NUM_LENGTH_PX) ; - - a_this->float_type = FLOAT_NONE ; - - a_this->width.type = WIDTH_AUTO ; - cr_num_set (&a_this->width.num, 0, NUM_LENGTH_PX) ; - - a_this->parent_style = NULL ; - - return CR_OK ; -} - - -static enum CRPropertyID -cr_style_get_prop_id (const guchar * a_prop) -{ - gpointer * raw_id = NULL ; - - if (!gv_prop_hash) - { - cr_style_init_properties () ; - } - - raw_id = g_hash_table_lookup (gv_prop_hash, - a_prop) ; - if (!raw_id) - { - return PROP_NOT_KNOWN ; - } - return GPOINTER_TO_INT (raw_id) ; -} - - -static enum CRStatus -set_prop_padding_x_from_value (CRStyle *a_style, - CRTerm *a_value, - enum CRDirection a_dir) -{ - enum CRStatus status = CR_OK ; - CRNum *num_val = NULL, *parent_num_val = NULL ; - - g_return_val_if_fail (a_style && a_value, CR_BAD_PARAM_ERROR) ; - - if (a_value->type != TERM_NUMBER - && a_value->type != TERM_IDENT) - return CR_BAD_PARAM_ERROR ; - - switch (a_dir) - { - case DIR_TOP: - num_val = &a_style->padding_top ; - parent_num_val = &a_style->parent_style->padding_top ; - break ; - - case DIR_RIGHT: - num_val = &a_style->padding_right ; - parent_num_val = &a_style->parent_style->padding_right ; - break ; - - case DIR_BOTTOM: - num_val = &a_style->padding_bottom ; - parent_num_val = &a_style->parent_style->padding_bottom ; - break ; - - case DIR_LEFT: - num_val = & a_style->padding_left ; - parent_num_val = &a_style->parent_style->padding_left ; - break ; - - default: - return CR_BAD_PARAM_ERROR ; - } - - if (a_value->type == TERM_IDENT) - { - if (a_value->content.str - && a_value->content.str->str - && !strncmp ((guchar*)"inherited", - a_value->content.str->str, - strlen ("inherited"))) - { - cr_num_copy (num_val, parent_num_val) ; - return CR_OK ; - } - else - return CR_UNKNOWN_TYPE_ERROR ; - } - - g_return_val_if_fail (a_value->type == TERM_NUMBER - && a_value->content.num, - CR_UNKNOWN_TYPE_ERROR) ; - - switch (a_value->content.num->type) - { - case NUM_LENGTH_EM: - case NUM_LENGTH_EX: - case NUM_LENGTH_PX: - case NUM_LENGTH_IN: - case NUM_LENGTH_CM: - case NUM_LENGTH_MM: - case NUM_LENGTH_PT: - case NUM_LENGTH_PC: - case NUM_PERCENTAGE: - status = cr_num_copy (num_val, a_value->content.num) ; - break ; - default: - status = CR_UNKNOWN_TYPE_ERROR ; - break ; - } - - return status ; -} - - -static enum CRStatus -set_prop_border_x_width_from_value (CRStyle *a_style, - CRTerm *a_value, - enum CRDirection a_dir) -{ - enum CRStatus status = CR_OK ; - CRNum *num_val = NULL, *parent_num_val = NULL ; - - g_return_val_if_fail (a_value - && a_style->parent_style, - CR_BAD_PARAM_ERROR) ; - - switch (a_dir) - { - case DIR_TOP: - num_val = &a_style->border_top_width ; - parent_num_val = - &a_style->parent_style->border_top_width ; - break ; - - case DIR_RIGHT: - num_val = - &a_style->border_right_width ; - - parent_num_val = - &a_style->parent_style->border_right_width; - - break ; - - case DIR_BOTTOM: - num_val = &a_style->border_bottom_width ; - parent_num_val = - &a_style->parent_style->border_bottom_width; - break ; - - case DIR_LEFT: - num_val = &a_style->border_left_width ; - parent_num_val = - &a_style->parent_style->border_left_width; - break ; - - default: - break ; - } - - - if (a_value->type == TERM_IDENT) - { - if (a_value->content.str && a_value->content.str->str) - { - if (!strncmp ("thin", - a_value->content.str->str, - strlen ("thin"))) - { - cr_num_set (num_val, BORDER_THIN, - NUM_LENGTH_PX) ; - } - else if (!strncmp ("medium", - a_value->content.str->str, - strlen ("medium"))) - { - cr_num_set (num_val, BORDER_MEDIUM, - NUM_LENGTH_PX) ; - } - else if (!strncmp ("thick", - a_value->content.str->str, - strlen ("thick"))) - { - cr_num_set (num_val, BORDER_THICK, - NUM_LENGTH_PX) ; - } - else - { - return CR_UNKNOWN_TYPE_ERROR ; - } - } - } - else if (a_value->type != TERM_NUMBER - || a_value->content.num == NULL) - { - return CR_UNKNOWN_TYPE_ERROR ; - } - - - switch (a_value->content.num->type) - { - case NUM_GENERIC: - case NUM_LENGTH_EM: - case NUM_LENGTH_EX: - case NUM_LENGTH_PX: - case NUM_LENGTH_IN: - case NUM_LENGTH_CM: - case NUM_LENGTH_MM: - case NUM_LENGTH_PT: - case NUM_LENGTH_PC: - status = cr_num_copy (num_val, a_value->content.num) ; - break ; - default : - status = CR_ERROR ; - break ; - } - - return status ; -} - - -static enum CRStatus -set_prop_border_x_style_from_value (CRStyle *a_style, - CRTerm *a_value, - enum CRDirection a_dir) -{ - g_return_val_if_fail (a_style && a_value, - CR_BAD_PARAM_ERROR) ; - - enum CRStatus status = CR_OK ; - enum CRBorderStyle *border_style_ptr, *parent_border_style_ptr ; - - g_return_val_if_fail (a_value - && a_style->parent_style, - CR_BAD_PARAM_ERROR) ; - - switch (a_dir) - { - case DIR_TOP: - border_style_ptr = &a_style->border_top_style ; - parent_border_style_ptr = - &a_style->parent_style->border_top_style ; - break ; - - case DIR_RIGHT: - border_style_ptr = - &a_style->border_right_style ; - - parent_border_style_ptr = - &a_style->parent_style->border_right_style; - - break ; - - case DIR_BOTTOM: - border_style_ptr = &a_style->border_bottom_style ; - parent_border_style_ptr = - &a_style->parent_style->border_bottom_style; - break ; - - case DIR_LEFT: - border_style_ptr = &a_style->border_left_style ; - parent_border_style_ptr = - &a_style->parent_style->border_left_style; - break ; - - default: - break ; - } - - if (a_value->type != TERM_IDENT - || !a_value->content.str) - { - return CR_UNKNOWN_TYPE_ERROR ; - } - - if (!strncmp ("none", - a_value->content.str->str, - strlen ("none"))) - { - *border_style_ptr = BORDER_STYLE_NONE ; - } - else if (!strncmp ("hidden", - a_value->content.str->str, - strlen ("hidden"))) - { - *border_style_ptr = BORDER_STYLE_HIDDEN ; - } - else if (!strncmp ("dotted", - a_value->content.str->str, - strlen ("dotted"))) - { - *border_style_ptr = BORDER_STYLE_DOTTED ; - } - else if (!strncmp ("dashed", - a_value->content.str->str, - strlen ("dashed"))) - { - *border_style_ptr = BORDER_STYLE_DASHED ; - } - else if (!strncmp ("solid", - a_value->content.str->str, - strlen ("solid"))) - { - *border_style_ptr = BORDER_STYLE_SOLID ; - } - else if (!strncmp ("double", - a_value->content.str->str, - strlen ("double"))) - { - *border_style_ptr = BORDER_STYLE_DOUBLE ; - } - else if (!strncmp ("groove", - a_value->content.str->str, - strlen ("groove"))) - { - *border_style_ptr = BORDER_STYLE_GROOVE ; - } - else if (!strncmp ("ridge", - a_value->content.str->str, - strlen ("ridge"))) - { - *border_style_ptr = BORDER_STYLE_RIDGE ; - } - else if (!strncmp ("inset", - a_value->content.str->str, - strlen ("inset"))) - { - *border_style_ptr = BORDER_STYLE_INSET ; - } - else if (!strncmp ("outset", - a_value->content.str->str, - strlen ("outset"))) - { - *border_style_ptr = BORDER_STYLE_OUTSET ; - } - else if (!strncmp ("inherit", - a_value->content.str->str, - strlen ("inherit"))) - { - *border_style_ptr = *parent_border_style_ptr ; - } - else - { - status = CR_UNKNOWN_TYPE_ERROR ; - } - - return status ; -} - -static enum CRStatus -set_prop_margin_x_from_value (CRStyle *a_style, CRTerm *a_value, - enum CRDirection a_dir) -{ - enum CRStatus status = CR_OK ; - CRNum *num_val = NULL, *parent_num_val = NULL ; - - g_return_val_if_fail (a_style && a_value, - CR_BAD_PARAM_ERROR) ; - - switch (a_dir) - { - case DIR_TOP: - num_val = &a_style->margin_top ; - parent_num_val = - &a_style->parent_style->margin_top ; - break ; - - case DIR_RIGHT: - num_val = - &a_style->margin_right ; - - parent_num_val = - &a_style->parent_style->margin_right ; - break ; - - case DIR_BOTTOM: - num_val = &a_style->margin_bottom ; - parent_num_val = - &a_style->parent_style->margin_bottom ; - break ; - - case DIR_LEFT: - num_val = &a_style->margin_left ; - parent_num_val = - &a_style->parent_style->margin_left ; - break ; - - default: - break ; - } - - switch (a_value->type) - { - case TERM_IDENT: - if (a_value->content.str - && a_value->content.str->str - && !strncmp (a_value->content.str->str, - "inherit", strlen ("inherit"))) - { - status = cr_num_copy (num_val, parent_num_val) ; - } - else if (a_value->content.str - && a_value->content.str->str - && !strncmp (a_value->content.str->str, - "auto", strlen ("auto"))) - { - status = cr_num_set (num_val, 0.0, NUM_AUTO) ; - } - else - { - status = CR_UNKNOWN_TYPE_ERROR ; - } - - case TERM_NUMBER: - status = cr_num_copy (num_val, a_value->content.num) ; - break ; - - default: - status = CR_UNKNOWN_TYPE_ERROR ; - break ; - } - - return status ; -} - -struct CRPropDisplayValPair -{ - const guchar *prop_name ; - enum CRDisplayType type; -} ; - -static enum CRStatus -set_prop_display_from_value (CRStyle *a_style, CRTerm *a_value) -{ - enum CRDisplayType default_display_val = DISPLAY_INLINE ; - static const struct CRPropDisplayValPair disp_vals_map[] = - { - {"none", DISPLAY_NONE}, - {"inline", DISPLAY_INLINE}, - {"block", DISPLAY_BLOCK}, - {"run-in", DISPLAY_RUN_IN}, - {"compact", DISPLAY_COMPACT}, - {"marker", DISPLAY_MARKER}, - {"table", DISPLAY_TABLE}, - {"inline-table", DISPLAY_INLINE_TABLE}, - {"table-row-group", DISPLAY_TABLE_ROW_GROUP}, - {"table-header-group", DISPLAY_TABLE_HEADER_GROUP}, - {"table-footer-group", DISPLAY_TABLE_FOOTER_GROUP}, - {"table-row", DISPLAY_TABLE_ROW}, - {"table-column-group", DISPLAY_TABLE_COLUMN_GROUP}, - {"table-column", DISPLAY_TABLE_COLUMN}, - {"table-cell", DISPLAY_TABLE_CELL}, - {"table-caption", DISPLAY_TABLE_CAPTION}, - {"inherit", DISPLAY_INHERIT}, - {NULL, DISPLAY_NONE} - } ; - - g_return_val_if_fail (a_style && a_value, CR_BAD_PARAM_ERROR) ; - - /*Sets to its default value according to the css2 spec.*/ - a_style->display = default_display_val ; - - switch (a_value->type) - { - case TERM_IDENT: - { - int i = 0 ; - - if (!a_value->content.str || !a_value->content.str->str) - break ; - - for (i = 0; disp_vals_map[i].prop_name ; i++) - { - if (!strncmp (disp_vals_map[i].prop_name, - a_value->content.str->str, - strlen - (disp_vals_map[i].prop_name))) - { - a_style->display = disp_vals_map[i].type ; - break ; - } - } - - if (a_style->display == DISPLAY_INHERIT) - { - if (a_style->parent_style) - { - a_style->display = - a_style->parent_style->display ; - } - else - { - a_style->display = default_display_val ; - } - } - } - break ; - - default : - break ; - } - - return CR_OK ; -} - -struct CRPropPositionValPair -{ - const guchar * name ; - enum CRPositionType type ; -} ; - -static enum CRStatus -set_prop_position_from_value (CRStyle *a_style, CRTerm *a_value) -{ - enum CRStatus status = CR_UNKNOWN_PROP_VAL_ERROR ; - static const struct CRPropPositionValPair position_vals_map [] = - { - {"static", POSITION_STATIC}, - {"relative", POSITION_RELATIVE}, - {"absolute", POSITION_ABSOLUTE}, - {"fixed", POSITION_FIXED}, - {"inherited", POSITION_INHERIT}, - {NULL, POSITION_STATIC} - /*must alwas be the last one*/ - } ; - - g_return_val_if_fail (a_value, CR_BAD_PARAM_ERROR) ; - - /*set to it's default value according to the css2 spec*/ - a_style->position = POSITION_STATIC ; - - switch (a_value->type) - { - case TERM_IDENT: - { - int i = 0 ; - - if (!a_value->content.str || !a_value->content.str->str) - break ; - - for (i = 0; position_vals_map[i].name ; i++) - { - if (!strncmp (position_vals_map[i].name, - a_value->content.str->str, - strlen (position_vals_map[i].name))) - { - a_style->position = - position_vals_map[i].type ; - status = CR_OK ; - break ; - } - } - if (a_style->position == POSITION_INHERIT) - { - if (a_style->parent_style) - { - a_style->position = - a_style->parent_style->position ; - } - else - { - a_style->position = POSITION_STATIC ; - } - } - } - break ; - - default: - break ; - } - - return CR_OK ; -} - -static enum CRStatus -set_prop_x_from_value (CRStyle *a_style, CRTerm *a_value, - enum CRDirection a_dir) -{ - CRBoxOffset *box_offset = NULL, *parent_box_offset = NULL ; - - g_return_val_if_fail (a_style && a_value, CR_BAD_PARAM_ERROR) ; - - - if (!(a_value->type == TERM_NUMBER) - && !(a_value->type == TERM_IDENT)) - { - return CR_UNKNOWN_PROP_VAL_ERROR ; - } - - switch (a_dir) - { - case DIR_TOP: - box_offset = &a_style->top ; - if (a_style->parent_style) - parent_box_offset = &a_style->parent_style->top ; - break ; - case DIR_RIGHT: - box_offset = &a_style->right ; - if (a_style->parent_style) - parent_box_offset = &a_style->parent_style->right ; - break ; - case DIR_BOTTOM: - box_offset = &a_style->bottom ; - if (a_style->parent_style) - parent_box_offset = - &a_style->parent_style->bottom; - break ; - case DIR_LEFT: - box_offset = &a_style->left ; - if (a_style->parent_style) - parent_box_offset = &a_style->parent_style->left ; - break ; - - default: - break ; - } - - box_offset->type = OFFSET_AUTO ; - - if (a_value->type == TERM_NUMBER - && a_value->content.num) - { - cr_num_copy (&box_offset->num, a_value->content.num) ; - box_offset->type = OFFSET_DEFINED ; - } - else if (a_value->type == TERM_IDENT - && a_value->content.str - && a_value->content.str->str) - { - if (!strncmp ("inherit", - a_value->content.str->str, - strlen ("inherit"))) - { - cr_num_copy (&box_offset->num, - &parent_box_offset->num) ; - box_offset->type = OFFSET_DEFINED ; - } - else if (!strncmp ("auto", - a_value->content.str->str, - strlen ("auto"))) - { - box_offset->type = OFFSET_AUTO ; - } - } - - return CR_OK ; -} - - -static enum CRStatus -set_prop_float (CRStyle *a_style, CRTerm *a_value) -{ - g_return_val_if_fail (a_style && a_value, CR_BAD_PARAM_ERROR) ; - - /*the default float type as specified by the css2 spec*/ - a_style->float_type = FLOAT_NONE ; - - if (a_value->type != TERM_IDENT - || !a_value->content.str - || !a_value->content.str->str) - {/*unknow type, the float type is set to it's default value*/ - return CR_OK ; - } - - if (!strncmp ("none", - a_value->content.str->str, - strlen ("none"))) - { - a_style->float_type = FLOAT_NONE ; - } - else if (!strncmp ("left", - a_value->content.str->str, - strlen ("left"))) - { - a_style->float_type = FLOAT_LEFT ; - } - else if (!strncmp ("right", - a_value->content.str->str, - strlen ("right"))) - { - a_style->float_type = FLOAT_RIGHT ; - } - else if (!strncmp ("inherit", - a_value->content.str->str, - strlen ("inherit"))) - { - a_style->float_type = - a_style->parent_style->float_type ; - } - - return CR_OK ; -} - - -static enum CRStatus -set_prop_width (CRStyle *a_style, CRTerm *a_value) -{ - g_return_val_if_fail (a_style && a_value, CR_BAD_PARAM_ERROR) ; - - - a_style->width.type = WIDTH_AUTO ; - - if (a_value->type == TERM_IDENT) - { - if (a_value->content.str - && a_value->content.str->str) - { - if (!strncmp ("auto", - a_value->content.str->str, - strlen ("auto"))) - { - a_style->width.type = WIDTH_AUTO ; - } - else if (!strncmp ("inherit", - a_value->content.str->str, - strlen ("inherit"))) - { - a_style->width.type = - a_style->parent_style->width.type; - - cr_num_copy - (&a_style->width.num, - &a_style->parent_style->width.num); - } - } - } - else if (a_value->type == TERM_NUMBER) - { - if (a_value->content.num) - { - cr_num_copy (&a_style->width.num, - a_value->content.num) ; - a_style->width.type = WIDTH_DEFINED ; - } - } - - return CR_OK ; -} - - -/** - *Default constructor of #CRStyle. - */ -CRStyle * -cr_style_new (void) -{ - CRStyle *result = NULL ; - - result = g_try_malloc (sizeof (CRStyle)) ; - if (!result) - { - cr_utils_trace_info ("Out of memory") ; - return NULL ; - } - memset (result, 0, sizeof (CRStyle)) ; - gv_prop_hash_ref_count ++ ; - - /*set the style properties to their default values*/ - cr_style_set_props_to_defaults (result) ; - - return result ; -} - - -/** - *Instanciates a new #CRStyle from a ruleset statement. - *Actually walks through all declarations of the ruleset - *statement and for each of them, sets the corresponding field - *of the CRStyle structure. - *@param a_stmt the ruleset statement. - *@param a_parent_style the parent style: the style of the - *parent xml element. - *@param a_style out parameter. The newly built instance of #CRStyle. - *@return CR_OK upon successfull completion, an error code otherwise. - */ -enum CRStatus -cr_style_new_from_ruleset (CRStatement *a_stmt, - CRStyle *a_parent_style, - CRStyle **a_style) -{ - g_return_val_if_fail (a_stmt - && a_stmt->type == RULESET_STMT - && a_stmt->kind.ruleset, - CR_BAD_PARAM_ERROR) ; - - if (! *a_style) - { - *a_style = cr_style_new () ; - if (! *a_style) - { - cr_utils_trace_info ("Out of memory") ; - return CR_ERROR ; - } - } - - return cr_style_set_style_from_ruleset (*a_style, a_stmt, - a_parent_style) ; -} - -/** - *Sets an instance of #CRStyle from a ruleset type of css2 statement. - *@param a_this the current instance of #CRStyle. - *@param a_stmt the statement the css ruleset statement. - *@param a_parent_style the style of the parent node. - *@return CR_OK upon sucessfull statement, an error code otherwise. - */ -enum CRStatus -cr_style_set_style_from_ruleset (CRStyle *a_this, CRStatement *a_stmt, - CRStyle *a_parent_style) -{ - CRDeclaration *decl = NULL ; - - g_return_val_if_fail (a_this - && a_stmt - && (a_stmt->type == RULESET_STMT), - CR_BAD_PARAM_ERROR) ; - - for (decl = a_stmt->kind.ruleset->decl_list ; - decl ; decl = decl->next) - { - cr_style_set_style_from_decl - (a_this, decl, a_parent_style) ; - } - - return CR_OK ; -} - -/** - *Walks through a css2 property declaration, and populated the - *according field(s) in the #CRStyle structure. - *If the properties or their value(s) are/is not known, - *sets the corresponding field(s) of #CRStyle to its/their default - *value(s) - *@param a_this the instance of #CRStyle to set. - *@param a_decl the declaration from which the #CRStyle fields are set. - *@param a_parent_style the style of the parent xml node. The parent - *xml node is the parent node of the node that generated this style - *structure. - *@return CR_OK upon successfull completion, an error code otherwise. - */ -enum CRStatus -cr_style_set_style_from_decl (CRStyle *a_this, CRDeclaration *a_decl, - CRStyle *a_parent_style) -{ - CRTerm *value = NULL ; - enum CRStatus status = CR_OK ; - - enum CRPropertyID prop_id = PROP_NOT_KNOWN ; - - g_return_val_if_fail (a_this && a_decl - && a_decl - && a_decl->property - && a_decl->property->str, - CR_BAD_PARAM_ERROR) ; - - a_this->parent_style = a_parent_style ; - - prop_id = cr_style_get_prop_id (a_decl->property->str) ; - - value = a_decl->value ; - switch (prop_id) - { - case PROP_PADDING_TOP: - status = set_prop_padding_x_from_value - (a_this, value, DIR_TOP) ; - break ; - - case PROP_PADDING_RIGHT: - status = set_prop_padding_x_from_value - (a_this, value, DIR_RIGHT) ; - break ; - case PROP_PADDING_BOTTOM: - status = set_prop_padding_x_from_value - (a_this, value, DIR_RIGHT) ; - break ; - - case PROP_PADDING_LEFT: - status = set_prop_padding_x_from_value - (a_this, value, DIR_LEFT) ; - break ; - - case PROP_BORDER_TOP_WIDTH: - status = - set_prop_border_x_width_from_value (a_this, value, - DIR_TOP) ; - break ; - - case PROP_BORDER_RIGHT_WIDTH: - status = - set_prop_border_x_width_from_value (a_this, value, - DIR_RIGHT) ; - break ; - - case PROP_BORDER_BOTTOM_WIDTH: - status = - set_prop_border_x_width_from_value (a_this, value, - DIR_BOTTOM) ; - break ; - - case PROP_BORDER_LEFT_WIDTH: - status = - set_prop_border_x_width_from_value (a_this, value, - DIR_BOTTOM) ; - break ; - - case PROP_BORDER_TOP_STYLE: - status = - set_prop_border_x_style_from_value (a_this, value, - DIR_TOP) ; - break ; - - case PROP_BORDER_RIGHT_STYLE: - status = - set_prop_border_x_style_from_value (a_this, value, - DIR_RIGHT) ; - break ; - - case PROP_BORDER_BOTTOM_STYLE: - status = - set_prop_border_x_style_from_value (a_this, value, - DIR_BOTTOM) ; - break ; - - case PROP_BORDER_LEFT_STYLE: - status = - set_prop_border_x_style_from_value (a_this, value, - DIR_LEFT) ; - break ; - - case PROP_MARGIN_TOP: - status = - set_prop_margin_x_from_value (a_this, value, - DIR_TOP) ; - break ; - - case PROP_MARGIN_RIGHT: - status = - set_prop_margin_x_from_value (a_this, value, - DIR_RIGHT) ; - break ; - - case PROP_MARGIN_BOTTOM: - status = - set_prop_margin_x_from_value (a_this, value, - DIR_BOTTOM) ; - break ; - - case PROP_MARGIN_LEFT: - status = - set_prop_margin_x_from_value (a_this, value, - DIR_TOP) ; - break ; - - case PROP_DISPLAY: - status = - set_prop_display_from_value (a_this, value) ; - break ; - - case PROP_POSITION: - status = set_prop_position_from_value (a_this, value) ; - break ; - - case PROP_TOP: - status = set_prop_x_from_value (a_this, value, - DIR_TOP) ; - break ; - - case PROP_RIGHT: - status = set_prop_x_from_value (a_this, value, - DIR_RIGHT) ; - break ; - - case PROP_BOTTOM: - status = set_prop_x_from_value (a_this, value, - DIR_BOTTOM) ; - break ; - - case PROP_LEFT: - status = set_prop_x_from_value (a_this, value, - DIR_LEFT) ; - break ; - - case PROP_FLOAT: - status = set_prop_float (a_this, value) ; - break ; - - case PROP_WIDTH: - status = set_prop_width (a_this, value) ; - break ; - - default: - return CR_UNKNOWN_TYPE_ERROR ; - } - - return status ; -} - -/** - *Increases the reference count - *of the current instance of #CRStyle. - *@param a_this the current instance of #CRStyle. - *@return CR_OK upon successfull completion, an error code - *otherwise. - */ -enum CRStatus -cr_style_ref (CRStyle *a_this) -{ - g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ; - - a_this->ref_count ++ ; - return CR_OK ; -} - - -/** - *Decreases the reference count of - *the current instance of #CRStyle. - *If the reference count reaches 0, the - *instance of #CRStyle is destoyed. - *@param a_this the current instance of #CRStyle. - *@return TRUE if the instance has been destroyed, FALSE - *otherwise. - */ -gboolean -cr_style_unref (CRStyle *a_this) -{ - g_return_val_if_fail (a_this, - FALSE) ; - - if (a_this->ref_count) - a_this->ref_count -- ; - - if (!a_this->ref_count) - { - cr_style_destroy (a_this) ; - return TRUE ; - } - - return FALSE ; -} - -/** - *Duplicates the current instance of #CRStyle . - *The newly created instance of #CRStyle must be - *freed using cr_style_destroy (). - *@param a_this the current instance of #CRStyle. - *@return the newly duplicated instance of #CRStyle. - */ -CRStyle * -cr_style_dup (CRStyle *a_this) -{ - CRStyle *result = NULL ; - - g_return_val_if_fail (a_this, NULL) ; - - result = cr_style_new () ; - if (!result) - { - cr_utils_trace_info ("Out of memory") ; - return NULL ; - } - memcpy (result, a_this, sizeof (CRStyle)) ; - - return result ; -} - -/** - *Destructor of the #CRStyle class. - *@param a_this the instance to destroy. - */ -void -cr_style_destroy (CRStyle *a_this) -{ - g_return_if_fail (a_this) ; - - g_free (a_this) ; -} |