diff options
Diffstat (limited to 'src/setup.c')
| -rw-r--r-- | src/setup.c | 70 |
1 files changed, 69 insertions, 1 deletions
diff --git a/src/setup.c b/src/setup.c index 9780807..cf23044 100644 --- a/src/setup.c +++ b/src/setup.c @@ -155,6 +155,35 @@ image_sizes_compare_func (TImageSize *a, TImageSize *b) return sa - sb; } +static gdouble * +parse_hidpi_sizes (const gchar *s) +{ + gchar **split; + GArray *arr; + gchar *s2; + int i; + gdouble f; + + if (! s || strlen (s) == 0) + return NULL; + + arr = g_array_new (TRUE, TRUE, sizeof (gdouble)); + split = g_strsplit (s, ",", -1); + + for (i = 0; split[i] != NULL; i++) { + s2 = g_strstrip (split[i]); + if (s2[strlen(s2) - 1] != 'x') + continue; + s2[strlen(s2) - 1] = '\0'; + f = g_ascii_strtod (s2, NULL); + g_array_append_val (arr, f); + } + g_strfreev (split); + + return (gdouble *) g_array_free (arr, FALSE); +} + + /* * parse_design_setup_xml: XML parser for design.xml file */ @@ -166,7 +195,7 @@ parse_design_setup_xml (const gchar *filename) gchar *s2; gchar *s3; TGalleryDesign *design; - TImageSize *image_size; + TImageSize *image_size, *hidpi_image_size; TGalleryDesignTheme *theme; int count, c; int i, j; @@ -202,6 +231,17 @@ parse_design_setup_xml (const gchar *filename) } + /* hidpi section */ + if (xml_file_get_node_attribute_boolean_with_default (xml, "/design_setup/hidpi", "enabled", FALSE)) { + design->hidpi_upscale_threshold = xml_file_get_node_attribute_long_with_default (xml, "/design_setup/hidpi/threshold", "upscale", DEFAULT_UPSCALE_THRESHOLD); + s = xml_file_get_node_value (xml, "/design_setup/hidpi/sizes/text()"); + design->hidpi_sizes = parse_hidpi_sizes (s); + g_free (s); + design->hidpi_quality = xml_file_get_node_attribute_long_with_default (xml, "/design_setup/hidpi/quality", "value", -1); + design->hidpi_thumbnail_quality = xml_file_get_node_attribute_long_with_default (xml, "/design_setup/hidpi/quality", "thumbnail", -1); + } + + /* image_sizes section */ count = xml_file_node_get_children_count (xml, "/design_setup/image_sizes/size"); for (i = 0; i < count; i++) { @@ -268,6 +308,33 @@ parse_design_setup_xml (const gchar *filename) image_size->quality_threshold = xml_file_get_node_attribute_long_with_default (xml, s, "quality", DEFAULT_QUALITY_THRESHOLD); g_free (s); + /* Generate HiDPI sizes */ + if (design->hidpi_sizes) + for (j = 0; design->hidpi_sizes[j] != 0; j++ ) { + hidpi_image_size = g_malloc0 (sizeof (TImageSize)); + memcpy (hidpi_image_size, image_size, sizeof (TImageSize)); + hidpi_image_size->is_hidpi = TRUE; + hidpi_image_size->hidpi_scale_factor = design->hidpi_sizes[j]; + hidpi_image_size->hidpi_ref_size = image_size; + hidpi_image_size->tagname = NULL; + hidpi_image_size->fallback_size = NULL; + hidpi_image_size->quality_threshold = 0; + hidpi_image_size->no_resize_threshold = 0; + hidpi_image_size->availability_threshold = 0; + hidpi_image_size->name = g_strdup_printf (HIDPI_NAME_FORMAT, image_size->name, hidpi_image_size->hidpi_scale_factor); + hidpi_image_size->landscape_width = lround ((gdouble) image_size->landscape_width * hidpi_image_size->hidpi_scale_factor); + hidpi_image_size->landscape_height = lround ((gdouble) image_size->landscape_height * hidpi_image_size->hidpi_scale_factor); + hidpi_image_size->portrait_width = lround ((gdouble) image_size->portrait_width * hidpi_image_size->hidpi_scale_factor); + hidpi_image_size->portrait_height = lround ((gdouble) image_size->portrait_height * hidpi_image_size->hidpi_scale_factor); + hidpi_image_size->square_size = lround ((gdouble) image_size->square_size * hidpi_image_size->hidpi_scale_factor); + hidpi_image_size->crop_width = lround ((gdouble) image_size->crop_width * hidpi_image_size->hidpi_scale_factor); + hidpi_image_size->crop_height = lround ((gdouble) image_size->crop_height * hidpi_image_size->hidpi_scale_factor); + if (! hidpi_image_size->is_thumbnail && design->hidpi_quality > 0) + hidpi_image_size->quality = design->hidpi_quality; + if (hidpi_image_size->is_thumbnail && design->hidpi_thumbnail_quality > 0) + hidpi_image_size->quality = design->hidpi_thumbnail_quality; + design->image_sizes = g_list_append (design->image_sizes, hidpi_image_size); + } } design->image_sizes = g_list_sort (design->image_sizes, (GCompareFunc) image_sizes_compare_func); @@ -676,6 +743,7 @@ free_design_setup_data (TGalleryDesign *design) g_strfreev (design->supplemental_files); g_free (design->imgmagick_resize_opts); g_free (design->imgmagick_thumb_opts); + g_free (design->hidpi_sizes); g_free (design); } } |
