summaryrefslogtreecommitdiff
path: root/src/select/overrides.py
diff options
context:
space:
mode:
authorLucas Neves <lcneves@gmail.com>2017-11-13 21:13:06 +0000
committerLucas Neves <lcneves@gmail.com>2017-11-13 21:13:06 +0000
commit45fb75ae50ab66ba4098beec956ee0695916589c (patch)
tree48b19af9f7938dc93a9d80b858d646f9c89f2f34 /src/select/overrides.py
parenta827023bed3815e332a33dc9f061584cbf424313 (diff)
downloadlibcss-45fb75ae50ab66ba4098beec956ee0695916589c.tar.gz
libcss-45fb75ae50ab66ba4098beec956ee0695916589c.tar.bz2
Select: autogenerator for computed.h, propset.h and propget.h.
Diffstat (limited to 'src/select/overrides.py')
-rw-r--r--src/select/overrides.py226
1 files changed, 226 insertions, 0 deletions
diff --git a/src/select/overrides.py b/src/select/overrides.py
new file mode 100644
index 0000000..fc2117b
--- /dev/null
+++ b/src/select/overrides.py
@@ -0,0 +1,226 @@
+# This file is part of LibCSS.
+# Licensed under the MIT License,
+# http://www.opensource.org/licenses/mit-license.php
+# Copyright 2017 Lucas Neves <lcneves@gmail.com>
+
+overrides = {
+ 'get': {},
+ 'set': {},
+ 'properties': {}
+}
+
+overrides['get']['clip'] = '''\
+static inline uint8_t get_clip(
+ const css_computed_style *style,
+ css_computed_clip_rect *rect)
+{
+ if (style->i.uncommon != NULL) {
+ uint32_t bits = style->i.uncommon->i.bits[CLIP_INDEX];
+ bits &= CLIP_MASK;
+ bits >>= CLIP_SHIFT;
+
+ /*
+ 26bits: tt tttr rrrr bbbb blll llTR BLyy:
+ units: top | right | bottom | left
+ opcodes: top | right | bottom | left | type
+ */
+
+ if ((bits & 0x3) == CSS_CLIP_RECT) {
+ rect->left_auto = (bits & 0x4);
+ rect->bottom_auto = (bits & 0x8);
+ rect->right_auto = (bits & 0x10);
+ rect->top_auto = (bits & 0x20);
+
+ rect->top = style->i.uncommon->i.clip_a;
+ rect->tunit = bits & 0x3e00000;
+
+ rect->right = style->i.uncommon->i.clip_b;
+ rect->runit = bits & 0x1f0000;
+
+ rect->bottom = style->i.uncommon->i.clip_c;
+ rect->bunit = bits & 0xf800;
+
+ rect->left = style->i.uncommon->i.clip_d;
+ rect->lunit = bits & 0x7c0;
+ }
+
+ return (bits & 0x3);
+ }
+
+ /* Initial value */
+ return CSS_CLIP_AUTO;
+}'''
+
+overrides['set']['clip'] = '''\
+static inline css_error set_clip(
+ css_computed_style *style, uint8_t type,
+ css_computed_clip_rect *rect)
+{
+ uint32_t *bits;
+
+ ENSURE_UNCOMMON;
+
+ bits = &style->i.uncommon->i.bits[CLIP_INDEX];
+
+ /*
+ 26bits: tt tttr rrrr bbbb blll llTR BLyy:
+ units: top | right | bottom | left
+ opcodes: top | right | bottom | left | type
+ */
+ *bits = (*bits & ~CLIP_MASK) |
+ ((type & 0x3) << CLIP_SHIFT);
+
+ if (type == CSS_CLIP_RECT) {
+ *bits |= (((rect->top_auto ? 0x20 : 0) |
+ (rect->right_auto ? 0x10 : 0) |
+ (rect->bottom_auto ? 0x8 : 0) |
+ (rect->left_auto ? 0x4 : 0)) << CLIP_SHIFT);
+
+ *bits |= (((rect->tunit << 5) | rect->runit)
+ << (CLIP_SHIFT + 16));
+
+ *bits |= (((rect->bunit << 5) | rect->lunit)
+ << (CLIP_SHIFT + 6));
+
+ style->i.uncommon->i.clip_a = rect->top;
+ style->i.uncommon->i.clip_b = rect->right;
+ style->i.uncommon->i.clip_c = rect->bottom;
+ style->i.uncommon->i.clip_d = rect->left;
+ }
+
+ return CSS_OK;
+}'''
+
+overrides['get']['line_height'] = '''\
+static inline uint8_t get_line_height(
+ const css_computed_style *style,
+ css_fixed *length, css_unit *unit)
+{
+ uint32_t bits = style->i.bits[LINE_HEIGHT_INDEX];
+ bits &= LINE_HEIGHT_MASK;
+ bits >>= LINE_HEIGHT_SHIFT;
+
+ /* 7bits: uuuuutt : units | type */
+ if ((bits & 0x3) == CSS_LINE_HEIGHT_NUMBER ||
+ (bits & 0x3) == CSS_LINE_HEIGHT_DIMENSION) {
+ *length = style->i.line_height;
+ }
+
+ if ((bits & 0x3) == CSS_LINE_HEIGHT_DIMENSION) {
+ *unit = bits >> 2;
+ }
+
+ return (bits & 0x3);
+}'''
+
+overrides['set']['content'] = '''\
+static inline css_error set_content(
+ css_computed_style *style, uint8_t type,
+ css_computed_content_item *content)
+{
+ uint32_t *bits;
+ css_computed_content_item *oldcontent;
+ css_computed_content_item *c;
+
+ ENSURE_UNCOMMON;
+
+ /* 2bits: type */
+ bits = &style->i.uncommon->i.bits[CONTENT_INDEX];
+ oldcontent = style->i.uncommon->content;
+
+ *bits = (*bits & ~CONTENT_MASK) |
+ ((type & 0x3) << CONTENT_SHIFT);
+
+ for (c = content; c != NULL &&
+ c->type != CSS_COMPUTED_CONTENT_NONE; c++) {
+ switch (c->type) {
+ case CSS_COMPUTED_CONTENT_STRING:
+ c->data.string = lwc_string_ref(c->data.string);
+ break;
+ case CSS_COMPUTED_CONTENT_URI:
+ c->data.uri = lwc_string_ref(c->data.uri);
+ break;
+ case CSS_COMPUTED_CONTENT_ATTR:
+ c->data.attr = lwc_string_ref(c->data.attr);
+ break;
+ case CSS_COMPUTED_CONTENT_COUNTER:
+ c->data.counter.name =
+ lwc_string_ref(c->data.counter.name);
+ break;
+ case CSS_COMPUTED_CONTENT_COUNTERS:
+ c->data.counters.name =
+ lwc_string_ref(c->data.counters.name);
+ c->data.counters.sep =
+ lwc_string_ref(c->data.counters.sep);
+ break;
+ default:
+ break;
+ }
+ }
+
+ style->i.uncommon->content = content;
+
+ /* Free existing array */
+ if (oldcontent != NULL) {
+ for (c = oldcontent;
+ c->type != CSS_COMPUTED_CONTENT_NONE; c++) {
+ switch (c->type) {
+ case CSS_COMPUTED_CONTENT_STRING:
+ lwc_string_unref(c->data.string);
+ break;
+ case CSS_COMPUTED_CONTENT_URI:
+ lwc_string_unref(c->data.uri);
+ break;
+ case CSS_COMPUTED_CONTENT_ATTR:
+ lwc_string_unref(c->data.attr);
+ break;
+ case CSS_COMPUTED_CONTENT_COUNTER:
+ lwc_string_unref(c->data.counter.name);
+ break;
+ case CSS_COMPUTED_CONTENT_COUNTERS:
+ lwc_string_unref(c->data.counters.name);
+ lwc_string_unref(c->data.counters.sep);
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (oldcontent != content)
+ free(oldcontent);
+ }
+
+ return CSS_OK;
+}'''
+
+get_side = '''\
+static inline uint8_t get_{0}(
+ const css_computed_style *style,
+ css_fixed *length, css_unit *unit)
+{{
+ uint32_t bits = style->i.bits[{1}_INDEX];
+ bits &= {1}_MASK;
+ bits >>= {1}_SHIFT;
+
+ /* 7bits: uuuuutt : units | type */
+ if ((bits & 0x3) == CSS_{1}_SET) {{
+ *length = style->i.{0};
+ *unit = bits >> 2;
+ }}
+
+ return (bits & 0x7);
+}}
+static inline uint8_t get_{0}_bits(
+ const css_computed_style *style)
+{{
+ uint32_t bits = style->i.bits[{1}_INDEX];
+ bits &= {1}_MASK;
+ bits >>= {1}_SHIFT;
+
+ /* 7bits: uuuuutt : units | type */
+ return bits;
+}}'''
+overrides['get']['top'] = get_side.format('top', 'TOP')
+overrides['get']['right'] = get_side.format('right', 'RIGHT')
+overrides['get']['bottom'] = get_side.format('bottom', 'BOTTOM')
+overrides['get']['left'] = get_side.format('left', 'LEFT')