summaryrefslogtreecommitdiff
path: root/pango/serializer.c
diff options
context:
space:
mode:
Diffstat (limited to 'pango/serializer.c')
-rw-r--r--pango/serializer.c241
1 files changed, 123 insertions, 118 deletions
diff --git a/pango/serializer.c b/pango/serializer.c
index ddd9de4c..78bd59a3 100644
--- a/pango/serializer.c
+++ b/pango/serializer.c
@@ -27,6 +27,7 @@
#include <pango/pango-enum-types.h>
#include <pango/pango-font-private.h>
#include <pango/pango-hbface.h>
+#include <pango/pango-attributes-private.h>
#include <hb-ot.h>
#include "pango/json/gtkjsonparserprivate.h"
@@ -163,46 +164,49 @@ get_weight_name (int weight)
return NULL;
}
-static const char *attr_type_names[] = {
- "invalid",
- "language",
- "family",
- "style",
- "weight",
- "variant",
- "stretch",
- "size",
- "font-desc",
- "foreground",
- "background",
- "underline",
- "strikethrough",
- "rise",
- "scale",
- "fallback",
- "letter-spacing",
- "underline-color",
- "strikethrough-color",
- "absolute-size",
- "gravity",
- "gravity-hint",
- "font-features",
- "foreground-alpha",
- "background-alpha",
- "allow-breaks",
- "show",
- "insert-hyphens",
- "overline",
- "overline-color",
- "line-height",
- "absolute-line-height",
- "text-transform",
- "word",
- "sentence",
- "baseline-shift",
- "font-scale",
- NULL
-};
+static PangoAttrType
+get_attr_type (const char *nick)
+{
+ GEnumClass *enum_class;
+ GEnumValue *enum_value = NULL;
+
+ enum_class = g_type_class_ref (PANGO_TYPE_ATTR_TYPE);
+ for (int i = 0; i < enum_class->n_values; i++)
+ {
+ enum_value = &enum_class->values[i];
+ if (strcmp (enum_value->value_nick, nick) == 0)
+ break;
+ enum_value = NULL;
+ }
+ g_type_class_unref (enum_class);
+
+ if (enum_value)
+ return enum_value->value;
+
+ return 0;
+}
+
+static const char *
+get_attr_type_name (PangoAttrType type)
+{
+ GEnumClass *enum_class;
+ GEnumValue *enum_value = NULL;
+
+ enum_class = g_type_class_ref (PANGO_TYPE_ATTR_TYPE);
+ for (int i = 0; i < enum_class->n_values; i++)
+ {
+ enum_value = &enum_class->values[i];
+ if (enum_value->value == type)
+ break;
+ enum_value = NULL;
+ }
+ g_type_class_unref (enum_class);
+
+ if (enum_value)
+ return enum_value->value_nick;
+
+ return NULL;
+}
static const char *
get_script_name (PangoScript script)
@@ -293,110 +297,106 @@ add_attribute (GtkJsonPrinter *printer,
gtk_json_printer_add_integer (printer, "start", (int)attr->start_index);
if (attr->end_index != PANGO_ATTR_INDEX_TO_TEXT_END)
gtk_json_printer_add_integer (printer, "end", (int)attr->end_index);
- gtk_json_printer_add_string (printer, "type", attr_type_names[attr->klass->type]);
+ gtk_json_printer_add_string (printer, "type", get_attr_type_name (attr->type));
- switch (attr->klass->type)
+ switch (PANGO_ATTR_VALUE_TYPE (attr))
{
- default:
- case PANGO_ATTR_INVALID:
- g_assert_not_reached ();
- case PANGO_ATTR_LANGUAGE:
- gtk_json_printer_add_string (printer, "value", pango_language_to_string (((PangoAttrLanguage*)attr)->value));
- break;
- case PANGO_ATTR_FAMILY:
- case PANGO_ATTR_FONT_FEATURES:
- gtk_json_printer_add_string (printer, "value", ((PangoAttrString*)attr)->value);
- break;
- case PANGO_ATTR_STYLE:
- gtk_json_printer_add_string (printer, "value", style_names[((PangoAttrInt*)attr)->value]);
+ case PANGO_ATTR_VALUE_STRING:
+ gtk_json_printer_add_string (printer, "value", attr->str_value);
break;
- case PANGO_ATTR_VARIANT:
- gtk_json_printer_add_string (printer, "value", variant_names[((PangoAttrInt*)attr)->value]);
- break;
+ case PANGO_ATTR_VALUE_INT:
+ switch ((int)attr->type)
+ {
+ case PANGO_ATTR_STYLE:
+ gtk_json_printer_add_string (printer, "value", style_names[attr->int_value]);
+ break;
- case PANGO_ATTR_STRETCH:
- gtk_json_printer_add_string (printer, "value", stretch_names[((PangoAttrInt*)attr)->value]);
- break;
+ case PANGO_ATTR_VARIANT:
+ gtk_json_printer_add_string (printer, "value", variant_names[attr->int_value]);
+ break;
- case PANGO_ATTR_UNDERLINE:
- gtk_json_printer_add_string (printer, "value", underline_names[((PangoAttrInt*)attr)->value]);
- break;
+ case PANGO_ATTR_STRETCH:
+ gtk_json_printer_add_string (printer, "value", stretch_names[attr->int_value]);
+ break;
- case PANGO_ATTR_OVERLINE:
- gtk_json_printer_add_string (printer, "value", overline_names[((PangoAttrInt*)attr)->value]);
- break;
+ case PANGO_ATTR_UNDERLINE:
+ gtk_json_printer_add_string (printer, "value", underline_names[attr->int_value]);
+ break;
- case PANGO_ATTR_GRAVITY:
- gtk_json_printer_add_string (printer, "value", gravity_names[((PangoAttrInt*)attr)->value]);
- break;
+ case PANGO_ATTR_OVERLINE:
+ gtk_json_printer_add_string (printer, "value", overline_names[attr->int_value]);
+ break;
- case PANGO_ATTR_GRAVITY_HINT:
- gtk_json_printer_add_string (printer, "value", gravity_hint_names[((PangoAttrInt*)attr)->value]);
- break;
+ case PANGO_ATTR_GRAVITY:
+ gtk_json_printer_add_string (printer, "value", gravity_names[attr->int_value]);
+ break;
- case PANGO_ATTR_TEXT_TRANSFORM:
- gtk_json_printer_add_string (printer, "value", text_transform_names[((PangoAttrInt*)attr)->value]);
- break;
+ case PANGO_ATTR_GRAVITY_HINT:
+ gtk_json_printer_add_string (printer, "value", gravity_hint_names[attr->int_value]);
+ break;
- case PANGO_ATTR_FONT_SCALE:
- gtk_json_printer_add_string (printer, "value", font_scale_names[((PangoAttrInt*)attr)->value]);
- break;
+ case PANGO_ATTR_TEXT_TRANSFORM:
+ gtk_json_printer_add_string (printer, "value", text_transform_names[attr->int_value]);
+ break;
- case PANGO_ATTR_WEIGHT:
- {
- const char *name = get_weight_name (((PangoAttrInt*)attr)->value);
- if (name)
- gtk_json_printer_add_string (printer, "value", name);
- else
- gtk_json_printer_add_integer (printer, "value", ((PangoAttrInt*)attr)->value);
- }
- break;
+ case PANGO_ATTR_FONT_SCALE:
+ gtk_json_printer_add_string (printer, "value", font_scale_names[attr->int_value]);
+ break;
+
+ case PANGO_ATTR_WEIGHT:
+ {
+ const char *name = get_weight_name (attr->int_value);
+ if (name)
+ gtk_json_printer_add_string (printer, "value", name);
+ else
+ gtk_json_printer_add_integer (printer, "value", attr->int_value);
+ }
+ break;
+
+ case PANGO_ATTR_BASELINE_SHIFT:
+ gtk_json_printer_add_string (printer, "value", baseline_shift_names[attr->int_value]);
+ break;
+
+ default:
+ gtk_json_printer_add_integer (printer, "value", attr->int_value);
+ break;
+ }
- case PANGO_ATTR_BASELINE_SHIFT:
- gtk_json_printer_add_string (printer, "value", baseline_shift_names[((PangoAttrInt*)attr)->value]);
break;
+ case PANGO_ATTR_VALUE_BOOLEAN:
+ gtk_json_printer_add_boolean (printer, "value", attr->boolean_value);
+ break;
- case PANGO_ATTR_SIZE:
- case PANGO_ATTR_RISE:
- case PANGO_ATTR_LETTER_SPACING:
- case PANGO_ATTR_ABSOLUTE_SIZE:
- case PANGO_ATTR_FOREGROUND_ALPHA:
- case PANGO_ATTR_BACKGROUND_ALPHA:
- case PANGO_ATTR_SHOW:
- case PANGO_ATTR_WORD:
- case PANGO_ATTR_SENTENCE:
- case PANGO_ATTR_ABSOLUTE_LINE_HEIGHT:
- gtk_json_printer_add_integer (printer, "value", ((PangoAttrInt*)attr)->value);
+ case PANGO_ATTR_VALUE_LANGUAGE:
+ gtk_json_printer_add_string (printer, "value", pango_language_to_string (attr->lang_value));
break;
- case PANGO_ATTR_FONT_DESC:
- str = font_description_to_string (((PangoAttrFontDesc*)attr)->desc);
+ case PANGO_ATTR_VALUE_FONT_DESC:
+ str = font_description_to_string (attr->font_value);
gtk_json_printer_add_string (printer, "value", str);
g_free (str);
break;
- case PANGO_ATTR_FOREGROUND:
- case PANGO_ATTR_BACKGROUND:
- case PANGO_ATTR_UNDERLINE_COLOR:
- case PANGO_ATTR_OVERLINE_COLOR:
- case PANGO_ATTR_STRIKETHROUGH_COLOR:
- str = pango_color_to_string (&((PangoAttrColor*)attr)->color);
+ case PANGO_ATTR_VALUE_COLOR:
+ str = pango_color_to_string (&attr->color_value);
gtk_json_printer_add_string (printer, "value", str);
g_free (str);
break;
- case PANGO_ATTR_STRIKETHROUGH:
- case PANGO_ATTR_FALLBACK:
- case PANGO_ATTR_ALLOW_BREAKS:
- case PANGO_ATTR_INSERT_HYPHENS:
- gtk_json_printer_add_boolean (printer, "value", ((PangoAttrInt*)attr)->value != 0);
+ case PANGO_ATTR_VALUE_FLOAT:
+ gtk_json_printer_add_number (printer, "value", attr->double_value);
break;
- case PANGO_ATTR_SCALE:
- case PANGO_ATTR_LINE_HEIGHT:
- gtk_json_printer_add_number (printer, "value", ((PangoAttrFloat*)attr)->value);
+ case PANGO_ATTR_VALUE_POINTER:
+ str = pango_attr_value_serialize (attr);
+ gtk_json_printer_add_string (printer, "value", str);
+ g_free (str);
+ break;
+
+ default:
+ g_assert_not_reached ();
}
gtk_json_printer_end (printer);
@@ -1158,7 +1158,7 @@ json_to_attribute (GtkJsonParser *parser)
break;
case ATTR_TYPE:
- type = parser_select_string (parser, attr_type_names);
+ type = get_attr_type (gtk_json_parser_get_string (parser));
break;
case ATTR_VALUE:
@@ -1172,7 +1172,12 @@ json_to_attribute (GtkJsonParser *parser)
while (gtk_json_parser_next (parser));
if (!attr && !gtk_json_parser_get_error (parser))
- gtk_json_parser_schema_error (parser, "Attribute missing \"value\"");
+ {
+ if (type == PANGO_ATTR_INVALID)
+ gtk_json_parser_schema_error (parser, "Invalid attribute \"type\"");
+ else
+ gtk_json_parser_schema_error (parser, "Attribute missing \"value\"");
+ }
gtk_json_parser_end (parser);