Exemplo n.º 1
0
css_error css__cascade_text_transform(uint32_t opv, css_style *style, 
		css_select_state *state)
{
	uint16_t value = CSS_TEXT_TRANSFORM_INHERIT;
	
	UNUSED(style);

	if (isInherit(opv) == false) {
		switch (getValue(opv)) {
		case TEXT_TRANSFORM_CAPITALIZE:
			value = CSS_TEXT_TRANSFORM_CAPITALIZE;
			break;
		case TEXT_TRANSFORM_UPPERCASE:
			value = CSS_TEXT_TRANSFORM_UPPERCASE;
			break;
		case TEXT_TRANSFORM_LOWERCASE:
			value = CSS_TEXT_TRANSFORM_LOWERCASE;
			break;
		case TEXT_TRANSFORM_NONE:
			value = CSS_TEXT_TRANSFORM_NONE;
			break;
		}
	}

	if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
			isInherit(opv))) {
		return set_text_transform(state->computed, value);
	}

	return CSS_OK;
}
Exemplo n.º 2
0
css_error css__cascade_border_spacing(uint32_t opv, css_style *style, 
		css_select_state *state)
{
	uint16_t value = CSS_BORDER_SPACING_INHERIT;
	css_fixed hlength = 0;
	css_fixed vlength = 0;
	uint32_t hunit = UNIT_PX;
	uint32_t vunit = UNIT_PX;

	if (isInherit(opv) == false) {
		value = CSS_BORDER_SPACING_SET;
		hlength = *((css_fixed *) style->bytecode);
		advance_bytecode(style, sizeof(hlength));
		hunit = *((uint32_t *) style->bytecode);
		advance_bytecode(style, sizeof(hunit));

		vlength = *((css_fixed *) style->bytecode);
		advance_bytecode(style, sizeof(vlength));
		vunit = *((uint32_t *) style->bytecode);
		advance_bytecode(style, sizeof(vunit));
	}

	hunit = css__to_css_unit(hunit);
	vunit = css__to_css_unit(vunit);

	if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
			isInherit(opv))) {
		return set_border_spacing(state->computed, value,
				hlength, hunit, vlength, vunit);
	}

	return CSS_OK;
}
Exemplo n.º 3
0
css_error css__cascade_table_layout(uint32_t opv, css_style *style, 
		css_select_state *state)
{
	uint16_t value = CSS_TABLE_LAYOUT_INHERIT;

	UNUSED(style);

	if (isInherit(opv) == false) {
		switch (getValue(opv)) {
		case TABLE_LAYOUT_AUTO:
			value = CSS_TABLE_LAYOUT_AUTO;
			break;
		case TABLE_LAYOUT_FIXED:
			value = CSS_TABLE_LAYOUT_FIXED;
			break;
		}
	}

	if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
			isInherit(opv))) {
		return set_table_layout(state->computed, value);
	}

	return CSS_OK;
}
Exemplo n.º 4
0
css_error css__cascade_overflow_y(uint32_t opv, css_style *style, 
		css_select_state *state)
{
	uint16_t value = CSS_OVERFLOW_INHERIT;

	UNUSED(style);

	if (isInherit(opv) == false) {
		switch (getValue(opv)) {
		case OVERFLOW_VISIBLE:
			value = CSS_OVERFLOW_VISIBLE;
			break;
		case OVERFLOW_HIDDEN:
			value = CSS_OVERFLOW_HIDDEN;
			break;
		case OVERFLOW_SCROLL:
			value = CSS_OVERFLOW_SCROLL;
			break;
		case OVERFLOW_AUTO:
			value = CSS_OVERFLOW_AUTO;
			break;
		}
	}

	if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
			isInherit(opv))) {
		return set_overflow_y(state->computed, value);
	}

	return CSS_OK;
}
Exemplo n.º 5
0
css_error css__cascade_column_rule_style(uint32_t opv, css_style *style, 
		css_select_state *state)
{
	UNUSED(style);

	if (isInherit(opv) == false) {
		switch (getValue(opv)) {
		case COLUMN_RULE_STYLE_NONE:
		case COLUMN_RULE_STYLE_HIDDEN:
		case COLUMN_RULE_STYLE_DOTTED:
		case COLUMN_RULE_STYLE_DASHED:
		case COLUMN_RULE_STYLE_SOLID:
		case COLUMN_RULE_STYLE_DOUBLE:
		case COLUMN_RULE_STYLE_GROOVE:
		case COLUMN_RULE_STYLE_RIDGE:
		case COLUMN_RULE_STYLE_INSET:
		case COLUMN_RULE_STYLE_OUTSET:
			/** \todo convert to public values */
			break;
		}
	}

	if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
			isInherit(opv))) {
		/** \todo set computed elevation */
	}

	return CSS_OK;
}
Exemplo n.º 6
0
css_error css__cascade_background_attachment(uint32_t opv, css_style *style, 
		css_select_state *state)
{
	uint16_t value = CSS_BACKGROUND_ATTACHMENT_INHERIT;

	UNUSED(style);

	if (isInherit(opv) == false) {
		switch (getValue(opv)) {
		case BACKGROUND_ATTACHMENT_FIXED:
			value = CSS_BACKGROUND_ATTACHMENT_FIXED;
			break;
		case BACKGROUND_ATTACHMENT_SCROLL:
			value = CSS_BACKGROUND_ATTACHMENT_SCROLL;
			break;
		}
	}

	if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
			isInherit(opv))) {
		return set_background_attachment(state->computed, value);
	}

	return CSS_OK;
}
Exemplo n.º 7
0
css_error css__cascade_pitch(uint32_t opv, css_style *style, 
		css_select_state *state)
{
	css_fixed freq = 0;
	uint32_t unit = UNIT_HZ;

	if (isInherit(opv) == false) {
		switch (getValue(opv)) {
		case PITCH_FREQUENCY:
			freq = *((css_fixed *) style->bytecode);
			advance_bytecode(style, sizeof(freq));
			unit = *((uint32_t *) style->bytecode);
			advance_bytecode(style, sizeof(unit));
			break;
		case PITCH_X_LOW:
		case PITCH_LOW:
		case PITCH_MEDIUM:
		case PITCH_HIGH:
		case PITCH_X_HIGH:
			/** \todo convert to public values */
			break;
		}
	}

	unit = css__to_css_unit(unit);

	if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
			isInherit(opv))) {
		/** \todo pitch */
	}

	return CSS_OK;
}
Exemplo n.º 8
0
css_error css__cascade_visibility(uint32_t opv, css_style *style, 
		css_select_state *state)
{
	uint16_t value = CSS_VISIBILITY_INHERIT;

	UNUSED(style);

	if (isInherit(opv) == false) {
		switch (getValue(opv)) {
		case VISIBILITY_VISIBLE:
			value = CSS_VISIBILITY_VISIBLE;
			break;
		case VISIBILITY_HIDDEN:
			value = CSS_VISIBILITY_HIDDEN;
			break;
		case VISIBILITY_COLLAPSE:
			value = CSS_VISIBILITY_COLLAPSE;
			break;
		}
	}

	if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
			isInherit(opv))) {
		return set_visibility(state->computed, value);
	}

	return CSS_OK;
}
Exemplo n.º 9
0
css_error css__cascade_caption_side(uint32_t opv, css_style *style, 
		css_select_state *state)
{
	uint16_t value = CSS_CAPTION_SIDE_INHERIT;

	UNUSED(style);

	if (isInherit(opv) == false) {
		switch (getValue(opv)) {
		case CAPTION_SIDE_TOP:
			value = CSS_CAPTION_SIDE_TOP;
			break;
		case CAPTION_SIDE_BOTTOM:
			value = CSS_CAPTION_SIDE_BOTTOM;
			break;
		}
	}

	if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
			isInherit(opv))) {
		return set_caption_side(state->computed, value);
	}

	return CSS_OK;
}
Exemplo n.º 10
0
css_error css__cascade_writing_mode(uint32_t opv, css_style *style, 
		css_select_state *state)
{
	bool inherit = isInherit(opv);
	uint16_t writing_mode = CSS_WRITING_MODE_INHERIT;
	UNUSED(style);

	if (inherit == false) {
		switch (getValue(opv)) {
		case WRITING_MODE_HORIZONTAL_TB:
			writing_mode = CSS_WRITING_MODE_HORIZONTAL_TB;
			break;
		case WRITING_MODE_VERTICAL_RL:
			writing_mode = CSS_WRITING_MODE_VERTICAL_RL;
			break;
		case WRITING_MODE_VERTICAL_LR:
			writing_mode = CSS_WRITING_MODE_VERTICAL_LR;
			break;
		}
	}

	if (css__outranks_existing(getOpcode(opv), isImportant(opv), state, 
			inherit)) {
		return set_writing_mode(state->computed, writing_mode);
	}

	return CSS_OK;
}
Exemplo n.º 11
0
css_error css__cascade_color(uint32_t opv, css_style *style, 
		css_select_state *state)
{
	bool inherit = isInherit(opv);
	uint16_t value = CSS_COLOR_INHERIT;
	css_color color = 0;

	if (inherit == false) {
		switch (getValue(opv)) {
		case COLOR_TRANSPARENT:
			value = CSS_COLOR_COLOR;
			break;
		case COLOR_CURRENT_COLOR:
			/* color: currentColor always computes to inherit */
			value = CSS_COLOR_INHERIT;
			inherit = true;
			break;
		case COLOR_SET:
			value = CSS_COLOR_COLOR;
			color = *((css_color *) style->bytecode);
			advance_bytecode(style, sizeof(color));
			break;
		}
	}

	if (css__outranks_existing(getOpcode(opv), isImportant(opv), state, 
			inherit)) {
		return set_color(state->computed, value, color);
	}

	return CSS_OK;
}
Exemplo n.º 12
0
css_error css__cascade_opacity(uint32_t opv, css_style *style, 
		css_select_state *state)
{
	uint16_t value = CSS_OPACITY_INHERIT;
	css_fixed opacity = 0;

	if (isInherit(opv) == false) {
		value = CSS_Z_INDEX_SET;

		opacity = *((css_fixed *) style->bytecode);
		advance_bytecode(style, sizeof(opacity));
	}

	if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
			isInherit(opv))) {
		return set_opacity(state->computed, value, opacity);
	}

	return CSS_OK;
}
Exemplo n.º 13
0
css_error css__cascade_azimuth(uint32_t opv, css_style *style,
		 css_select_state *state)
{
	css_fixed val = 0;
	uint32_t unit = UNIT_DEG;

	if (isInherit(opv) == false) {
		switch (getValue(opv) & ~AZIMUTH_BEHIND) {
		case AZIMUTH_ANGLE:
			val = *((css_fixed *) style->bytecode);
			advance_bytecode(style, sizeof(val));
			unit = *((uint32_t *) style->bytecode);
			advance_bytecode(style, sizeof(unit));
			break;
		case AZIMUTH_LEFTWARDS:
		case AZIMUTH_RIGHTWARDS:
		case AZIMUTH_LEFT_SIDE:
		case AZIMUTH_FAR_LEFT:
		case AZIMUTH_LEFT:
		case AZIMUTH_CENTER_LEFT:
		case AZIMUTH_CENTER:
		case AZIMUTH_CENTER_RIGHT:
		case AZIMUTH_RIGHT:
		case AZIMUTH_FAR_RIGHT:
		case AZIMUTH_RIGHT_SIDE:
			/** \todo azimuth values */
			break;
		}

		/** \todo azimuth behind */
	}

	unit = css__to_css_unit(unit);

	if (css__outranks_existing(getOpcode(opv), isImportant(opv), state, 
			isInherit(opv))) {
		/** \todo set computed azimuth */
	}

	return CSS_OK;
}
Exemplo n.º 14
0
css_error css__cascade_text_align(uint32_t opv, css_style *style, 
		css_select_state *state)
{
	uint16_t value = CSS_TEXT_ALIGN_INHERIT;

	UNUSED(style);

	if (isInherit(opv) == false) {
		switch (getValue(opv)) {
		case TEXT_ALIGN_LEFT:
			value = CSS_TEXT_ALIGN_LEFT;
			break;
		case TEXT_ALIGN_RIGHT:
			value = CSS_TEXT_ALIGN_RIGHT;
			break;
		case TEXT_ALIGN_CENTER:
			value = CSS_TEXT_ALIGN_CENTER;
			break;
		case TEXT_ALIGN_JUSTIFY:
			value = CSS_TEXT_ALIGN_JUSTIFY;
			break;
		case TEXT_ALIGN_LIBCSS_LEFT:
			value = CSS_TEXT_ALIGN_LIBCSS_LEFT;
			break;
		case TEXT_ALIGN_LIBCSS_CENTER:
			value = CSS_TEXT_ALIGN_LIBCSS_CENTER;
			break;
		case TEXT_ALIGN_LIBCSS_RIGHT:
			value = CSS_TEXT_ALIGN_LIBCSS_RIGHT;
			break;
		}
	}

	if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
			isInherit(opv))) {
		return set_text_align(state->computed, value);
	}

	return CSS_OK;
}
Exemplo n.º 15
0
css_error css__cascade_volume(uint32_t opv, css_style *style,
                              css_select_state *state)
{
    css_fixed val = 0;
    uint32_t unit = UNIT_PCT;

    if (isInherit(opv) == false) {
        switch (getValue(opv)) {
        case VOLUME_NUMBER:
            val = *((css_fixed *) style->bytecode);
            advance_bytecode(style, sizeof(val));
            break;
        case VOLUME_DIMENSION:
            val = *((css_fixed *) style->bytecode);
            advance_bytecode(style, sizeof(val));
            unit = *((uint32_t *) style->bytecode);
            advance_bytecode(style, sizeof(unit));
            break;
        case VOLUME_SILENT:
        case VOLUME_X_SOFT:
        case VOLUME_SOFT:
        case VOLUME_MEDIUM:
        case VOLUME_LOUD:
        case VOLUME_X_LOUD:
            /** \todo convert to public values */
            break;
        }
    }

    unit = css__to_css_unit(unit);

    if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
                               isInherit(opv))) {
        /** \todo volume */
    }

    return CSS_OK;
}
Exemplo n.º 16
0
css_error css__cascade_cursor(uint32_t opv, css_style *style,
                              css_select_state *state)
{
    uint16_t value = CSS_CURSOR_INHERIT;
    lwc_string **uris = NULL;
    uint32_t n_uris = 0;

    if (isInherit(opv) == false) {
        uint32_t v = getValue(opv);

        while (v == CURSOR_URI) {
            lwc_string *uri;
            lwc_string **temp;

            css__stylesheet_string_get(style->sheet,
                                       *((css_code_t *) style->bytecode),
                                       &uri);
            advance_bytecode(style, sizeof(css_code_t));

            temp = realloc(uris,
                           (n_uris + 1) * sizeof(lwc_string *));
            if (temp == NULL) {
                if (uris != NULL) {
                    free(uris);
                }
                return CSS_NOMEM;
            }

            uris = temp;

            uris[n_uris] = uri;

            n_uris++;

            v = *((uint32_t *) style->bytecode);
            advance_bytecode(style, sizeof(v));
        }

        switch (v) {
        case CURSOR_AUTO:
            value = CSS_CURSOR_AUTO;
            break;
        case CURSOR_CROSSHAIR:
            value = CSS_CURSOR_CROSSHAIR;
            break;
        case CURSOR_DEFAULT:
            value = CSS_CURSOR_DEFAULT;
            break;
        case CURSOR_POINTER:
            value = CSS_CURSOR_POINTER;
            break;
        case CURSOR_MOVE:
            value = CSS_CURSOR_MOVE;
            break;
        case CURSOR_E_RESIZE:
            value = CSS_CURSOR_E_RESIZE;
            break;
        case CURSOR_NE_RESIZE:
            value = CSS_CURSOR_NE_RESIZE;
            break;
        case CURSOR_NW_RESIZE:
            value = CSS_CURSOR_NW_RESIZE;
            break;
        case CURSOR_N_RESIZE:
            value = CSS_CURSOR_N_RESIZE;
            break;
        case CURSOR_SE_RESIZE:
            value = CSS_CURSOR_SE_RESIZE;
            break;
        case CURSOR_SW_RESIZE:
            value = CSS_CURSOR_SW_RESIZE;
            break;
        case CURSOR_S_RESIZE:
            value = CSS_CURSOR_S_RESIZE;
            break;
        case CURSOR_W_RESIZE:
            value = CSS_CURSOR_W_RESIZE;
            break;
        case CURSOR_TEXT:
            value = CSS_CURSOR_TEXT;
            break;
        case CURSOR_WAIT:
            value = CSS_CURSOR_WAIT;
            break;
        case CURSOR_HELP:
            value = CSS_CURSOR_HELP;
            break;
        case CURSOR_PROGRESS:
            value = CSS_CURSOR_PROGRESS;
            break;
        }
    }

    /* Terminate array with blank entry, if needed */
    if (n_uris > 0) {
        lwc_string **temp;

        temp = realloc(uris,
                       (n_uris + 1) * sizeof(lwc_string *));
        if (temp == NULL) {
            free(uris);
            return CSS_NOMEM;
        }

        uris = temp;

        uris[n_uris] = NULL;
    }

    if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
                               isInherit(opv))) {
        css_error error;

        error = set_cursor(state->computed, value, uris);
        if (error != CSS_OK && n_uris > 0)
            free(uris);

        return error;
    } else {
        if (n_uris > 0)
            free(uris);
    }

    return CSS_OK;
}
Exemplo n.º 17
0
/**
 * Make a style important
 *
 * \param style  The style to modify
 */
void css__make_style_important(css_style *style)
{
	css_code_t *bytecode = style->bytecode;
	uint32_t length = style->used;
	uint32_t offset = 0;

	while (offset < length) {
		opcode_t op;
		uint8_t flags;
		uint32_t value;
		css_code_t opv = bytecode[offset];

		/* Extract opv components, setting important flag */
		op = getOpcode(opv);
		flags = getFlags(opv) | FLAG_IMPORTANT;
		value = getValue(opv);

		/* Write OPV back to bytecode */
		bytecode[offset] = buildOPV(op, flags, value);

		offset++;

		/* Advance past any property-specific data */
		if (isInherit(opv) == false) {
			switch (op) {
			case CSS_PROP_AZIMUTH:
				if ((value & ~AZIMUTH_BEHIND) == AZIMUTH_ANGLE)
					offset += 2; /* length + units */
				break;

			case CSS_PROP_BORDER_TOP_COLOR:
			case CSS_PROP_BORDER_RIGHT_COLOR:
			case CSS_PROP_BORDER_BOTTOM_COLOR:
			case CSS_PROP_BORDER_LEFT_COLOR:
			case CSS_PROP_BACKGROUND_COLOR:
			case CSS_PROP_COLUMN_RULE_COLOR:
				assert(BACKGROUND_COLOR_SET == 
				       (enum op_background_color)BORDER_COLOR_SET);
				assert(BACKGROUND_COLOR_SET == 
				       (enum op_background_color)COLUMN_RULE_COLOR_SET);

				if (value == BACKGROUND_COLOR_SET)
					offset++; /* colour */
				break;

			case CSS_PROP_BACKGROUND_IMAGE:
			case CSS_PROP_CUE_AFTER:
			case CSS_PROP_CUE_BEFORE:
			case CSS_PROP_LIST_STYLE_IMAGE:
				assert(BACKGROUND_IMAGE_URI == 
				       (enum op_background_image)CUE_AFTER_URI);
				assert(BACKGROUND_IMAGE_URI == 
				       (enum op_background_image)CUE_BEFORE_URI);
				assert(BACKGROUND_IMAGE_URI ==
				       (enum op_background_image)LIST_STYLE_IMAGE_URI);

				if (value == BACKGROUND_IMAGE_URI) 
					offset++; /* string table entry */
				break;

			case CSS_PROP_BACKGROUND_POSITION:
				if ((value & 0xf0) == BACKGROUND_POSITION_HORZ_SET)
					offset += 2; /* length + units */

				if ((value & 0x0f) == BACKGROUND_POSITION_VERT_SET)
					offset += 2; /* length + units */
				break;

			case CSS_PROP_BORDER_SPACING:
				if (value == BORDER_SPACING_SET)
					offset += 4; /* two length + units */
				break;

			case CSS_PROP_BORDER_TOP_WIDTH:
			case CSS_PROP_BORDER_RIGHT_WIDTH:
			case CSS_PROP_BORDER_BOTTOM_WIDTH:
			case CSS_PROP_BORDER_LEFT_WIDTH:
			case CSS_PROP_OUTLINE_WIDTH:
			case CSS_PROP_COLUMN_RULE_WIDTH:
				assert(BORDER_WIDTH_SET == 
				       (enum op_border_width)OUTLINE_WIDTH_SET);
				assert(BORDER_WIDTH_SET ==
				       (enum op_border_width)COLUMN_RULE_WIDTH_SET);

				if (value == BORDER_WIDTH_SET)
					offset += 2; /* length + units */
				break;

			case CSS_PROP_MARGIN_TOP:
			case CSS_PROP_MARGIN_RIGHT:
			case CSS_PROP_MARGIN_BOTTOM:
			case CSS_PROP_MARGIN_LEFT:
			case CSS_PROP_BOTTOM:
			case CSS_PROP_LEFT:
			case CSS_PROP_RIGHT:
			case CSS_PROP_TOP:
			case CSS_PROP_HEIGHT:
			case CSS_PROP_WIDTH:
			case CSS_PROP_COLUMN_WIDTH:
			case CSS_PROP_COLUMN_GAP:
				assert(BOTTOM_SET == (enum op_bottom)LEFT_SET);
				assert(BOTTOM_SET == (enum op_bottom)RIGHT_SET);
				assert(BOTTOM_SET == (enum op_bottom)TOP_SET);
				assert(BOTTOM_SET == (enum op_bottom)HEIGHT_SET);
				assert(BOTTOM_SET == (enum op_bottom)MARGIN_SET);
				assert(BOTTOM_SET == (enum op_bottom)WIDTH_SET);
				assert(BOTTOM_SET == (enum op_bottom)COLUMN_WIDTH_SET);
				assert(BOTTOM_SET == (enum op_bottom)COLUMN_GAP_SET);

				if (value == BOTTOM_SET) 
					offset += 2; /* length + units */
				break;

			case CSS_PROP_CLIP:
				if ((value & CLIP_SHAPE_MASK) == CLIP_SHAPE_RECT) {
					if ((value & CLIP_RECT_TOP_AUTO) == 0)
						offset += 2; /* length + units */

					if ((value & CLIP_RECT_RIGHT_AUTO) == 0)
						offset += 2; /* length + units */

					if ((value & CLIP_RECT_BOTTOM_AUTO) == 0)
						offset += 2; /* length + units */

					if ((value & CLIP_RECT_LEFT_AUTO) == 0)
						offset += 2; /* length + units */

				}
				break;

			case CSS_PROP_COLOR:
				if (value == COLOR_SET)
					offset++; /* colour */
				break;

			case CSS_PROP_COLUMN_COUNT:
				if (value == COLUMN_COUNT_SET)
					offset++; /* colour */
				break;

			case CSS_PROP_CONTENT:
				while (value != CONTENT_NORMAL &&
						value != CONTENT_NONE) {
					switch (value & 0xff) {
					case CONTENT_COUNTER:
					case CONTENT_URI:
					case CONTENT_ATTR:
					case CONTENT_STRING:
						offset++; /* string table entry */
						break;

					case CONTENT_COUNTERS:
						offset+=2; /* two string entries */
						break;

					case CONTENT_OPEN_QUOTE:
					case CONTENT_CLOSE_QUOTE:
					case CONTENT_NO_OPEN_QUOTE:
					case CONTENT_NO_CLOSE_QUOTE:
						break;
					}

					value = bytecode[offset];
				        offset++;
				}
				break;

			case CSS_PROP_COUNTER_INCREMENT:
			case CSS_PROP_COUNTER_RESET:
				assert(COUNTER_INCREMENT_NONE == 
				       (enum op_counter_increment)COUNTER_RESET_NONE);

				while (value != COUNTER_INCREMENT_NONE) {
					offset+=2; /* string + integer */

					value = bytecode[offset];
				        offset++;
				}
				break;

			case CSS_PROP_CURSOR:
				while (value == CURSOR_URI) {
					offset++; /* string table entry */

					value = bytecode[offset];
				        offset++;
				}
				break;

			case CSS_PROP_ELEVATION:
				if (value == ELEVATION_ANGLE)
					offset += 2; /* length + units */
				break;

			case CSS_PROP_FONT_FAMILY:
				while (value != FONT_FAMILY_END) {
					switch (value) {
					case FONT_FAMILY_STRING:
					case FONT_FAMILY_IDENT_LIST:
						offset++; /* string table entry */
						break;
					}

					value = bytecode[offset];
				        offset++;
				}
				break;

			case CSS_PROP_FONT_SIZE:
				if (value == FONT_SIZE_DIMENSION) 
					offset += 2; /* length + units */
				break;

			case CSS_PROP_LETTER_SPACING:
			case CSS_PROP_WORD_SPACING:
				assert(LETTER_SPACING_SET == 
				       (enum op_letter_spacing)WORD_SPACING_SET);

				if (value == LETTER_SPACING_SET)
					offset += 2; /* length + units */
				break;

			case CSS_PROP_LINE_HEIGHT:
				switch (value) {
				case LINE_HEIGHT_NUMBER:
					offset++; /* value */
					break;

				case LINE_HEIGHT_DIMENSION:
					offset += 2; /* length + units */
					break;
				}
				break;

			case CSS_PROP_MAX_HEIGHT:
			case CSS_PROP_MAX_WIDTH:
				assert(MAX_HEIGHT_SET == 
				       (enum op_max_height)MAX_WIDTH_SET);

				if (value == MAX_HEIGHT_SET)
					offset += 2; /* length + units */
				break;

			case CSS_PROP_PADDING_TOP:
			case CSS_PROP_PADDING_RIGHT:
			case CSS_PROP_PADDING_BOTTOM:
			case CSS_PROP_PADDING_LEFT:
			case CSS_PROP_MIN_HEIGHT:
			case CSS_PROP_MIN_WIDTH:
			case CSS_PROP_PAUSE_AFTER:
			case CSS_PROP_PAUSE_BEFORE:
			case CSS_PROP_TEXT_INDENT:
				assert(MIN_HEIGHT_SET == (enum op_min_height)MIN_WIDTH_SET);
				assert(MIN_HEIGHT_SET == (enum op_min_height)PADDING_SET);
				assert(MIN_HEIGHT_SET == (enum op_min_height)PAUSE_AFTER_SET);
				assert(MIN_HEIGHT_SET == (enum op_min_height)PAUSE_BEFORE_SET);
				assert(MIN_HEIGHT_SET == (enum op_min_height)TEXT_INDENT_SET);

				if (value == MIN_HEIGHT_SET)
					offset += 2; /* length + units */
				break;

			case CSS_PROP_OPACITY:
				if (value == OPACITY_SET)
					offset++; /* value */
				break;

			case CSS_PROP_ORPHANS:
			case CSS_PROP_PITCH_RANGE:
			case CSS_PROP_RICHNESS:
			case CSS_PROP_STRESS:
			case CSS_PROP_WIDOWS:
            case CSS_PROP_FLEX_GROW:
            case CSS_PROP_FLEX_SHRINK:
            case CSS_PROP_FLEX_BASIS:
				assert(ORPHANS_SET == (enum op_orphans)PITCH_RANGE_SET);
				assert(ORPHANS_SET == (enum op_orphans)RICHNESS_SET);
				assert(ORPHANS_SET == (enum op_orphans)STRESS_SET);
				assert(ORPHANS_SET == (enum op_orphans)WIDOWS_SET);
                assert(ORPHANS_SET == (enum op_orphans)FLEX_GROW_SET);
                assert(ORPHANS_SET == (enum op_orphans)FLEX_SHRINK_SET);
                assert(ORPHANS_SET == (enum op_orphans)FLEX_BASIS_SET);

				if (value == ORPHANS_SET)
					offset++; /* value */
				break;

			case CSS_PROP_OUTLINE_COLOR:
				if (value == OUTLINE_COLOR_SET)
					offset++; /* color */
				break;

			case CSS_PROP_PITCH:
				if (value == PITCH_FREQUENCY)
					offset += 2; /* length + units */
				break;

			case CSS_PROP_PLAY_DURING:
				if (value & PLAY_DURING_URI)
					offset++; /* string table entry */
				break;

			case CSS_PROP_QUOTES:
				while (value != QUOTES_NONE) {
					offset += 2; /* two string table entries */

					value = bytecode[offset];
				        offset++;
				}
				break;

			case CSS_PROP_SPEECH_RATE:
				if (value == SPEECH_RATE_SET) 
					offset++; /* rate */
				break;

			case CSS_PROP_VERTICAL_ALIGN:
				if (value == VERTICAL_ALIGN_SET)
					offset += 2; /* length + units */
				break;

			case CSS_PROP_VOICE_FAMILY:
				while (value != VOICE_FAMILY_END) {
					switch (value) {
					case VOICE_FAMILY_STRING:
					case VOICE_FAMILY_IDENT_LIST:
						offset++; /* string table entry */
						break;
					}

					value = bytecode[offset];
				        offset++;
				}
				break;

			case CSS_PROP_VOLUME:
				switch (value) {
				case VOLUME_NUMBER:
					offset++; /* value */
					break;

				case VOLUME_DIMENSION:
					offset += 2; /* value + units */
					break;
				}
				break;

			case CSS_PROP_Z_INDEX:
				if (value == Z_INDEX_SET)
					offset++; /* z index */
				break;

			default:
				break;
			}
		}
	}

}
Exemplo n.º 18
0
css_error css__cascade_font_family(uint32_t opv, css_style *style, 
		css_select_state *state)
{
	uint16_t value = CSS_FONT_FAMILY_INHERIT;
	lwc_string **fonts = NULL;
	uint32_t n_fonts = 0;

	if (isInherit(opv) == false) {
		uint32_t v = getValue(opv);

		while (v != FONT_FAMILY_END) {
			lwc_string *font = NULL;
			lwc_string **temp;

			switch (v) {
			case FONT_FAMILY_STRING:
			case FONT_FAMILY_IDENT_LIST:
				css__stylesheet_string_get(style->sheet, 
					*((css_code_t *) style->bytecode), 
					&font);
				advance_bytecode(style, sizeof(css_code_t));
				break;
			case FONT_FAMILY_SERIF:
				if (value == CSS_FONT_FAMILY_INHERIT)
					value = CSS_FONT_FAMILY_SERIF;
				break;
			case FONT_FAMILY_SANS_SERIF:
				if (value == CSS_FONT_FAMILY_INHERIT)
					value = CSS_FONT_FAMILY_SANS_SERIF;
				break;
			case FONT_FAMILY_CURSIVE:
				if (value == CSS_FONT_FAMILY_INHERIT)
					value = CSS_FONT_FAMILY_CURSIVE;
				break;
			case FONT_FAMILY_FANTASY:
				if (value == CSS_FONT_FAMILY_INHERIT)
					value = CSS_FONT_FAMILY_FANTASY;
				break;
			case FONT_FAMILY_MONOSPACE:
				if (value == CSS_FONT_FAMILY_INHERIT)
					value = CSS_FONT_FAMILY_MONOSPACE;
				break;
			}

			/* Only use family-names which occur before the first
			 * generic-family. Any values which occur after the
			 * first generic-family are ignored. */
			/** \todo Do this at bytecode generation time? */
			if (value == CSS_FONT_FAMILY_INHERIT && font != NULL) {
				temp = state->computed->alloc(fonts, 
					(n_fonts + 1) * sizeof(lwc_string *), 
					state->computed->pw);
				if (temp == NULL) {
					if (fonts != NULL) {
						state->computed->alloc(fonts, 0,
							state->computed->pw);
					}
					return CSS_NOMEM;
				}

				fonts = temp;

				fonts[n_fonts] = font;

				n_fonts++;
			}

			v = *((uint32_t *) style->bytecode);
			advance_bytecode(style, sizeof(v));
		}
	}

	/* Terminate array with blank entry, if needed */
	if (n_fonts > 0) {
		lwc_string **temp;

		temp = state->computed->alloc(fonts, 
				(n_fonts + 1) * sizeof(lwc_string *), 
				state->computed->pw);
		if (temp == NULL) {
			state->computed->alloc(fonts, 0, state->computed->pw);
			return CSS_NOMEM;
		}

		fonts = temp;

		fonts[n_fonts] = NULL;
		
		if (value == CSS_FONT_FAMILY_INHERIT) {
			/* The stylesheet doesn't specify a generic family,
			 * but it has specified named fonts.
			 * Fall back to the user agent's default family.
			 * We don't want to inherit, because that will 
			 * incorrectly overwrite the named fonts list too.
			 */
			css_hint hint;
			css_error error;
			
			error = state->handler->ua_default_for_property(
					state->pw, CSS_PROP_FONT_FAMILY, &hint);
			if (error == CSS_OK) {
				lwc_string **item;

				value = hint.status;
		
				for (item = hint.data.strings; 
						item != NULL && (*item) != NULL;
						item++) {
					lwc_string_unref(*item);
				}

				if (hint.data.strings != NULL) {
					state->computed->alloc(
							hint.data.strings, 
							0, state->computed->pw);
				}
			}

			if (value == CSS_FONT_FAMILY_INHERIT) {
				/* No sane UA default: assume sans-serif */
				value = CSS_FONT_FAMILY_SANS_SERIF;
			}
		}
	}

	if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
			isInherit(opv))) {
		css_error error;

		error = set_font_family(state->computed, value, fonts);
		if (error != CSS_OK && n_fonts > 0)
			state->computed->alloc(fonts, 0, state->computed->pw);

		return error;
	} else {
		if (n_fonts > 0)
			state->computed->alloc(fonts, 0, state->computed->pw);
	}

	return CSS_OK;
}