summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/parse/properties.c88
-rw-r--r--src/utils/Makefile2
-rw-r--r--src/utils/fpconstants.h28
-rw-r--r--src/utils/fpmath.h47
-rw-r--r--src/utils/utils.c122
-rw-r--r--src/utils/utils.h116
6 files changed, 169 insertions, 234 deletions
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;
/* <integer> | 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;
/* <integer> | 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;
/* <integer> | 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 <jmb@netsurf-browser.org>
- */
-
-#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 <jmb@netsurf-browser.org>
- */
-
-#ifndef css_utils_fpmath_h_
-#define css_utils_fpmath_h_
-
-#include <stdint.h>
-
-/* 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 <jmb@netsurf-browser.org>
+ */
+
+#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 <libcss/types.h>
-#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)
{