1 /* 2 * Copyright © 2011 Red Hat Inc. 3 * 4 * This library is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation; either 7 * version 2.1 of the License, or (at your option) any later version. 8 * 9 * This library is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Lesser General Public License for more details. 13 * 14 * You should have received a copy of the GNU Lesser General Public 15 * License along with this library. If not, see <http://www.gnu.org/licenses/>. 16 * 17 * Authors: Benjamin Otte <otte@gnome.org> 18 */ 19 20 #ifndef __GTK_CSS_IMAGE_PRIVATE_H__ 21 #define __GTK_CSS_IMAGE_PRIVATE_H__ 22 23 #include <cairo.h> 24 #include <glib-object.h> 25 26 #include <gtk/css/gtkcss.h> 27 #include "gtk/css/gtkcsstokenizerprivate.h" 28 #include "gtk/css/gtkcssparserprivate.h" 29 #include "gtk/gtkcsstypesprivate.h" 30 #include "gtk/gtksnapshot.h" 31 #include "gtk/gtkstyleprovider.h" 32 33 G_BEGIN_DECLS 34 35 #define GTK_TYPE_CSS_IMAGE (_gtk_css_image_get_type ()) 36 #define GTK_CSS_IMAGE(obj) (G_TYPE_CHECK_INSTANCE_CAST (obj, GTK_TYPE_CSS_IMAGE, GtkCssImage)) 37 #define GTK_CSS_IMAGE_CLASS(cls) (G_TYPE_CHECK_CLASS_CAST (cls, GTK_TYPE_CSS_IMAGE, GtkCssImageClass)) 38 #define GTK_IS_CSS_IMAGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE (obj, GTK_TYPE_CSS_IMAGE)) 39 #define GTK_IS_CSS_IMAGE_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE (obj, GTK_TYPE_CSS_IMAGE)) 40 #define GTK_CSS_IMAGE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_CSS_IMAGE, GtkCssImageClass)) 41 42 typedef struct _GtkCssImage GtkCssImage; 43 typedef struct _GtkCssImageClass GtkCssImageClass; 44 45 struct _GtkCssImage 46 { 47 GObject parent; 48 }; 49 50 struct _GtkCssImageClass 51 { 52 GObjectClass parent_class; 53 54 /* width of image or 0 if it has no width (optional) */ 55 int (* get_width) (GtkCssImage *image); 56 /* height of image or 0 if it has no height (optional) */ 57 int (* get_height) (GtkCssImage *image); 58 /* aspect ratio (width / height) of image or 0 if it has no aspect ratio (optional) */ 59 double (* get_aspect_ratio) (GtkCssImage *image); 60 61 /* create "computed value" in CSS terms, returns a new reference */ 62 GtkCssImage *(* compute) (GtkCssImage *image, 63 guint property_id, 64 GtkStyleProvider *provider, 65 GtkCssStyle *style, 66 GtkCssStyle *parent_style); 67 /* compare two images for equality */ 68 gboolean (* equal) (GtkCssImage *image1, 69 GtkCssImage *image2); 70 /* transition between start and end image (end may be NULL), returns new reference (optional) */ 71 GtkCssImage *(* transition) (GtkCssImage *start, 72 GtkCssImage *end, 73 guint property_id, 74 double progress); 75 76 /* draw to 0,0 with the given width and height */ 77 void (* snapshot) (GtkCssImage *image, 78 GtkSnapshot *snapshot, 79 double width, 80 double height); 81 /* is this image to be considered invalid (see https://drafts.csswg.org/css-images-4/#invalid-image for details) */ 82 gboolean (* is_invalid) (GtkCssImage *image); 83 /* does this image change based on timestamp? (optional) */ 84 gboolean (* is_dynamic) (GtkCssImage *image); 85 /* get image for given timestamp or @image when not dynamic (optional) */ 86 GtkCssImage *(* get_dynamic_image) (GtkCssImage *image, 87 gint64 monotonic_time); 88 /* parse CSS, return TRUE on success */ 89 gboolean (* parse) (GtkCssImage *image, 90 GtkCssParser *parser); 91 /* print to CSS */ 92 void (* print) (GtkCssImage *image, 93 GString *string); 94 gboolean (* is_computed) (GtkCssImage *image); 95 }; 96 97 GType _gtk_css_image_get_type (void) G_GNUC_CONST; 98 99 gboolean _gtk_css_image_can_parse (GtkCssParser *parser); 100 GtkCssImage * _gtk_css_image_new_parse (GtkCssParser *parser); 101 102 int _gtk_css_image_get_width (GtkCssImage *image) G_GNUC_PURE; 103 int _gtk_css_image_get_height (GtkCssImage *image) G_GNUC_PURE; 104 double _gtk_css_image_get_aspect_ratio (GtkCssImage *image) G_GNUC_PURE; 105 106 GtkCssImage * _gtk_css_image_compute (GtkCssImage *image, 107 guint property_id, 108 GtkStyleProvider *provider, 109 GtkCssStyle *style, 110 GtkCssStyle *parent_style); 111 gboolean _gtk_css_image_equal (GtkCssImage *image1, 112 GtkCssImage *image2) G_GNUC_PURE; 113 GtkCssImage * _gtk_css_image_transition (GtkCssImage *start, 114 GtkCssImage *end, 115 guint property_id, 116 double progress); 117 118 void _gtk_css_image_draw (GtkCssImage *image, 119 cairo_t *cr, 120 double width, 121 double height); 122 void gtk_css_image_snapshot (GtkCssImage *image, 123 GtkSnapshot *snapshot, 124 double width, 125 double height); 126 gboolean gtk_css_image_is_invalid (GtkCssImage *image) G_GNUC_PURE; 127 gboolean gtk_css_image_is_dynamic (GtkCssImage *image) G_GNUC_PURE; 128 GtkCssImage * gtk_css_image_get_dynamic_image (GtkCssImage *image, 129 gint64 monotonic_time); 130 void _gtk_css_image_print (GtkCssImage *image, 131 GString *string); 132 char * gtk_css_image_to_string (GtkCssImage *image); 133 134 void _gtk_css_image_get_concrete_size (GtkCssImage *image, 135 double specified_width, 136 double specified_height, 137 double default_width, 138 double default_height, 139 double *concrete_width, 140 double *concrete_height); 141 cairo_surface_t * 142 _gtk_css_image_get_surface (GtkCssImage *image, 143 cairo_surface_t *target, 144 int surface_width, 145 int surface_height); 146 gboolean gtk_css_image_is_computed (GtkCssImage *image) G_GNUC_PURE; 147 148 149 G_END_DECLS 150 151 #endif /* __GTK_CSS_IMAGE_PRIVATE_H__ */ 152