From ca3293e0332bbd9fe63d6cd6bc215f048132bd08 Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Sat, 14 Feb 2009 19:24:40 +0000 Subject: Make fpmath stuff public. Un-inline string->fixed conversion routine. svn path=/trunk/libcss/; revision=6513 --- src/parse/properties.c | 88 +++++++++++++++++----------------- src/utils/Makefile | 2 +- src/utils/fpconstants.h | 28 ----------- src/utils/fpmath.h | 47 ------------------- src/utils/utils.c | 122 ++++++++++++++++++++++++++++++++++++++++++++++++ src/utils/utils.h | 116 +-------------------------------------------- 6 files changed, 169 insertions(+), 234 deletions(-) delete mode 100644 src/utils/fpconstants.h delete mode 100644 src/utils/fpmath.h create mode 100644 src/utils/utils.c (limited to 'src') diff --git a/src/parse/properties.c b/src/parse/properties.c index c333a17..b0905a8 100644 --- a/src/parse/properties.c +++ b/src/parse/properties.c @@ -318,7 +318,7 @@ static inline css_error parse_colour_specifier(css_language *c, static inline css_error parse_unit_specifier(css_language *c, const parserutils_vector *vector, int *ctx, uint32_t default_unit, - fixed *length, uint32_t *unit); + css_fixed *length, uint32_t *unit); static inline css_error parse_border_side_color(css_language *c, const parserutils_vector *vector, int *ctx, @@ -463,7 +463,7 @@ css_error parse_azimuth(css_language *c, uint8_t flags = 0; uint16_t value = 0; uint32_t opv; - fixed length = 0; + css_fixed length = 0; uint32_t unit = 0; uint32_t required_size; @@ -778,7 +778,7 @@ css_error parse_background_position(css_language *c, uint8_t flags = 0; uint32_t opv; uint16_t value[2] = { 0 }; - fixed length[2] = { 0 }; + css_fixed length[2] = { 0 }; uint32_t unit[2] = { 0 }; uint32_t required_size; @@ -1091,7 +1091,7 @@ css_error parse_border_spacing(css_language *c, uint8_t flags = 0; uint16_t value = 0; uint32_t opv; - fixed length[2] = { 0 }; + css_fixed length[2] = { 0 }; uint32_t unit[2] = { 0 }; uint32_t required_size; @@ -1213,7 +1213,7 @@ css_error parse_bottom(css_language *c, uint8_t flags = 0; uint16_t value = 0; uint32_t opv; - fixed length = 0; + css_fixed length = 0; uint32_t unit = 0; uint32_t required_size; @@ -1365,7 +1365,7 @@ css_error parse_clip(css_language *c, uint16_t value = 0; uint32_t opv; int num_lengths = 0; - fixed length[4] = { 0 }; + css_fixed length[4] = { 0 }; uint32_t unit[4] = { 0 }; uint32_t required_size; @@ -1653,7 +1653,7 @@ css_error parse_counter_increment(css_language *c, while (token != NULL) { const parserutils_hash_entry *name = token->idata; - fixed increment = INTTOFIX(1); + css_fixed increment = INTTOFIX(1); consumeWhitespace(vector, &temp_ctx); @@ -1731,7 +1731,7 @@ css_error parse_counter_increment(css_language *c, while (token != NULL) { const parserutils_hash_entry *name = token->idata; - fixed increment = INTTOFIX(1); + css_fixed increment = INTTOFIX(1); consumeWhitespace(vector, ctx); @@ -1822,7 +1822,7 @@ css_error parse_counter_reset(css_language *c, while (token != NULL) { const parserutils_hash_entry *name = token->idata; - fixed increment = INTTOFIX(0); + css_fixed increment = INTTOFIX(0); consumeWhitespace(vector, &temp_ctx); @@ -1900,7 +1900,7 @@ css_error parse_counter_reset(css_language *c, while (token != NULL) { const parserutils_hash_entry *name = token->idata; - fixed increment = INTTOFIX(0); + css_fixed increment = INTTOFIX(0); consumeWhitespace(vector, ctx); @@ -2455,7 +2455,7 @@ css_error parse_elevation(css_language *c, uint8_t flags = 0; uint16_t value = 0; uint32_t opv; - fixed length = 0; + css_fixed length = 0; uint32_t unit = 0; uint32_t required_size; @@ -2982,7 +2982,7 @@ css_error parse_font_size(css_language *c, uint8_t flags = 0; uint16_t value = 0; uint32_t opv; - fixed length = 0; + css_fixed length = 0; uint32_t unit = 0; uint32_t required_size; @@ -3186,7 +3186,7 @@ css_error parse_font_weight(css_language *c, size_t consumed = 0; css_string tmp = { token->ilower->len, (uint8_t *) token->ilower->data }; - fixed num = number_from_css_string(&tmp, true, &consumed); + css_fixed num = number_from_css_string(&tmp, true, &consumed); /* Invalid if there are trailing characters */ if (consumed != token->ilower->len) return CSS_INVALID; @@ -3235,7 +3235,7 @@ css_error parse_height(css_language *c, uint8_t flags = 0; uint16_t value = 0; uint32_t opv; - fixed length = 0; + css_fixed length = 0; uint32_t unit = 0; uint32_t required_size; @@ -3304,7 +3304,7 @@ css_error parse_left(css_language *c, uint8_t flags = 0; uint16_t value = 0; uint32_t opv; - fixed length = 0; + css_fixed length = 0; uint32_t unit = 0; uint32_t required_size; @@ -3369,7 +3369,7 @@ css_error parse_letter_spacing(css_language *c, uint8_t flags = 0; uint16_t value = 0; uint32_t opv; - fixed length = 0; + css_fixed length = 0; uint32_t unit = 0; uint32_t required_size; @@ -3435,7 +3435,7 @@ css_error parse_line_height(css_language *c, uint8_t flags = 0; uint16_t value = 0; uint32_t opv; - fixed length = 0; + css_fixed length = 0; uint32_t unit = 0; uint32_t required_size; @@ -3689,7 +3689,7 @@ css_error parse_max_height(css_language *c, uint8_t flags = 0; uint16_t value = 0; uint32_t opv; - fixed length = 0; + css_fixed length = 0; uint32_t unit = 0; uint32_t required_size; @@ -3758,7 +3758,7 @@ css_error parse_max_width(css_language *c, uint8_t flags = 0; uint16_t value = 0; uint32_t opv; - fixed length = 0; + css_fixed length = 0; uint32_t unit = 0; uint32_t required_size; @@ -3827,7 +3827,7 @@ css_error parse_min_height(css_language *c, uint8_t flags = 0; uint16_t value = 0; uint32_t opv; - fixed length = 0; + css_fixed length = 0; uint32_t unit = 0; uint32_t required_size; @@ -3892,7 +3892,7 @@ css_error parse_min_width(css_language *c, uint8_t flags = 0; uint16_t value = 0; uint32_t opv; - fixed length = 0; + css_fixed length = 0; uint32_t unit = 0; uint32_t required_size; @@ -3957,7 +3957,7 @@ css_error parse_orphans(css_language *c, uint8_t flags = 0; uint16_t value = 0; uint32_t opv; - fixed num = 0; + css_fixed num = 0; uint32_t required_size; /* | IDENT (inherit) */ @@ -4319,7 +4319,7 @@ css_error parse_pause_after(css_language *c, uint8_t flags = 0; uint16_t value = 0; uint32_t opv; - fixed length = 0; + css_fixed length = 0; uint32_t unit = 0; uint32_t required_size; @@ -4384,7 +4384,7 @@ css_error parse_pause_before(css_language *c, uint8_t flags = 0; uint16_t value = 0; uint32_t opv; - fixed length = 0; + css_fixed length = 0; uint32_t unit = 0; uint32_t required_size; @@ -4449,7 +4449,7 @@ css_error parse_pitch_range(css_language *c, uint8_t flags = 0; uint16_t value = 0; uint32_t opv; - fixed num = 0; + css_fixed num = 0; uint32_t required_size; /* number | IDENT (inherit) */ @@ -4511,7 +4511,7 @@ css_error parse_pitch(css_language *c, uint8_t flags = 0; uint16_t value = 0; uint32_t opv; - fixed length = 0; + css_fixed length = 0; uint32_t unit = 0; uint32_t required_size; @@ -4880,7 +4880,7 @@ css_error parse_richness(css_language *c, uint8_t flags = 0; uint16_t value = 0; uint32_t opv; - fixed num = 0; + css_fixed num = 0; uint32_t required_size; /* number | IDENT (inherit) */ @@ -4942,7 +4942,7 @@ css_error parse_right(css_language *c, uint8_t flags = 0; uint16_t value = 0; uint32_t opv; - fixed length = 0; + css_fixed length = 0; uint32_t unit = 0; uint32_t required_size; @@ -5173,7 +5173,7 @@ css_error parse_speech_rate(css_language *c, uint8_t flags = 0; uint16_t value = 0; uint32_t opv; - fixed num = 0; + css_fixed num = 0; uint32_t required_size; /* number | IDENT (x-slow, slow, medium, fast, x-fast, faster, slower, @@ -5259,7 +5259,7 @@ css_error parse_stress(css_language *c, uint8_t flags = 0; uint16_t value = 0; uint32_t opv; - fixed num = 0; + css_fixed num = 0; uint32_t required_size; /* number | IDENT (inherit) */ @@ -5477,7 +5477,7 @@ css_error parse_text_indent(css_language *c, uint8_t flags = 0; uint16_t value = 0; uint32_t opv; - fixed length = 0; + css_fixed length = 0; uint32_t unit = 0; uint32_t required_size; @@ -5583,7 +5583,7 @@ css_error parse_top(css_language *c, uint8_t flags = 0; uint16_t value = 0; uint32_t opv; - fixed length = 0; + css_fixed length = 0; uint32_t unit = 0; uint32_t required_size; @@ -5691,7 +5691,7 @@ css_error parse_vertical_align(css_language *c, uint8_t flags = 0; uint16_t value = 0; uint32_t opv; - fixed length = 0; + css_fixed length = 0; uint32_t unit = 0; uint32_t required_size; @@ -6156,7 +6156,7 @@ css_error parse_volume(css_language *c, uint8_t flags = 0; uint16_t value = 0; uint32_t opv; - fixed length = 0; + css_fixed length = 0; uint32_t unit = 0; uint32_t required_size; @@ -6312,7 +6312,7 @@ css_error parse_widows(css_language *c, uint8_t flags = 0; uint16_t value = 0; uint32_t opv; - fixed num = 0; + css_fixed num = 0; uint32_t required_size; /* | IDENT (inherit) */ @@ -6374,7 +6374,7 @@ css_error parse_width(css_language *c, uint8_t flags = 0; uint16_t value = 0; uint32_t opv; - fixed length = 0; + css_fixed length = 0; uint32_t unit = 0; uint32_t required_size; @@ -6443,7 +6443,7 @@ css_error parse_word_spacing(css_language *c, uint8_t flags = 0; uint16_t value = 0; uint32_t opv; - fixed length = 0; + css_fixed length = 0; uint32_t unit = 0; uint32_t required_size; @@ -6509,7 +6509,7 @@ css_error parse_z_index(css_language *c, uint8_t flags = 0; uint16_t value = 0; uint32_t opv; - fixed num = 0; + css_fixed num = 0; uint32_t required_size; /* | IDENT (auto, inherit) */ @@ -6644,7 +6644,7 @@ css_error parse_colour_specifier(css_language *c, for (int i = 0; i < 3; i++) { css_string tmp; - fixed num; + css_fixed num; size_t consumed = 0; uint8_t *component = i == 0 ? &r : i == 1 ? &b : &g; @@ -6713,10 +6713,10 @@ css_error parse_colour_specifier(css_language *c, css_error parse_unit_specifier(css_language *c, const parserutils_vector *vector, int *ctx, uint32_t default_unit, - fixed *length, uint32_t *unit) + css_fixed *length, uint32_t *unit) { const css_token *token; - fixed num; + css_fixed num; size_t consumed = 0; css_string tmp; @@ -6938,7 +6938,7 @@ css_error parse_border_side_width(css_language *c, uint8_t flags = 0; uint16_t value = 0; uint32_t opv; - fixed length = 0; + css_fixed length = 0; uint32_t unit = 0; uint32_t required_size; @@ -7016,7 +7016,7 @@ css_error parse_margin_side(css_language *c, uint8_t flags = 0; uint16_t value = 0; uint32_t opv; - fixed length = 0; + css_fixed length = 0; uint32_t unit = 0; uint32_t required_size; @@ -7081,7 +7081,7 @@ css_error parse_padding_side(css_language *c, uint8_t flags = 0; uint16_t value = 0; uint32_t opv; - fixed length = 0; + css_fixed length = 0; uint32_t unit = 0; uint32_t required_size; diff --git a/src/utils/Makefile b/src/utils/Makefile index 912590c..71d9817 100644 --- a/src/utils/Makefile +++ b/src/utils/Makefile @@ -32,7 +32,7 @@ dirstack_$(sp) := $(d) d := $(DIR) # Sources -SRCS_$(d) := errors.c +SRCS_$(d) := errors.c utils.c # Append to sources for component SOURCES += $(addprefix $(d), $(SRCS_$(d))) diff --git a/src/utils/fpconstants.h b/src/utils/fpconstants.h deleted file mode 100644 index b810274..0000000 --- a/src/utils/fpconstants.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * This file is part of LibCSS. - * Licensed under the MIT License, - * http://www.opensource.org/licenses/mit-license.php - * Copyright 2008 John-Mark Bell - */ - -#ifndef css_utils_fpconstants_h_ -#define css_utils_fpconstants_h_ - -/* Useful angles */ -#define F_PI_2 0x00000648 /* 1.5708 (PI/2) */ -#define F_PI 0x00000c91 /* 3.1415 (PI) */ -#define F_3PI_2 0x000012d9 /* 4.7124 (3PI/2) */ -#define F_2PI 0x00001922 /* 6.2831 (2 PI) */ - -#define F_90 0x00016800 /* 90 */ -#define F_180 0x0002d000 /* 180 */ -#define F_270 0x00043800 /* 270 */ -#define F_360 0x0005a000 /* 360 */ - -#define F_100 0x00019000 /* 100 */ -#define F_200 0x00032000 /* 200 */ -#define F_300 0x0004b000 /* 300 */ -#define F_400 0x00064000 /* 400 */ - -#endif - diff --git a/src/utils/fpmath.h b/src/utils/fpmath.h deleted file mode 100644 index c4db605..0000000 --- a/src/utils/fpmath.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * This file is part of LibCSS. - * Licensed under the MIT License, - * http://www.opensource.org/licenses/mit-license.php - * Copyright 2008 John-Mark Bell - */ - -#ifndef css_utils_fpmath_h_ -#define css_utils_fpmath_h_ - -#include - -/* 22:10 fixed point math */ -typedef int32_t fixed; - -/* Add two fixed point values */ -#define FADD(a, b) ((a) + (b)) -/* Subtract two fixed point values */ -#define FSUB(a, b) ((a) - (b)) -/* Multiply two fixed point values */ -#define FMUL(a, b) (((a) * (b)) >> 10) -/* Divide two fixed point values */ -#define FDIV(a, b) (((a) << 10) / (b)) - -/* Add an integer to a fixed point value */ -#define FADDI(a, b) ((a) + ((b) << 10)) -/* Subtract an integer from a fixed point value */ -#define FSUBI(a, b) ((a) - ((b) << 10)) -/* Multiply a fixed point value by an integer */ -#define FMULI(a, b) ((a) * (b)) -/* Divide a fixed point value by an integer */ -#define FDIVI(a, b) ((a) / (b)) - -/* Convert a floating point value to fixed point */ -#define FLTTOFIX(a) ((fixed) ((a) * (float) (1 << 10))) -/* Convert a fixed point value to floating point */ -#define FIXTOFLT(a) ((float) (a) / (float) (1 << 10)) - -/* Convert an integer to a fixed point value */ -#define INTTOFIX(a) ((a) << 10) -/* Convert a fixed point value to an integer */ -#define FIXTOINT(a) ((a) >> 10) - -#include "utils/fpconstants.h" - -#endif - diff --git a/src/utils/utils.c b/src/utils/utils.c new file mode 100644 index 0000000..a8d0cb5 --- /dev/null +++ b/src/utils/utils.c @@ -0,0 +1,122 @@ +/* + * This file is part of LibCSS. + * Licensed under the MIT License, + * http://www.opensource.org/licenses/mit-license.php + * Copyright 2007-9 John-Mark Bell + */ + +#include "utils/utils.h" + +css_fixed number_from_css_string(const css_string *string, + bool int_only, size_t *consumed) +{ + size_t len; + const uint8_t *ptr; + int sign = 1; + int32_t intpart = 0; + int32_t fracpart = 0; + int32_t pwr = 1; + + if (string == NULL || string->len == 0 || consumed == NULL) + return 0; + + len = string->len; + ptr = string->data; + + /* number = [+-]? ([0-9]+ | [0-9]* '.' [0-9]+) */ + + /* Extract sign, if any */ + if (ptr[0] == '-') { + sign = -1; + len--; + ptr++; + } else if (ptr[0] == '+') { + len--; + ptr++; + } + + /* Ensure we have either a digit or a '.' followed by a digit */ + if (len == 0) { + *consumed = 0; + return 0; + } else { + if (ptr[0] == '.') { + if (len == 1 || ptr[1] < '0' || '9' < ptr[1]) { + *consumed = 0; + return 0; + } + } else if (ptr[0] < '0' || '9' < ptr[0]) { + *consumed = 0; + return 0; + } + } + + /* Now extract intpart, assuming base 10 */ + while (len > 0) { + /* Stop on first non-digit */ + if (ptr[0] < '0' || '9' < ptr[0]) + break; + + /* Prevent overflow of 'intpart'; proper clamping below */ + if (intpart < (1 << 22)) { + intpart *= 10; + intpart += ptr[0] - '0'; + } + ptr++; + len--; + } + + /* And fracpart, again, assuming base 10 */ + if (int_only == false && len > 1 && ptr[0] == '.' && + ('0' <= ptr[1] && ptr[1] <= '9')) { + ptr++; + len--; + + while (len > 0) { + if (ptr[0] < '0' || '9' < ptr[0]) + break; + + if (pwr < 1000000) { + pwr *= 10; + fracpart *= 10; + fracpart += ptr[0] - '0'; + } + ptr++; + len--; + } + fracpart = ((1 << 10) * fracpart + pwr/2) / pwr; + if (fracpart >= (1 << 10)) { + intpart++; + fracpart &= (1 << 10) - 1; + } + } + + *consumed = ptr - string->data; + + if (sign > 0) { + /* If the result is larger than we can represent, + * then clamp to the maximum value we can store. */ + if (intpart >= (1 << 21)) { + intpart = (1 << 21) - 1; + fracpart = (1 << 10) - 1; + } + } + else { + /* If the negated result is smaller than we can represent + * then clamp to the minimum value we can store. */ + if (intpart >= (1 << 21)) { + intpart = -(1 << 21); + fracpart = 0; + } + else { + intpart = -intpart; + if (fracpart) { + fracpart = (1 << 10) - fracpart; + intpart--; + } + } + } + + return (intpart << 10) | fracpart; +} + diff --git a/src/utils/utils.h b/src/utils/utils.h index 9c6b082..6a3ddad 100644 --- a/src/utils/utils.h +++ b/src/utils/utils.h @@ -10,8 +10,6 @@ #include -#include "utils/fpmath.h" - #ifndef max #define max(a,b) ((a)>(b)?(a):(b)) #endif @@ -29,118 +27,8 @@ #define UNUSED(x) ((x)=(x)) #endif -static inline fixed number_from_css_string(const css_string *string, - bool int_only, size_t *consumed) -{ - size_t len; - const uint8_t *ptr; - int sign = 1; - int32_t intpart = 0; - int32_t fracpart = 0; - int32_t pwr = 1; - - if (string == NULL || string->len == 0 || consumed == NULL) - return 0; - - len = string->len; - ptr = string->data; - - /* number = [+-]? ([0-9]+ | [0-9]* '.' [0-9]+) */ - - /* Extract sign, if any */ - if (ptr[0] == '-') { - sign = -1; - len--; - ptr++; - } else if (ptr[0] == '+') { - len--; - ptr++; - } - - /* Ensure we have either a digit or a '.' followed by a digit */ - if (len == 0) { - *consumed = 0; - return 0; - } else { - if (ptr[0] == '.') { - if (len == 1 || ptr[1] < '0' || '9' < ptr[1]) { - *consumed = 0; - return 0; - } - } else if (ptr[0] < '0' || '9' < ptr[0]) { - *consumed = 0; - return 0; - } - } - - /* Now extract intpart, assuming base 10 */ - while (len > 0) { - /* Stop on first non-digit */ - if (ptr[0] < '0' || '9' < ptr[0]) - break; - - /* Prevent overflow of 'intpart'; proper clamping below */ - if (intpart < (1 << 22)) { - intpart *= 10; - intpart += ptr[0] - '0'; - } - ptr++; - len--; - } - - /* And fracpart, again, assuming base 10 */ - if (int_only == false && len > 1 && ptr[0] == '.' && - ('0' <= ptr[1] && ptr[1] <= '9')) { - ptr++; - len--; - - while (len > 0) { - if (ptr[0] < '0' || '9' < ptr[0]) - break; - - if (pwr < 1000000) { - pwr *= 10; - fracpart *= 10; - fracpart += ptr[0] - '0'; - } - ptr++; - len--; - } - fracpart = ((1 << 10) * fracpart + pwr/2) / pwr; - if (fracpart >= (1 << 10)) { - intpart++; - fracpart &= (1 << 10) - 1; - } - } - - *consumed = ptr - string->data; - - if (sign > 0) { - /* If the result is larger than we can represent, - * then clamp to the maximum value we can store. */ - if (intpart >= (1 << 21)) { - intpart = (1 << 21) - 1; - fracpart = (1 << 10) - 1; - } - } - else { - /* If the negated result is smaller than we can represent - * then clamp to the minimum value we can store. */ - if (intpart >= (1 << 21)) { - intpart = -(1 << 21); - fracpart = 0; - } - else { - intpart = -intpart; - if (fracpart) { - fracpart = (1 << 10) - fracpart; - intpart--; - } - } - } - - return (intpart << 10) | fracpart; -} +css_fixed number_from_css_string(const css_string *string, bool int_only, + size_t *consumed); static inline bool isDigit(uint8_t c) { -- cgit v1.2.3