summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2011-01-29 21:51:45 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2011-01-29 21:51:45 +0000
commit6ba000db056d7e9b70a7e154a003644046bf7e98 (patch)
tree30c43ec8543ec9cb66169721e3268ea0a7cdb76f /src
parent1b13f81b8259f4416df7b3063cb280cb977722d7 (diff)
downloadlibcss-6ba000db056d7e9b70a7e154a003644046bf7e98.tar.gz
libcss-6ba000db056d7e9b70a7e154a003644046bf7e98.tar.bz2
Add support for opacity property
svn path=/trunk/libcss/; revision=11527
Diffstat (limited to 'src')
-rw-r--r--src/bytecode/opcodes.h4
-rw-r--r--src/parse/properties/Makefile2
-rw-r--r--src/parse/properties/opacity.c79
-rw-r--r--src/parse/properties/properties.c1
-rw-r--r--src/parse/properties/properties.h3
-rw-r--r--src/parse/propstrings.c1
-rw-r--r--src/parse/propstrings.h2
-rw-r--r--src/select/dispatch.c5
-rw-r--r--src/select/properties/Makefile1
-rw-r--r--src/select/properties/opacity.c62
-rw-r--r--src/select/properties/properties.h1
-rw-r--r--src/select/propget.h22
-rw-r--r--src/select/propset.h21
13 files changed, 202 insertions, 2 deletions
diff --git a/src/bytecode/opcodes.h b/src/bytecode/opcodes.h
index 991d099..95ab263 100644
--- a/src/bytecode/opcodes.h
+++ b/src/bytecode/opcodes.h
@@ -365,6 +365,10 @@ enum op_min_width {
MIN_WIDTH_SET = 0x0080
};
+enum op_opacity {
+ OPACITY_SET = 0x0080
+};
+
enum op_orphans {
ORPHANS_SET = 0x0080
};
diff --git a/src/parse/properties/Makefile b/src/parse/properties/Makefile
index 4f6a402..093e19e 100644
--- a/src/parse/properties/Makefile
+++ b/src/parse/properties/Makefile
@@ -54,7 +54,7 @@ DIR_SOURCES := azimuth.c text_decoration.c background.c \
font_family.c list_style.c padding.c cursor.c \
list_style_type.c pause.c border.c border_width.c margin.c \
play_during.c clip.c properties.c border_color.c content.c \
- elevation.c font_weight.c quotes.c utils.c
+ elevation.c font_weight.c quotes.c utils.c opacity.c
DIR_SOURCES := $(DIR_SOURCES) $(AUTOGEN_SOURCES)
diff --git a/src/parse/properties/opacity.c b/src/parse/properties/opacity.c
new file mode 100644
index 0000000..edad9f8
--- /dev/null
+++ b/src/parse/properties/opacity.c
@@ -0,0 +1,79 @@
+/*
+ * Licensed under the MIT License,
+ * http://www.opensource.org/licenses/mit-license.php
+ * Copyright 2010 The NetSurf Browser Project.
+ */
+
+#include <assert.h>
+#include <string.h>
+
+#include "bytecode/bytecode.h"
+#include "bytecode/opcodes.h"
+#include "parse/properties/properties.h"
+#include "parse/properties/utils.h"
+
+/**
+ * Parse opacity
+ *
+ * \param c Parsing context
+ * \param vector Vector of tokens to process
+ * \param ctx Pointer to vector iteration context
+ * \param result resulting style
+ * \return CSS_OK on success,
+ * CSS_NOMEM on memory exhaustion,
+ * CSS_INVALID if the input is not valid
+ *
+ * Post condition: \a *ctx is updated with the next token to process
+ * If the input is invalid, then \a *ctx remains unchanged.
+ */
+css_error css__parse_opacity(css_language *c,
+ const parserutils_vector *vector, int *ctx,
+ css_style *result)
+{
+ int orig_ctx = *ctx;
+ css_error error;
+ const css_token *token;
+ bool match;
+
+ token = parserutils_vector_iterate(vector, ctx);
+ if ((token == NULL) || ((token->type != CSS_TOKEN_IDENT) && (token->type != CSS_TOKEN_NUMBER))) {
+ *ctx = orig_ctx;
+ return CSS_INVALID;
+ }
+
+ if ((token->type == CSS_TOKEN_IDENT) && (lwc_string_caseless_isequal(token->idata, c->strings[INHERIT], &match) == lwc_error_ok && match)) {
+ error = css_stylesheet_style_inherit(result, CSS_PROP_OPACITY);
+ } else if (token->type == CSS_TOKEN_NUMBER) {
+ css_fixed num = 0;
+ size_t consumed = 0;
+
+ num = css__number_from_lwc_string(token->idata, false, &consumed);
+ /* Invalid if there are trailing characters */
+ if (consumed != lwc_string_length(token->idata)) {
+ *ctx = orig_ctx;
+ return CSS_INVALID;
+ }
+
+ /* Clamp to range [0,1] */
+ if (num < 0)
+ num = 0;
+ if (num > INTTOFIX(1))
+ num = INTTOFIX(1);
+
+ error = css__stylesheet_style_appendOPV(result, CSS_PROP_OPACITY, 0, OPACITY_SET);
+ if (error != CSS_OK) {
+ *ctx = orig_ctx;
+ return error;
+ }
+
+ error = css__stylesheet_style_append(result, num);
+ } else {
+ error = CSS_INVALID;
+ }
+
+ if (error != CSS_OK)
+ *ctx = orig_ctx;
+
+ return error;
+}
+
diff --git a/src/parse/properties/properties.c b/src/parse/properties/properties.c
index 09ee255..bc2f225 100644
--- a/src/parse/properties/properties.c
+++ b/src/parse/properties/properties.c
@@ -81,6 +81,7 @@ const css_prop_handler property_handlers[LAST_PROP + 1 - FIRST_PROP] =
css__parse_max_width,
css__parse_min_height,
css__parse_min_width,
+ css__parse_opacity,
css__parse_orphans,
css__parse_outline,
css__parse_outline_color,
diff --git a/src/parse/properties/properties.h b/src/parse/properties/properties.h
index 5de344d..6992f18 100644
--- a/src/parse/properties/properties.h
+++ b/src/parse/properties/properties.h
@@ -229,6 +229,9 @@ css_error css__parse_min_height(css_language *c,
css_error css__parse_min_width(css_language *c,
const parserutils_vector *vector, int *ctx,
css_style *result);
+css_error css__parse_opacity(css_language *c,
+ const parserutils_vector *vector, int *ctx,
+ css_style *result);
css_error css__parse_orphans(css_language *c,
const parserutils_vector *vector, int *ctx,
css_style *result);
diff --git a/src/parse/propstrings.c b/src/parse/propstrings.c
index 9e81300..487ad98 100644
--- a/src/parse/propstrings.c
+++ b/src/parse/propstrings.c
@@ -111,6 +111,7 @@ const stringmap_entry stringmap[LAST_KNOWN] = {
{ "max-width", SLEN("max-width") },
{ "min-height", SLEN("min-height") },
{ "min-width", SLEN("min-width") },
+ { "opacity", SLEN("opacity") },
{ "orphans", SLEN("orphans") },
{ "outline", SLEN("outline") },
{ "outline-color", SLEN("outline-color") },
diff --git a/src/parse/propstrings.h b/src/parse/propstrings.h
index 5a1662d..f81fe30 100644
--- a/src/parse/propstrings.h
+++ b/src/parse/propstrings.h
@@ -46,7 +46,7 @@ enum {
FONT_WEIGHT, HEIGHT, LEFT, LETTER_SPACING, LINE_HEIGHT,
LIST_STYLE, LIST_STYLE_IMAGE, LIST_STYLE_POSITION, LIST_STYLE_TYPE,
MARGIN, MARGIN_BOTTOM, MARGIN_LEFT, MARGIN_RIGHT, MARGIN_TOP,
- MAX_HEIGHT, MAX_WIDTH, MIN_HEIGHT, MIN_WIDTH, ORPHANS,
+ MAX_HEIGHT, MAX_WIDTH, MIN_HEIGHT, MIN_WIDTH, OPACITY, ORPHANS,
OUTLINE, OUTLINE_COLOR, OUTLINE_STYLE, OUTLINE_WIDTH, OVERFLOW,
PADDING, PADDING_BOTTOM, PADDING_LEFT, PADDING_RIGHT, PADDING_TOP,
PAGE_BREAK_AFTER, PAGE_BREAK_BEFORE, PAGE_BREAK_INSIDE,
diff --git a/src/select/dispatch.c b/src/select/dispatch.c
index 0b73c26..fe17d70 100644
--- a/src/select/dispatch.c
+++ b/src/select/dispatch.c
@@ -512,5 +512,10 @@ struct prop_table prop_dispatch[CSS_N_PROPERTIES] = {
PROPERTY_FUNCS(z_index),
0,
GROUP_NORMAL
+ },
+ {
+ PROPERTY_FUNCS(opacity),
+ 0,
+ GROUP_NORMAL
}
};
diff --git a/src/select/properties/Makefile b/src/select/properties/Makefile
index 1721205..7f48fab 100644
--- a/src/select/properties/Makefile
+++ b/src/select/properties/Makefile
@@ -56,6 +56,7 @@ max_height.c \
max_width.c \
min_height.c \
min_width.c \
+opacity.c \
orphans.c \
outline_color.c \
outline_style.c \
diff --git a/src/select/properties/opacity.c b/src/select/properties/opacity.c
new file mode 100644
index 0000000..9ef0998
--- /dev/null
+++ b/src/select/properties/opacity.c
@@ -0,0 +1,62 @@
+/*
+ * This file is part of LibCSS
+ * Licensed under the MIT License,
+ * http://www.opensource.org/licenses/mit-license.php
+ * Copyright 2011 John-Mark Bell <jmb@netsurf-browser.org>
+ */
+
+#include "bytecode/bytecode.h"
+#include "bytecode/opcodes.h"
+#include "select/propset.h"
+#include "select/propget.h"
+#include "utils/utils.h"
+
+#include "select/properties/properties.h"
+#include "select/properties/helpers.h"
+
+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;
+}
+
+css_error css__set_opacity_from_hint(const css_hint *hint,
+ css_computed_style *style)
+{
+ return set_opacity(style, hint->status, hint->data.fixed);
+}
+
+css_error css__initial_opacity(css_select_state *state)
+{
+ return set_opacity(state->computed, CSS_OPACITY_SET, INTTOFIX(1));
+}
+
+css_error css__compose_opacity(const css_computed_style *parent,
+ const css_computed_style *child,
+ css_computed_style *result)
+{
+ css_fixed opacity = 0;
+ uint8_t type = get_opacity(child, &opacity);
+
+ if (type == CSS_OPACITY_INHERIT) {
+ type = get_opacity(parent, &opacity);
+ }
+
+ return set_opacity(result, type, opacity);
+}
+
diff --git a/src/select/properties/properties.h b/src/select/properties/properties.h
index 5312ce9..2f3fca4 100644
--- a/src/select/properties/properties.h
+++ b/src/select/properties/properties.h
@@ -77,6 +77,7 @@ PROPERTY_FUNCS(max_height);
PROPERTY_FUNCS(max_width);
PROPERTY_FUNCS(min_height);
PROPERTY_FUNCS(min_width);
+PROPERTY_FUNCS(opacity);
PROPERTY_FUNCS(orphans);
PROPERTY_FUNCS(outline_color);
PROPERTY_FUNCS(outline_style);
diff --git a/src/select/propget.h b/src/select/propget.h
index bf59e87..40aa51a 100644
--- a/src/select/propget.h
+++ b/src/select/propget.h
@@ -1310,6 +1310,28 @@ static inline uint8_t get_position(
#undef POSITION_SHIFT
#undef POSITION_INDEX
+#define OPACITY_INDEX 23
+#define OPACITY_SHIFT 2
+#define OPACITY_MASK 0x04
+static inline uint8_t get_opacity(
+ const css_computed_style *style,
+ css_fixed *opacity)
+{
+ uint8_t bits = style->bits[OPACITY_INDEX];
+ bits &= OPACITY_MASK;
+ bits >>= OPACITY_SHIFT;
+
+ /* 1bit: t : type */
+ if ((bits & 0x1) == CSS_OPACITY_SET) {
+ *opacity = style->opacity;
+ }
+
+ return (bits & 0x1);
+}
+#undef OPACITY_MASK
+#undef OPACITY_SHIFT
+#undef OPACITY_INDEX
+
#define TEXT_TRANSFORM_INDEX 24
#define TEXT_TRANSFORM_SHIFT 0
#define TEXT_TRANSFORM_MASK 0x7
diff --git a/src/select/propset.h b/src/select/propset.h
index 97d76b9..766f30d 100644
--- a/src/select/propset.h
+++ b/src/select/propset.h
@@ -1391,6 +1391,27 @@ static inline css_error set_position(
#undef POSITION_SHIFT
#undef POSITION_INDEX
+#define OPACITY_INDEX 23
+#define OPACITY_SHIFT 2
+#define OPACITY_MASK 0x04
+static inline css_error set_opacity(
+ css_computed_style *style,
+ uint8_t type, css_fixed opacity)
+{
+ uint8_t *bits = &style->bits[OPACITY_INDEX];
+
+ /* 1bit: t : type */
+ *bits = (*bits & ~OPACITY_MASK) |
+ ((type & 0x1) << OPACITY_SHIFT);
+
+ style->opacity = opacity;
+
+ return CSS_OK;
+}
+#undef OPACITY_MASK
+#undef OPACITY_SHIFT
+#undef OPACITY_INDEX
+
#define TEXT_TRANSFORM_INDEX 24
#define TEXT_TRANSFORM_SHIFT 0
#define TEXT_TRANSFORM_MASK 0x7