[evince] libgd: Update from libgd git master
- From: Bastien Nocera <hadess src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evince] libgd: Update from libgd git master
- Date: Sat, 22 Jul 2017 12:41:19 +0000 (UTC)
commit 5bc3704283b2732c305da2edcb164a9e63efec69
Author: Bastien Nocera <hadess hadess net>
Date: Wed Jul 19 18:06:57 2017 +0200
libgd: Update from libgd git master
https://bugzilla.gnome.org/show_bug.cgi?id=784913
cut-n-paste/libgd/gd-icon-utils.c | 265 ++++++++++++++++++++++++++---
cut-n-paste/libgd/gd-icon-utils.h | 24 ++-
cut-n-paste/libgd/gd-two-lines-renderer.c | 48 +++++-
shell/ev-recent-view.c | 6 +-
4 files changed, 306 insertions(+), 37 deletions(-)
---
diff --git a/cut-n-paste/libgd/gd-icon-utils.c b/cut-n-paste/libgd/gd-icon-utils.c
index dc6e704..6c9dd40 100644
--- a/cut-n-paste/libgd/gd-icon-utils.c
+++ b/cut-n-paste/libgd/gd-icon-utils.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2012 Red Hat, Inc.
+ * Copyright (c) 2011, 2012, 2015, 2016 Red Hat, Inc.
*
* Gnome Documents is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
@@ -29,17 +29,161 @@
#define _EMBLEM_MIN_SIZE 8
/**
- * gd_create_symbolic_icon:
+ * gd_copy_image_surface:
+ * @surface:
+ *
+ * Returns: (transfer full):
+ */
+cairo_surface_t *
+gd_copy_image_surface (cairo_surface_t *surface)
+{
+ cairo_surface_t *copy = NULL;
+ cairo_t *cr;
+ gdouble scale_x;
+ gdouble scale_y;
+
+ copy = cairo_surface_create_similar_image (surface, CAIRO_FORMAT_ARGB32,
+ cairo_image_surface_get_width (surface),
+ cairo_image_surface_get_height (surface));
+ cairo_surface_get_device_scale (surface, &scale_x, &scale_y);
+ cairo_surface_set_device_scale (copy, scale_x, scale_y);
+
+ cr = cairo_create (copy);
+ cairo_set_source_surface (cr, surface, 0, 0);
+ cairo_paint (cr);
+ cairo_destroy (cr);
+
+ return copy;
+}
+
+/**
+ * gd_create_surface_with_counter:
+ * @widget:
+ * @base:
+ * @number:
+ *
+ * Returns: (transfer full):
+ */
+cairo_surface_t *
+gd_create_surface_with_counter (GtkWidget *widget, cairo_surface_t *base, gint number)
+{
+ GtkStyleContext *context;
+ cairo_t *cr, *emblem_cr;
+ cairo_surface_t *emblem_surface;
+ cairo_surface_t *surface;
+ gint height;
+ gint height_scaled;
+ gint width;
+ gint width_scaled;
+ gint layout_width, layout_height;
+ gint emblem_size;
+ gint emblem_size_scaled;
+ gdouble scale;
+ gdouble scale_x;
+ gdouble scale_y;
+ gchar *str;
+ PangoLayout *layout;
+ PangoAttrList *attr_list;
+ PangoAttribute *attr;
+ PangoFontDescription *desc;
+ GdkRGBA color;
+
+ context = gtk_widget_get_style_context (GTK_WIDGET (widget));
+ gtk_style_context_save (context);
+ gtk_style_context_add_class (context, "documents-counter");
+
+ width_scaled = cairo_image_surface_get_width (base);
+ height_scaled = cairo_image_surface_get_height (base);
+ cairo_surface_get_device_scale (base, &scale_x, &scale_y);
+
+ width = width_scaled / (gint) floor (scale_x),
+ height = height_scaled / (gint) floor (scale_y);
+
+ surface = cairo_surface_create_similar_image (base, CAIRO_FORMAT_ARGB32,
+ width_scaled, height_scaled);
+ cairo_surface_set_device_scale (surface, scale_x, scale_y);
+
+ cr = cairo_create (surface);
+ cairo_set_source_surface (cr, base, 0, 0);
+ cairo_paint (cr);
+
+ emblem_size_scaled = MIN (width_scaled / 2, height_scaled / 2);
+ emblem_size = MIN (width / 2, height / 2);
+
+ emblem_surface = cairo_surface_create_similar_image (base, CAIRO_FORMAT_ARGB32,
+ emblem_size_scaled, emblem_size_scaled);
+ cairo_surface_set_device_scale (emblem_surface, scale_x, scale_y);
+
+ emblem_cr = cairo_create (emblem_surface);
+ gtk_render_background (context, emblem_cr,
+ 0, 0, emblem_size, emblem_size);
+
+ if (number > 99)
+ number = 99;
+ if (number < -99)
+ number = -99;
+
+ str = g_strdup_printf ("%d", number);
+ layout = gtk_widget_create_pango_layout (GTK_WIDGET (widget), str);
+ g_free (str);
+
+ pango_layout_get_pixel_size (layout, &layout_width, &layout_height);
+
+ /* scale the layout to be 0.5 of the size still available for drawing */
+ scale = (emblem_size * 0.50) / (MAX (layout_width, layout_height));
+ attr_list = pango_attr_list_new ();
+
+ attr = pango_attr_scale_new (scale);
+ pango_attr_list_insert (attr_list, attr);
+ pango_layout_set_attributes (layout, attr_list);
+
+ gtk_style_context_get (context, GTK_STATE_FLAG_NORMAL, "font", &desc, NULL);
+ pango_layout_set_font_description (layout, desc);
+ pango_font_description_free (desc);
+
+ gtk_style_context_get_color (context, 0, &color);
+ gdk_cairo_set_source_rgba (emblem_cr, &color);
+
+ /* update these values */
+ pango_layout_get_pixel_size (layout, &layout_width, &layout_height);
+
+ cairo_move_to (emblem_cr,
+ emblem_size / 2 - layout_width / 2,
+ emblem_size / 2 - layout_height / 2);
+
+ pango_cairo_show_layout (emblem_cr, layout);
+
+ g_object_unref (layout);
+ pango_attr_list_unref (attr_list);
+ cairo_destroy (emblem_cr);
+
+ cairo_set_source_surface (cr, emblem_surface,
+ width - emblem_size, height - emblem_size);
+ cairo_paint (cr);
+ cairo_destroy (cr);
+
+ cairo_surface_destroy (emblem_surface);
+ gtk_style_context_restore (context);
+
+ return surface;
+}
+
+/**
+ * gd_create_symbolic_icon_for_scale:
* @name:
+ * @base_size:
+ * @scale:
*
* Returns: (transfer full):
*/
GIcon *
-gd_create_symbolic_icon (const gchar *name,
- gint base_size)
+gd_create_symbolic_icon_for_scale (const gchar *name,
+ gint base_size,
+ gint scale)
{
gchar *symbolic_name;
GIcon *icon, *retval = NULL;
+ cairo_surface_t *icon_surface;
cairo_surface_t *surface;
cairo_t *cr;
GtkStyleContext *style;
@@ -50,12 +194,16 @@ gd_create_symbolic_icon (const gchar *name,
gint bg_size;
gint emblem_size;
gint total_size;
+ gint total_size_scaled;
total_size = base_size / 2;
+ total_size_scaled = total_size * scale;
+
bg_size = MAX (total_size / 2, _BG_MIN_SIZE);
emblem_size = MAX (bg_size - 8, _EMBLEM_MIN_SIZE);
- surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, total_size, total_size);
+ surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, total_size_scaled, total_size_scaled);
+ cairo_surface_set_device_scale (surface, (gdouble) scale, (gdouble) scale);
cr = cairo_create (surface);
style = gtk_style_context_new ();
@@ -74,8 +222,8 @@ gd_create_symbolic_icon (const gchar *name,
g_free (symbolic_name);
theme = gtk_icon_theme_get_default();
- info = gtk_icon_theme_lookup_by_gicon (theme, icon, emblem_size,
- GTK_ICON_LOOKUP_FORCE_SIZE);
+ info = gtk_icon_theme_lookup_by_gicon_for_scale (theme, icon, emblem_size, scale,
+ GTK_ICON_LOOKUP_FORCE_SIZE);
g_object_unref (icon);
if (info == NULL)
@@ -87,10 +235,13 @@ gd_create_symbolic_icon (const gchar *name,
if (pixbuf == NULL)
goto out;
- gtk_render_icon (style, cr, pixbuf, (total_size - emblem_size) / 2, (total_size - emblem_size) / 2);
+ icon_surface = gdk_cairo_surface_create_from_pixbuf (pixbuf, scale, NULL);
g_object_unref (pixbuf);
- retval = G_ICON (gdk_pixbuf_get_from_surface (surface, 0, 0, total_size, total_size));
+ gtk_render_icon_surface (style, cr, icon_surface, (total_size - emblem_size) / 2, (total_size -
emblem_size) / 2);
+ cairo_surface_destroy (icon_surface);
+
+ retval = G_ICON (gdk_pixbuf_get_from_surface (surface, 0, 0, total_size_scaled, total_size_scaled));
out:
g_object_unref (style);
@@ -101,7 +252,21 @@ gd_create_symbolic_icon (const gchar *name,
}
/**
- * gd_embed_image_in_frame:
+ * gd_create_symbolic_icon:
+ * @name:
+ * @base_size:
+ *
+ * Returns: (transfer full):
+ */
+GIcon *
+gd_create_symbolic_icon (const gchar *name,
+ gint base_size)
+{
+ return gd_create_symbolic_icon_for_scale (name, base_size, 1);
+}
+
+/**
+ * gd_embed_surface_in_frame:
* @source_image:
* @frame_image_url:
* @slice_width:
@@ -110,27 +275,25 @@ gd_create_symbolic_icon (const gchar *name,
* Returns: (transfer full):
*/
cairo_surface_t *
-gd_embed_image_in_frame (cairo_surface_t *source_image,
- const gchar *frame_image_url,
- GtkBorder *slice_width,
- GtkBorder *border_width)
+gd_embed_surface_in_frame (cairo_surface_t *source_image,
+ const gchar *frame_image_url,
+ GtkBorder *slice_width,
+ GtkBorder *border_width)
{
cairo_surface_t *surface;
cairo_t *cr;
int source_width, source_height;
- int dest_width, dest_height;
gchar *css_str;
GtkCssProvider *provider;
GtkStyleContext *context;
GError *error = NULL;
- GdkPixbuf *retval;
GtkWidgetPath *path;
+ gdouble scale_x, scale_y;
- source_width = cairo_image_surface_get_width (source_image);
- source_height = cairo_image_surface_get_height (source_image);
+ cairo_surface_get_device_scale (source_image, &scale_x, &scale_y);
- dest_width = source_width + border_width->left + border_width->right;
- dest_height = source_height + border_width->top + border_width->bottom;
+ source_width = cairo_image_surface_get_width (source_image) / (gint) floor (scale_x),
+ source_height = cairo_image_surface_get_height (source_image) / (gint) floor (scale_y);
css_str = g_strdup_printf (".embedded-image { border-image: url(\"%s\") %d %d %d %d / %dpx %dpx %dpx %dpx
}",
frame_image_url,
@@ -145,10 +308,12 @@ gd_embed_image_in_frame (cairo_surface_t *source_image,
g_error_free (error);
g_free (css_str);
- return cairo_surface_reference (source_image);
+ return g_object_ref (source_image);
}
- surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, dest_width, dest_height);
+ surface = cairo_surface_create_similar (source_image,
+ CAIRO_CONTENT_COLOR_ALPHA,
+ source_width, source_height);
cr = cairo_create (surface);
context = gtk_style_context_new ();
@@ -156,18 +321,28 @@ gd_embed_image_in_frame (cairo_surface_t *source_image,
gtk_widget_path_append_type (path, GTK_TYPE_ICON_VIEW);
gtk_style_context_set_path (context, path);
- gtk_style_context_add_provider (context, GTK_STYLE_PROVIDER (provider), 600);
-
+ gtk_style_context_add_provider (context,
+ GTK_STYLE_PROVIDER (provider),
+ GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+
+ cairo_save (cr);
+ cairo_rectangle (cr,
+ border_width->left,
+ border_width->top,
+ source_width - border_width->left - border_width->right,
+ source_height - border_width->top - border_width->bottom);
+ cairo_clip (cr);
gtk_render_icon_surface (context, cr,
source_image,
- border_width->left, border_width->top);
+ 0, 0);
+ cairo_restore (cr);
gtk_style_context_save (context);
gtk_style_context_add_class (context, "embedded-image");
gtk_render_frame (context, cr,
0, 0,
- dest_width, dest_height);
+ source_width, source_height);
gtk_style_context_restore (context);
cairo_destroy (cr);
@@ -179,3 +354,41 @@ gd_embed_image_in_frame (cairo_surface_t *source_image,
return surface;
}
+
+/**
+ * gd_embed_image_in_frame:
+ * @source_image:
+ * @frame_image_url:
+ * @slice_width:
+ * @border_width:
+ *
+ * Returns: (transfer full):
+ */
+GdkPixbuf *
+gd_embed_image_in_frame (GdkPixbuf *source_image,
+ const gchar *frame_image_url,
+ GtkBorder *slice_width,
+ GtkBorder *border_width)
+{
+ cairo_surface_t *surface, *embedded_surface;
+ GdkPixbuf *retval;
+
+ surface = gdk_cairo_surface_create_from_pixbuf (source_image,
+ 0, NULL);
+
+ /* Force the device scale to 1.0, since pixbufs are always in unscaled
+ * dimensions.
+ */
+ cairo_surface_set_device_scale (surface, 1.0, 1.0);
+ embedded_surface = gd_embed_surface_in_frame (surface, frame_image_url,
+ slice_width, border_width);
+ retval = gdk_pixbuf_get_from_surface (embedded_surface,
+ 0, 0,
+ cairo_image_surface_get_width (embedded_surface),
+ cairo_image_surface_get_height (embedded_surface));
+
+ cairo_surface_destroy (embedded_surface);
+ cairo_surface_destroy (surface);
+
+ return retval;
+}
diff --git a/cut-n-paste/libgd/gd-icon-utils.h b/cut-n-paste/libgd/gd-icon-utils.h
index 92abbe1..12f4f06 100644
--- a/cut-n-paste/libgd/gd-icon-utils.h
+++ b/cut-n-paste/libgd/gd-icon-utils.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2012 Red Hat, Inc.
+ * Copyright (c) 2011, 2012, 2015, 2016 Red Hat, Inc.
*
* Gnome Documents is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
@@ -22,14 +22,28 @@
#ifndef __GD_CREATE_SYMBOLIC_ICON_H__
#define __GD_CREATE_SYMBOLIC_ICON_H__
+#include <cairo.h>
#include <gtk/gtk.h>
+cairo_surface_t *gd_copy_image_surface (cairo_surface_t *surface);
+
+cairo_surface_t *gd_create_surface_with_counter (GtkWidget *widget,
+ cairo_surface_t *base,
+ gint number);
+
GIcon *gd_create_symbolic_icon (const gchar *name,
gint base_size);
+GIcon *gd_create_symbolic_icon_for_scale (const gchar *name,
+ gint base_size,
+ gint scale);
-cairo_surface_t *gd_embed_image_in_frame (cairo_surface_t *source_image,
- const gchar *frame_image_url,
- GtkBorder *slice_width,
- GtkBorder *border_width);
+GdkPixbuf *gd_embed_image_in_frame (GdkPixbuf *source_image,
+ const gchar *frame_image_url,
+ GtkBorder *slice_width,
+ GtkBorder *border_width);
+cairo_surface_t *gd_embed_surface_in_frame (cairo_surface_t *source_image,
+ const gchar *frame_image_url,
+ GtkBorder *slice_width,
+ GtkBorder *border_width);
#endif /* __GD_CREATE_SYMBOLIC_ICON_H__ */
diff --git a/cut-n-paste/libgd/gd-two-lines-renderer.c b/cut-n-paste/libgd/gd-two-lines-renderer.c
index aeb8a6f..5a029f7 100644
--- a/cut-n-paste/libgd/gd-two-lines-renderer.c
+++ b/cut-n-paste/libgd/gd-two-lines-renderer.c
@@ -22,6 +22,9 @@
#include "gd-two-lines-renderer.h"
#include <string.h>
+#define SUBTITLE_DIM_PERCENTAGE 0.55
+#define SUBTITLE_SIZE_PERCENTAGE 0.82
+
G_DEFINE_TYPE (GdTwoLinesRenderer, gd_two_lines_renderer, GTK_TYPE_CELL_RENDERER_TEXT)
struct _GdTwoLinesRendererPrivate {
@@ -79,6 +82,36 @@ create_layout_with_attrs (GtkWidget *widget,
}
static void
+apply_subtitle_style_to_layout (GtkStyleContext *context,
+ PangoLayout *layout,
+ GtkStateFlags flags)
+{
+ PangoFontDescription *desc;
+ PangoAttrList *layout_attr;
+ PangoAttribute *attr_alpha;
+
+ gtk_style_context_save (context);
+ gtk_style_context_set_state (context, flags);
+ gtk_style_context_get (context, gtk_style_context_get_state (context),
+ "font", &desc,
+ NULL);
+ gtk_style_context_restore (context);
+
+ /* Set the font size */
+ pango_font_description_set_size (desc, pango_font_description_get_size (desc) * SUBTITLE_SIZE_PERCENTAGE);
+ pango_layout_set_font_description (layout, desc);
+ pango_font_description_free (desc);
+
+ /* Set the font alpha */
+ layout_attr = pango_attr_list_new ();
+ attr_alpha = pango_attr_foreground_alpha_new (SUBTITLE_DIM_PERCENTAGE * 65535);
+ pango_attr_list_insert (layout_attr, attr_alpha);
+
+ pango_layout_set_attributes (layout, layout_attr);
+ pango_attr_list_unref (layout_attr);
+}
+
+static void
gd_two_lines_renderer_prepare_layouts (GdTwoLinesRenderer *self,
const GdkRectangle *cell_area,
GtkWidget *widget,
@@ -106,9 +139,16 @@ gd_two_lines_renderer_prepare_layouts (GdTwoLinesRenderer *self,
}
else
{
+ GtkStyleContext *context;
+
line_two = create_layout_with_attrs (widget, cell_area,
self, PANGO_ELLIPSIZE_END);
+ context = gtk_widget_get_style_context (widget);
+ gtk_style_context_save (context);
+ apply_subtitle_style_to_layout (context, line_two, GTK_STATE_FLAG_NORMAL);
+ gtk_style_context_restore (context);
+
pango_layout_set_height (line_one, - (self->priv->text_lines - 1));
pango_layout_set_height (line_two, -1);
pango_layout_set_text (line_two, self->priv->line_two, -1);
@@ -278,7 +318,8 @@ gd_two_lines_renderer_render (GtkCellRenderer *cell,
NULL, &line_one_height);
gtk_style_context_save (context);
- gtk_style_context_add_class (context, "dim-label");
+
+ apply_subtitle_style_to_layout (context, layout_two, flags);
state = gtk_cell_renderer_get_state (cell, widget, flags);
gtk_style_context_set_state (context, state);
@@ -329,11 +370,12 @@ gd_two_lines_renderer_get_preferred_width (GtkCellRenderer *cell,
NULL,
NULL, NULL, NULL);
- /* Fetch the average size of a charachter */
+ /* Fetch the average size of a character */
context = gtk_widget_get_pango_context (widget);
gtk_style_context_save (style_context);
gtk_style_context_set_state (style_context, 0);
- gtk_style_context_get (style_context, 0, "font", &font_desc, NULL);
+ gtk_style_context_get (style_context, gtk_style_context_get_state (style_context),
+ "font", &font_desc, NULL);
gtk_style_context_restore (style_context);
metrics = pango_context_get_metrics (context, font_desc,
pango_context_get_language (context));
diff --git a/shell/ev-recent-view.c b/shell/ev-recent-view.c
index b194acc..953fee8 100644
--- a/shell/ev-recent-view.c
+++ b/shell/ev-recent-view.c
@@ -307,9 +307,9 @@ add_thumbnail_to_model (GetDocumentInfoAsyncData *data,
border.top = 3;
border.bottom = 6;
- surface = gd_embed_image_in_frame (thumbnail,
- "resource:///org/gnome/evince/shell/ui/thumbnail-frame.png",
- &border, &border);
+ surface = gd_embed_surface_in_frame (thumbnail,
+ "resource:///org/gnome/evince/shell/ui/thumbnail-frame.png",
+ &border, &border);
path = gtk_tree_row_reference_get_path (data->row);
if (path != NULL) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]