]> Pileus Git - ~andy/gtk/blob - gtk/gtkcssimage.c
cssimage: Add GtkCssImageGradient
[~andy/gtk] / gtk / gtkcssimage.c
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, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17  *
18  * Authors: Benjamin Otte <otte@gnome.org>
19  */
20
21 #include "config.h"
22
23 #include "gtkcssimageprivate.h"
24
25 /* for the types only */
26 #include "gtk/gtkcssimagegradientprivate.h"
27 #include "gtk/gtkcssimageurlprivate.h"
28
29 G_DEFINE_ABSTRACT_TYPE (GtkCssImage, _gtk_css_image, G_TYPE_OBJECT)
30
31 static int
32 gtk_css_image_real_get_width (GtkCssImage *image)
33 {
34   return 0;
35 }
36
37 static int
38 gtk_css_image_real_get_height (GtkCssImage *image)
39 {
40   return 0;
41 }
42
43 static double
44 gtk_css_image_real_get_aspect_ratio (GtkCssImage *image)
45 {
46   int width, height;
47
48   width = _gtk_css_image_get_width (image);
49   height = _gtk_css_image_get_height (image);
50
51   if (width && height)
52     return (double) width / height;
53   else
54     return 0;
55 }
56
57 static GtkCssImage *
58 gtk_css_image_real_compute (GtkCssImage     *image,
59                             GtkStyleContext *context)
60 {
61   return g_object_ref (image);
62 }
63
64 static void
65 _gtk_css_image_class_init (GtkCssImageClass *klass)
66 {
67   klass->get_width = gtk_css_image_real_get_width;
68   klass->get_height = gtk_css_image_real_get_height;
69   klass->get_aspect_ratio = gtk_css_image_real_get_aspect_ratio;
70   klass->compute = gtk_css_image_real_compute;
71 }
72
73 static void
74 _gtk_css_image_init (GtkCssImage *image)
75 {
76 }
77
78 int
79 _gtk_css_image_get_width (GtkCssImage *image)
80 {
81   GtkCssImageClass *klass;
82
83   g_return_val_if_fail (GTK_IS_CSS_IMAGE (image), 0);
84
85   klass = GTK_CSS_IMAGE_GET_CLASS (image);
86
87   return klass->get_width (image);
88 }
89
90 int
91 _gtk_css_image_get_height (GtkCssImage *image)
92 {
93   GtkCssImageClass *klass;
94
95   g_return_val_if_fail (GTK_IS_CSS_IMAGE (image), 0);
96
97   klass = GTK_CSS_IMAGE_GET_CLASS (image);
98
99   return klass->get_height (image);
100 }
101
102 double
103 _gtk_css_image_get_aspect_ratio (GtkCssImage *image)
104 {
105   GtkCssImageClass *klass;
106
107   g_return_val_if_fail (GTK_IS_CSS_IMAGE (image), 0);
108
109   klass = GTK_CSS_IMAGE_GET_CLASS (image);
110
111   return klass->get_aspect_ratio (image);
112 }
113
114 GtkCssImage *
115 _gtk_css_image_compute (GtkCssImage     *image,
116                         GtkStyleContext *context)
117 {
118   GtkCssImageClass *klass;
119
120   g_return_val_if_fail (GTK_IS_CSS_IMAGE (image), NULL);
121   g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), NULL);
122
123   klass = GTK_CSS_IMAGE_GET_CLASS (image);
124
125   return klass->compute (image, context);
126 }
127
128 void
129 _gtk_css_image_draw (GtkCssImage        *image,
130                      cairo_t            *cr,
131                      double              width,
132                      double              height)
133 {
134   GtkCssImageClass *klass;
135
136   g_return_if_fail (GTK_IS_CSS_IMAGE (image));
137   g_return_if_fail (cr != NULL);
138
139   cairo_save (cr);
140
141   klass = GTK_CSS_IMAGE_GET_CLASS (image);
142
143   klass->draw (image, cr, width, height);
144
145   cairo_restore (cr);
146 }
147
148 void
149 _gtk_css_image_print (GtkCssImage *image,
150                       GString     *string)
151 {
152   GtkCssImageClass *klass;
153
154   g_return_if_fail (GTK_IS_CSS_IMAGE (image));
155   g_return_if_fail (string != NULL);
156
157   klass = GTK_CSS_IMAGE_GET_CLASS (image);
158
159   klass->print (image, string);
160 }
161
162 GtkCssImage *
163 _gtk_css_image_new_parse (GtkCssParser *parser,
164                           GFile        *base)
165 {
166   static const struct {
167     const char *prefix;
168     GType (* type_func) (void);
169   } image_types[] = {
170     { "url", _gtk_css_image_url_get_type },
171     { "-gtk-gradient", _gtk_css_image_gradient_get_type }
172   };
173   guint i;
174
175   g_return_val_if_fail (parser != NULL, NULL);
176   g_return_val_if_fail (G_IS_FILE (base), NULL);
177
178   for (i = 0; i < G_N_ELEMENTS (image_types); i++)
179     {
180       if (_gtk_css_parser_has_prefix (parser, image_types[i].prefix))
181         {
182           GtkCssImage *image;
183           GtkCssImageClass *klass;
184
185           image = g_object_new (image_types[i].type_func (), NULL);
186
187           klass = GTK_CSS_IMAGE_GET_CLASS (image);
188           if (!klass->parse (image, parser, base))
189             {
190               g_object_unref (image);
191               return NULL;
192             }
193
194           return image;
195         }
196     }
197
198   _gtk_css_parser_error (parser, "Not a valid image");
199   return NULL;
200 }
201