diff options
Diffstat (limited to 'src/bytecode')
-rw-r--r-- | src/bytecode/bytecode.h | 49 | ||||
-rw-r--r-- | src/bytecode/opcodes.h | 65 |
2 files changed, 103 insertions, 11 deletions
diff --git a/src/bytecode/bytecode.h b/src/bytecode/bytecode.h index 7f5ea9d..d799194 100644 --- a/src/bytecode/bytecode.h +++ b/src/bytecode/bytecode.h @@ -14,15 +14,37 @@ #include <libcss/types.h> #include <libcss/properties.h> +#include "bytecode/opcodes.h" + typedef uint32_t css_code_t; typedef enum css_properties_e opcode_t; +enum flag_value { + FLAG_VALUE__NONE = 0, + FLAG_VALUE_INHERIT = 1, + FLAG_VALUE_INITIAL = 2, + FLAG_VALUE_REVERT = 3, + FLAG_VALUE_UNSET = 4, +}; + enum flag { - FLAG_IMPORTANT = (1<<0), - FLAG_INHERIT = (1<<1) + FLAG_IMPORTANT = (1 << 0), + FLAG_INHERIT = (FLAG_VALUE_INHERIT << 1), + FLAG_INITIAL = (FLAG_VALUE_INITIAL << 1), + FLAG_REVERT = (FLAG_VALUE_REVERT << 1), + FLAG_UNSET = (FLAG_VALUE_UNSET << 1), }; +enum calc_opcodes { + CALC_PUSH_NUMBER = 'N', + CALC_PUSH_VALUE = 'V', + CALC_ADD = '+', + CALC_SUBTRACT = '-', + CALC_MULTIPLY = '*', + CALC_DIVIDE = '/', + CALC_FINISH = '=', +}; typedef enum unit { UNIT_LENGTH = (1u << 8), @@ -65,6 +87,10 @@ typedef enum unit { UNIT_DPI = (1 << 13) + 0, UNIT_DPCM = (1 << 13) + 1, UNIT_DPPX = (1 << 13) + 2, + + /* These are special only to the CALC bytecodes */ + UNIT_CALC_ANY = (1 << 20), + UNIT_CALC_NUMBER = (1 << 20) + 1, } unit; typedef uint32_t colour; @@ -95,12 +121,27 @@ static inline uint16_t getValue(css_code_t OPV) static inline bool isImportant(css_code_t OPV) { - return getFlags(OPV) & 0x1; + return getFlags(OPV) & FLAG_IMPORTANT; +} + +static inline enum flag_value getFlagValue(css_code_t OPV) +{ + return (getFlags(OPV) >> 1) & 0x7; +} + +static inline bool hasFlagValue(css_code_t OPV) +{ + return getFlagValue(OPV) != FLAG_VALUE__NONE; } static inline bool isInherit(css_code_t OPV) { - return getFlags(OPV) & 0x2; + return getFlagValue(OPV) == FLAG_VALUE_INHERIT; +} + +static inline bool isCalc(css_code_t OPV) +{ + return getValue(OPV) == VALUE_IS_CALC; } #endif diff --git a/src/bytecode/opcodes.h b/src/bytecode/opcodes.h index 01ea25a..44ab23d 100644 --- a/src/bytecode/opcodes.h +++ b/src/bytecode/opcodes.h @@ -10,6 +10,8 @@ #include <inttypes.h> +#define VALUE_IS_CALC 0x007f + enum op_align_content { ALIGN_CONTENT_STRETCH = 0x0000, ALIGN_CONTENT_FLEX_START = 0x0001, @@ -29,11 +31,11 @@ enum op_align_items { }; enum op_align_self { - ALIGN_SELF_STRETCH = 0x0000, - ALIGN_SELF_FLEX_START = 0x0001, - ALIGN_SELF_FLEX_END = 0x0002, - ALIGN_SELF_CENTER = 0x0003, - ALIGN_SELF_BASELINE = 0x0004, + ALIGN_SELF_STRETCH = ALIGN_ITEMS_STRETCH, + ALIGN_SELF_FLEX_START = ALIGN_ITEMS_FLEX_START, + ALIGN_SELF_FLEX_END = ALIGN_ITEMS_FLEX_END, + ALIGN_SELF_CENTER = ALIGN_ITEMS_CENTER, + ALIGN_SELF_BASELINE = ALIGN_ITEMS_BASELINE, ALIGN_SELF_AUTO = 0x0005 }; @@ -119,6 +121,7 @@ enum op_border_style { }; enum op_border_width { + BORDER_WIDTH_CALC = VALUE_IS_CALC, BORDER_WIDTH_SET = 0x0080, BORDER_WIDTH_THIN = 0x0000, BORDER_WIDTH_MEDIUM = 0x0001, @@ -126,6 +129,7 @@ enum op_border_width { }; enum op_bottom { + BOTTOM_CALC = VALUE_IS_CALC, BOTTOM_SET = 0x0080, BOTTOM_AUTO = 0x0000 }; @@ -198,6 +202,7 @@ enum op_color { enum op_column_count { COLUMN_COUNT_AUTO = 0x0000, + COLUMN_COUNT_CALC = VALUE_IS_CALC, COLUMN_COUNT_SET = 0x0080 }; @@ -208,6 +213,7 @@ enum op_column_fill { enum op_column_gap { COLUMN_GAP_NORMAL = 0x0000, + COLUMN_GAP_CALC = VALUE_IS_CALC, COLUMN_GAP_SET = 0x0080 }; @@ -231,6 +237,7 @@ enum op_column_rule_style { }; enum op_column_rule_width { + COLUMN_RULE_WIDTH_CALC = BORDER_WIDTH_CALC, COLUMN_RULE_WIDTH_SET = BORDER_WIDTH_SET, COLUMN_RULE_WIDTH_THIN = BORDER_WIDTH_THIN, COLUMN_RULE_WIDTH_MEDIUM = BORDER_WIDTH_MEDIUM, @@ -244,6 +251,7 @@ enum op_column_span { enum op_column_width { COLUMN_WIDTH_AUTO = 0x0000, + COLUMN_WIDTH_CALC = VALUE_IS_CALC, COLUMN_WIDTH_SET = 0x0080 }; @@ -332,7 +340,9 @@ enum op_display { DISPLAY_TABLE_CAPTION = 0x000e, DISPLAY_NONE = 0x000f, DISPLAY_FLEX = 0x0010, - DISPLAY_INLINE_FLEX = 0x0011 + DISPLAY_INLINE_FLEX = 0x0011, + DISPLAY_GRID = 0x0012, + DISPLAY_INLINE_GRID = 0x0013 }; enum op_elevation { @@ -349,9 +359,15 @@ enum op_empty_cells { EMPTY_CELLS_HIDE = 0x0001 }; +enum op_fill_opacity { + FILL_OPACITY_SET = 0x0080 +}; + + enum op_flex_basis { FLEX_BASIS_AUTO = 0x0000, FLEX_BASIS_CONTENT = 0x0001, + FLEX_BASIS_CALC = VALUE_IS_CALC, FLEX_BASIS_SET = 0x0080 }; @@ -363,10 +379,12 @@ enum op_flex_direction { }; enum op_flex_grow { + FLEX_GROW_CALC = VALUE_IS_CALC, FLEX_GROW_SET = 0x0080 }; enum op_flex_shrink { + FLEX_SHRINK_CALC = VALUE_IS_CALC, FLEX_SHRINK_SET = 0x0080 }; @@ -396,6 +414,7 @@ enum op_font_family { }; enum op_font_size { + FONT_SIZE_CALC = VALUE_IS_CALC, FONT_SIZE_DIMENSION = 0x0080, FONT_SIZE_XX_SMALL = 0x0000, @@ -437,6 +456,7 @@ enum op_font_weight { }; enum op_height { + HEIGHT_CALC = VALUE_IS_CALC, HEIGHT_SET = 0x0080, HEIGHT_AUTO = 0x0000 }; @@ -451,16 +471,19 @@ enum op_justify_content { }; enum op_left { + LEFT_CALC = BOTTOM_CALC, LEFT_SET = BOTTOM_SET, LEFT_AUTO = BOTTOM_AUTO }; enum op_letter_spacing { + LETTER_SPACING_CALC = VALUE_IS_CALC, LETTER_SPACING_SET = 0x0080, LETTER_SPACING_NORMAL = 0x0000 }; enum op_line_height { + LINE_HEIGHT_CALC = VALUE_IS_CALC, LINE_HEIGHT_NUMBER = 0x0080, LINE_HEIGHT_DIMENSION = 0x0081, LINE_HEIGHT_NORMAL = 0x0000 @@ -532,26 +555,31 @@ enum op_list_style_type { }; enum op_margin { + MARGIN_CALC = VALUE_IS_CALC, MARGIN_SET = 0x0080, MARGIN_AUTO = 0x0000 }; enum op_max_height { + MAX_HEIGHT_CALC = VALUE_IS_CALC, MAX_HEIGHT_SET = 0x0080, MAX_HEIGHT_NONE = 0x0000 }; enum op_max_width { + MAX_WIDTH_CALC = VALUE_IS_CALC, MAX_WIDTH_SET = 0x0080, MAX_WIDTH_NONE = 0x0000 }; enum op_min_height { + MIN_HEIGHT_CALC = VALUE_IS_CALC, MIN_HEIGHT_SET = 0x0080, MIN_HEIGHT_AUTO = 0x0000 }; enum op_min_width { + MIN_WIDTH_CALC = VALUE_IS_CALC, MIN_WIDTH_SET = 0x0080, MIN_WIDTH_AUTO = 0x0000 }; @@ -561,10 +589,12 @@ enum op_opacity { }; enum op_order { + ORDER_CALC = VALUE_IS_CALC, ORDER_SET = 0x0080 }; enum op_orphans { + ORPHANS_CALC = VALUE_IS_CALC, ORPHANS_SET = 0x0080 }; @@ -603,6 +633,7 @@ enum op_overflow { }; enum op_padding { + PADDING_CALC = VALUE_IS_CALC, PADDING_SET = 0x0080 }; @@ -628,18 +659,22 @@ enum op_page_break_inside { }; enum op_pause_after { + PAUSE_AFTER_CALC = VALUE_IS_CALC, PAUSE_AFTER_SET = 0x0080 }; enum op_pause_before { + PAUSE_BEFORE_CALC = VALUE_IS_CALC, PAUSE_BEFORE_SET = 0x0080 }; enum op_pitch_range { + PITCH_RANGE_CALC = VALUE_IS_CALC, PITCH_RANGE_SET = 0x0080 }; enum op_pitch { + PITCH_CALC = VALUE_IS_CALC, PITCH_FREQUENCY = 0x0080, PITCH_X_LOW = 0x0000, @@ -663,7 +698,8 @@ enum op_position { POSITION_STATIC = 0x0000, POSITION_RELATIVE = 0x0001, POSITION_ABSOLUTE = 0x0002, - POSITION_FIXED = 0x0003 + POSITION_FIXED = 0x0003, + POSITION_STICKY = 0x0004 }; enum op_quotes { @@ -673,6 +709,7 @@ enum op_quotes { }; enum op_richness { + RICHNESS_CALC = VALUE_IS_CALC, RICHNESS_SET = 0x0080 }; @@ -703,6 +740,7 @@ enum op_speak { }; enum op_speech_rate { + SPEECH_RATE_CALC = VALUE_IS_CALC, SPEECH_RATE_SET = 0x0080, SPEECH_RATE_X_SLOW = 0x0000, @@ -715,9 +753,14 @@ enum op_speech_rate { }; enum op_stress { + STRESS_CALC = VALUE_IS_CALC, STRESS_SET = 0x0080 }; +enum op_stroke_opacity { + STROKE_OPACITY_SET = 0x0080 +}; + enum op_table_layout { TABLE_LAYOUT_AUTO = 0x0000, TABLE_LAYOUT_FIXED = 0x0001 @@ -743,6 +786,7 @@ enum op_text_decoration { }; enum op_text_indent { + TEXT_INDENT_CALC = VALUE_IS_CALC, TEXT_INDENT_SET = 0x0080 }; @@ -754,6 +798,7 @@ enum op_text_transform { }; enum op_top { + TOP_CALC = BOTTOM_CALC, TOP_SET = BOTTOM_SET, TOP_AUTO = BOTTOM_AUTO }; @@ -765,6 +810,7 @@ enum op_unicode_bidi { }; enum op_vertical_align { + VERTICAL_ALIGN_CALC = VALUE_IS_CALC, VERTICAL_ALIGN_SET = 0x0080, VERTICAL_ALIGN_BASELINE = 0x0000, @@ -795,6 +841,7 @@ enum op_voice_family { }; enum op_volume { + VOLUME_CALC = VALUE_IS_CALC, VOLUME_NUMBER = 0x0080, VOLUME_DIMENSION = 0x0081, @@ -815,16 +862,19 @@ enum op_white_space { }; enum op_widows { + WIDOWS_CALC = VALUE_IS_CALC, WIDOWS_SET = 0x0080 }; enum op_width { + WIDTH_CALC = VALUE_IS_CALC, WIDTH_SET = 0x0080, WIDTH_AUTO = 0x0000 }; enum op_word_spacing { + WORD_SPACING_CALC = VALUE_IS_CALC, WORD_SPACING_SET = 0x0080, WORD_SPACING_NORMAL = 0x0000 @@ -837,6 +887,7 @@ enum op_writing_mode { }; enum op_z_index { + Z_INDEX_CALC = VALUE_IS_CALC, Z_INDEX_SET = 0x0080, Z_INDEX_AUTO = 0x0000 |