* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors: Benjamin Otte <otte@gnome.org>
*/
#include "gtkcssimageprivate.h"
+#include "gtkcsscomputedvaluesprivate.h"
+
/* for the types only */
+#include "gtk/gtkcssimagecrossfadeprivate.h"
#include "gtk/gtkcssimagegradientprivate.h"
#include "gtk/gtkcssimagelinearprivate.h"
#include "gtk/gtkcssimageurlprivate.h"
}
static GtkCssImage *
-gtk_css_image_real_compute (GtkCssImage *image,
- GtkStyleContext *context)
+gtk_css_image_real_compute (GtkCssImage *image,
+ guint property_id,
+ GtkStyleProviderPrivate *provider,
+ GtkCssComputedValues *values,
+ GtkCssComputedValues *parent_values,
+ GtkCssDependencies *dependencies)
{
return g_object_ref (image);
}
+static gboolean
+gtk_css_image_real_equal (GtkCssImage *image1,
+ GtkCssImage *image2)
+{
+ return FALSE;
+}
+
+static GtkCssImage *
+gtk_css_image_real_transition (GtkCssImage *start,
+ GtkCssImage *end,
+ guint property_id,
+ double progress)
+{
+ if (progress <= 0.0)
+ return g_object_ref (start);
+ else if (progress >= 1.0)
+ return end ? g_object_ref (end) : NULL;
+ else
+ return _gtk_css_image_cross_fade_new (start, end, progress);
+}
+
static void
_gtk_css_image_class_init (GtkCssImageClass *klass)
{
klass->get_height = gtk_css_image_real_get_height;
klass->get_aspect_ratio = gtk_css_image_real_get_aspect_ratio;
klass->compute = gtk_css_image_real_compute;
+ klass->equal = gtk_css_image_real_equal;
+ klass->transition = gtk_css_image_real_transition;
}
static void
}
GtkCssImage *
-_gtk_css_image_compute (GtkCssImage *image,
- GtkStyleContext *context)
+_gtk_css_image_compute (GtkCssImage *image,
+ guint property_id,
+ GtkStyleProviderPrivate *provider,
+ GtkCssComputedValues *values,
+ GtkCssComputedValues *parent_values,
+ GtkCssDependencies *dependencies)
{
+ GtkCssDependencies unused;
GtkCssImageClass *klass;
g_return_val_if_fail (GTK_IS_CSS_IMAGE (image), NULL);
- g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), NULL);
+ g_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), NULL);
+ g_return_val_if_fail (parent_values == NULL || GTK_IS_CSS_COMPUTED_VALUES (parent_values), NULL);
+
+ if (dependencies == NULL)
+ dependencies = &unused;
+ *dependencies = 0;
klass = GTK_CSS_IMAGE_GET_CLASS (image);
- return klass->compute (image, context);
+ return klass->compute (image, property_id, provider, values, parent_values, dependencies);
+}
+
+GtkCssImage *
+_gtk_css_image_transition (GtkCssImage *start,
+ GtkCssImage *end,
+ guint property_id,
+ double progress)
+{
+ GtkCssImageClass *klass;
+
+ g_return_val_if_fail (start == NULL || GTK_IS_CSS_IMAGE (start), NULL);
+ g_return_val_if_fail (end == NULL || GTK_IS_CSS_IMAGE (end), NULL);
+
+ progress = CLAMP (progress, 0.0, 1.0);
+
+ if (start == NULL)
+ {
+ if (end == NULL)
+ return NULL;
+ else
+ {
+ start = end;
+ end = NULL;
+ progress = 1.0 - progress;
+ }
+ }
+
+ klass = GTK_CSS_IMAGE_GET_CLASS (start);
+
+ return klass->transition (start, end, property_id, progress);
+}
+
+gboolean
+_gtk_css_image_equal (GtkCssImage *image1,
+ GtkCssImage *image2)
+{
+ GtkCssImageClass *klass;
+
+ g_return_val_if_fail (image1 == NULL || GTK_IS_CSS_IMAGE (image1), FALSE);
+ g_return_val_if_fail (image2 == NULL || GTK_IS_CSS_IMAGE (image2), FALSE);
+
+ if (image1 == image2)
+ return TRUE;
+
+ if (image1 == NULL || image2 == NULL)
+ return FALSE;
+
+ if (G_OBJECT_TYPE (image1) != G_OBJECT_TYPE (image2))
+ return FALSE;
+
+ klass = GTK_CSS_IMAGE_GET_CLASS (image1);
+
+ return klass->equal (image1, image2);
}
void
g_return_if_fail (GTK_IS_CSS_IMAGE (image));
g_return_if_fail (cr != NULL);
+ g_return_if_fail (width > 0);
+ g_return_if_fail (height > 0);
cairo_save (cr);
return result;
}
-GType
+static GType
gtk_css_image_get_parser_type (GtkCssParser *parser)
{
static const struct {
{ "-gtk-gradient", _gtk_css_image_gradient_get_type },
{ "-gtk-win32-theme-part", _gtk_css_image_win32_get_type },
{ "linear-gradient", _gtk_css_image_linear_get_type },
- { "repeating-linear-gradient", _gtk_css_image_linear_get_type }
+ { "repeating-linear-gradient", _gtk_css_image_linear_get_type },
+ { "cross-fade", _gtk_css_image_cross_fade_get_type }
};
guint i;
}
GtkCssImage *
-_gtk_css_image_new_parse (GtkCssParser *parser,
- GFile *base)
+_gtk_css_image_new_parse (GtkCssParser *parser)
{
GtkCssImageClass *klass;
GtkCssImage *image;
GType image_type;
g_return_val_if_fail (parser != NULL, NULL);
- g_return_val_if_fail (G_IS_FILE (base), NULL);
image_type = gtk_css_image_get_parser_type (parser);
if (image_type == G_TYPE_INVALID)
image = g_object_new (image_type, NULL);
klass = GTK_CSS_IMAGE_GET_CLASS (image);
- if (!klass->parse (image, parser, base))
+ if (!klass->parse (image, parser))
{
g_object_unref (image);
return NULL;