Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/shell/ev-transition-animation.c
diff options
context:
space:
mode:
Diffstat (limited to 'shell/ev-transition-animation.c')
-rw-r--r--shell/ev-transition-animation.c682
1 files changed, 0 insertions, 682 deletions
diff --git a/shell/ev-transition-animation.c b/shell/ev-transition-animation.c
deleted file mode 100644
index 148b4c7..0000000
--- a/shell/ev-transition-animation.c
+++ /dev/null
@@ -1,682 +0,0 @@
-/* ev-transition-animation.c
- * this file is part of evince, a gnome document viewer
- *
- * Copyright (C) 2007 Carlos Garnacho <carlos@imendio.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <cairo.h>
-#include <gdk/gdk.h>
-#include "ev-transition-animation.h"
-#include "ev-timeline.h"
-
-#define EV_TRANSITION_ANIMATION_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EV_TYPE_TRANSITION_ANIMATION, EvTransitionAnimationPriv))
-#define N_BLINDS 6
-
-typedef struct EvTransitionAnimationPriv EvTransitionAnimationPriv;
-
-struct EvTransitionAnimationPriv {
- EvTransitionEffect *effect;
- cairo_surface_t *origin_surface;
- cairo_surface_t *dest_surface;
-};
-
-enum {
- PROP_0,
- PROP_EFFECT,
- PROP_ORIGIN_SURFACE,
- PROP_DEST_SURFACE
-};
-
-
-G_DEFINE_TYPE (EvTransitionAnimation, ev_transition_animation, EV_TYPE_TIMELINE)
-
-
-static void
-ev_transition_animation_init (EvTransitionAnimation *animation)
-{
-}
-
-static void
-ev_transition_animation_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- EvTransitionAnimationPriv *priv;
-
- priv = EV_TRANSITION_ANIMATION_GET_PRIVATE (object);
-
- switch (prop_id) {
- case PROP_EFFECT:
- if (priv->effect)
- g_object_unref (priv->effect);
-
- priv->effect = g_value_dup_object (value);
- break;
- case PROP_ORIGIN_SURFACE:
- ev_transition_animation_set_origin_surface (EV_TRANSITION_ANIMATION (object),
- g_value_get_pointer (value));
- break;
- case PROP_DEST_SURFACE:
- ev_transition_animation_set_dest_surface (EV_TRANSITION_ANIMATION (object),
- g_value_get_pointer (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- }
-}
-
-static void
-ev_transition_animation_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- EvTransitionAnimationPriv *priv;
-
- priv = EV_TRANSITION_ANIMATION_GET_PRIVATE (object);
-
- switch (prop_id) {
- case PROP_EFFECT:
- g_value_set_object (value, priv->effect);
- break;
- case PROP_ORIGIN_SURFACE:
- g_value_set_pointer (value, priv->origin_surface);
- break;
- case PROP_DEST_SURFACE:
- g_value_set_pointer (value, priv->dest_surface);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- }
-}
-
-static void
-ev_transition_animation_finalize (GObject *object)
-{
- EvTransitionAnimationPriv *priv;
-
- priv = EV_TRANSITION_ANIMATION_GET_PRIVATE (object);
-
- if (priv->effect)
- g_object_unref (priv->effect);
-
- if (priv->origin_surface)
- cairo_surface_destroy (priv->origin_surface);
-
- if (priv->dest_surface)
- cairo_surface_destroy (priv->dest_surface);
-
- G_OBJECT_CLASS (ev_transition_animation_parent_class)->finalize (object);
-}
-
-static GObject *
-ev_transition_animation_constructor (GType type,
- guint n_construct_properties,
- GObjectConstructParam *construct_params)
-{
- GObject *object;
- EvTransitionAnimationPriv *priv;
- EvTransitionEffect *effect;
- gint duration;
-
- object = G_OBJECT_CLASS (ev_transition_animation_parent_class)->constructor (type,
- n_construct_properties,
- construct_params);
-
- priv = EV_TRANSITION_ANIMATION_GET_PRIVATE (object);
- effect = priv->effect;
-
- g_object_get (effect, "duration", &duration, NULL);
- ev_timeline_set_duration (EV_TIMELINE (object), duration * 1000);
-
- return object;
-}
-
-static void
-ev_transition_animation_class_init (EvTransitionAnimationClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
- object_class->set_property = ev_transition_animation_set_property;
- object_class->get_property = ev_transition_animation_get_property;
- object_class->finalize = ev_transition_animation_finalize;
- object_class->constructor = ev_transition_animation_constructor;
-
- g_object_class_install_property (object_class,
- PROP_EFFECT,
- g_param_spec_object ("effect",
- "Effect",
- "Transition effect description",
- EV_TYPE_TRANSITION_EFFECT,
- G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE));
- g_object_class_install_property (object_class,
- PROP_ORIGIN_SURFACE,
- g_param_spec_pointer ("origin-surface",
- "Origin surface",
- "Cairo surface from which the animation will happen",
- G_PARAM_READWRITE));
- g_object_class_install_property (object_class,
- PROP_DEST_SURFACE,
- g_param_spec_pointer ("dest-surface",
- "Destination surface",
- "Cairo surface to which the animation will happen",
- G_PARAM_READWRITE));
-
- g_type_class_add_private (klass, sizeof (EvTransitionAnimationPriv));
-}
-
-static void
-paint_surface (cairo_t *cr,
- cairo_surface_t *surface,
- gdouble x_offset,
- gdouble y_offset,
- gdouble alpha,
- GdkRectangle page_area)
-{
- gint width, height;
-
- gdk_cairo_rectangle (cr, &page_area);
- cairo_clip (cr);
-
- width = cairo_image_surface_get_width (surface);
- height = cairo_image_surface_get_height (surface);
-
- cairo_save (cr);
-
- if (width != page_area.width || height != page_area.height) {
- cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_FAST);
- cairo_scale (cr,
- (gdouble) page_area.width / width,
- (gdouble) page_area.height / height);
- }
-
- cairo_surface_set_device_offset (surface, x_offset, y_offset);
- cairo_set_source_surface (cr, surface, 0, 0);
-
- if (alpha == 0.)
- cairo_paint (cr);
- else
- cairo_paint_with_alpha (cr, alpha);
-
- cairo_restore (cr);
-}
-
-/* animations */
-static void
-ev_transition_animation_split (cairo_t *cr,
- EvTransitionAnimation *animation,
- EvTransitionEffect *effect,
- gdouble progress,
- GdkRectangle page_area)
-{
- EvTransitionAnimationPriv *priv;
- EvTransitionEffectAlignment alignment;
- EvTransitionEffectDirection direction;
- gint width, height;
-
- priv = EV_TRANSITION_ANIMATION_GET_PRIVATE (animation);
- width = page_area.width;
- height = page_area.height;
-
- g_object_get (effect,
- "alignment", &alignment,
- "direction", &direction,
- NULL);
-
- if (direction == EV_TRANSITION_DIRECTION_INWARD) {
- paint_surface (cr, priv->dest_surface, 0, 0, 0, page_area);
-
- if (alignment == EV_TRANSITION_ALIGNMENT_HORIZONTAL) {
- cairo_rectangle (cr,
- 0,
- height * progress / 2,
- width,
- height * (1 - progress));
- } else {
- cairo_rectangle (cr,
- width * progress / 2,
- 0,
- width * (1 - progress),
- height);
- }
-
- cairo_clip (cr);
-
- paint_surface (cr, priv->origin_surface, 0, 0, 0, page_area);
- } else {
- paint_surface (cr, priv->origin_surface, 0, 0, 0, page_area);
-
- if (alignment == EV_TRANSITION_ALIGNMENT_HORIZONTAL) {
- cairo_rectangle (cr,
- 0,
- (height / 2) - (height * progress / 2),
- width,
- height * progress);
- } else {
- cairo_rectangle (cr,
- (width / 2) - (width * progress / 2),
- 0,
- width * progress,
- height);
- }
-
- cairo_clip (cr);
-
- paint_surface (cr, priv->dest_surface, 0, 0, 0, page_area);
- }
-}
-
-static void
-ev_transition_animation_blinds (cairo_t *cr,
- EvTransitionAnimation *animation,
- EvTransitionEffect *effect,
- gdouble progress,
- GdkRectangle page_area)
-{
- EvTransitionAnimationPriv *priv;
- EvTransitionEffectAlignment alignment;
- gint width, height, i;
-
- priv = EV_TRANSITION_ANIMATION_GET_PRIVATE (animation);
- width = page_area.width;
- height = page_area.height;
-
- g_object_get (effect,
- "alignment", &alignment,
- NULL);
-
- paint_surface (cr, priv->origin_surface, 0, 0, 0, page_area);
-
- for (i = 0; i < N_BLINDS; i++) {
- cairo_save (cr);
-
- if (alignment == EV_TRANSITION_ALIGNMENT_HORIZONTAL) {
- cairo_rectangle (cr,
- 0,
- height / N_BLINDS * i,
- width,
- height / N_BLINDS * progress);
- } else {
- cairo_rectangle (cr,
- width / N_BLINDS * i,
- 0,
- width / N_BLINDS * progress,
- height);
- }
-
- cairo_clip (cr);
- paint_surface (cr, priv->dest_surface, 0, 0, 0, page_area);
- cairo_restore (cr);
- }
-}
-
-static void
-ev_transition_animation_box (cairo_t *cr,
- EvTransitionAnimation *animation,
- EvTransitionEffect *effect,
- gdouble progress,
- GdkRectangle page_area)
-{
- EvTransitionAnimationPriv *priv;
- EvTransitionEffectDirection direction;
- gint width, height;
-
- priv = EV_TRANSITION_ANIMATION_GET_PRIVATE (animation);
- width = page_area.width;
- height = page_area.height;
-
- g_object_get (effect,
- "direction", &direction,
- NULL);
-
- if (direction == EV_TRANSITION_DIRECTION_INWARD) {
- paint_surface (cr, priv->dest_surface, 0, 0, 0, page_area);
-
- cairo_rectangle (cr,
- width * progress / 2,
- height * progress / 2,
- width * (1 - progress),
- height * (1 - progress));
- cairo_clip (cr);
-
- paint_surface (cr, priv->origin_surface, 0, 0, 0, page_area);
- } else {
- paint_surface (cr, priv->origin_surface, 0, 0, 0, page_area);
-
- cairo_rectangle (cr,
- (width / 2) - (width * progress / 2),
- (height / 2) - (height * progress / 2),
- width * progress,
- height * progress);
- cairo_clip (cr);
-
- paint_surface (cr, priv->dest_surface, 0, 0, 0, page_area);
- }
-}
-
-static void
-ev_transition_animation_wipe (cairo_t *cr,
- EvTransitionAnimation *animation,
- EvTransitionEffect *effect,
- gdouble progress,
- GdkRectangle page_area)
-{
- EvTransitionAnimationPriv *priv;
- gint width, height;
- gint angle;
-
- priv = EV_TRANSITION_ANIMATION_GET_PRIVATE (animation);
- width = page_area.width;
- height = page_area.height;
-
- g_object_get (effect,
- "angle", &angle,
- NULL);
-
- paint_surface (cr, priv->origin_surface, 0, 0, 0, page_area);
-
- if (angle == 0) {
- /* left to right */
- cairo_rectangle (cr,
- 0, 0,
- width * progress,
- height);
- } else if (angle <= 90) {
- /* bottom to top */
- cairo_rectangle (cr,
- 0,
- height * (1 - progress),
- width,
- height * progress);
- } else if (angle <= 180) {
- /* right to left */
- cairo_rectangle (cr,
- width * (1 - progress),
- 0,
- width * progress,
- height);
- } else if (angle <= 270) {
- /* top to bottom */
- cairo_rectangle (cr,
- 0, 0,
- width,
- height * progress);
- }
-
- cairo_clip (cr);
-
- paint_surface (cr, priv->dest_surface, 0, 0, 0, page_area);
-}
-
-static void
-ev_transition_animation_dissolve (cairo_t *cr,
- EvTransitionAnimation *animation,
- EvTransitionEffect *effect,
- gdouble progress,
- GdkRectangle page_area)
-{
- EvTransitionAnimationPriv *priv;
-
- priv = EV_TRANSITION_ANIMATION_GET_PRIVATE (animation);
-
- paint_surface (cr, priv->dest_surface, 0, 0, 0, page_area);
- paint_surface (cr, priv->origin_surface, 0, 0, 1 - progress, page_area);
-}
-
-static void
-ev_transition_animation_push (cairo_t *cr,
- EvTransitionAnimation *animation,
- EvTransitionEffect *effect,
- gdouble progress,
- GdkRectangle page_area)
-{
- EvTransitionAnimationPriv *priv;
- gint width, height;
- gint angle;
-
- priv = EV_TRANSITION_ANIMATION_GET_PRIVATE (animation);
- width = page_area.width;
- height = page_area.height;
-
- g_object_get (effect,
- "angle", &angle,
- NULL);
-
- if (angle == 0) {
- /* left to right */
- paint_surface (cr, priv->origin_surface, - (width * progress), 0, 0, page_area);
- paint_surface (cr, priv->dest_surface, width * (1 - progress), 0, 0, page_area);
- } else {
- /* top to bottom */
- paint_surface (cr, priv->origin_surface, 0, - (height * progress), 0, page_area);
- paint_surface (cr, priv->dest_surface, 0, height * (1 - progress), 0, page_area);
- }
-}
-
-static void
-ev_transition_animation_cover (cairo_t *cr,
- EvTransitionAnimation *animation,
- EvTransitionEffect *effect,
- gdouble progress,
- GdkRectangle page_area)
-{
- EvTransitionAnimationPriv *priv;
- gint width, height;
- gint angle;
-
- priv = EV_TRANSITION_ANIMATION_GET_PRIVATE (animation);
- width = page_area.width;
- height = page_area.height;
-
- g_object_get (effect,
- "angle", &angle,
- NULL);
-
- paint_surface (cr, priv->origin_surface, 0, 0, 0, page_area);
-
- if (angle == 0) {
- /* left to right */
- paint_surface (cr, priv->dest_surface, width * (1 - progress), 0, 0, page_area);
- } else {
- /* top to bottom */
- paint_surface (cr, priv->dest_surface, 0, height * (1 - progress), 0, page_area);
- }
-}
-
-static void
-ev_transition_animation_uncover (cairo_t *cr,
- EvTransitionAnimation *animation,
- EvTransitionEffect *effect,
- gdouble progress,
- GdkRectangle page_area)
-{
- EvTransitionAnimationPriv *priv;
- gint width, height;
- gint angle;
-
- priv = EV_TRANSITION_ANIMATION_GET_PRIVATE (animation);
- width = page_area.width;
- height = page_area.height;
-
- g_object_get (effect,
- "angle", &angle,
- NULL);
-
- paint_surface (cr, priv->dest_surface, 0, 0, 0, page_area);
-
- if (angle == 0) {
- /* left to right */
- paint_surface (cr, priv->origin_surface, - (width * progress), 0, 0, page_area);
- } else {
- /* top to bottom */
- paint_surface (cr, priv->origin_surface, 0, - (height * progress), 0, page_area);
- }
-}
-
-static void
-ev_transition_animation_fade (cairo_t *cr,
- EvTransitionAnimation *animation,
- EvTransitionEffect *effect,
- gdouble progress,
- GdkRectangle page_area)
-{
- EvTransitionAnimationPriv *priv;
-
- priv = EV_TRANSITION_ANIMATION_GET_PRIVATE (animation);
-
- paint_surface (cr, priv->origin_surface, 0, 0, 0, page_area);
- paint_surface (cr, priv->dest_surface, 0, 0, progress, page_area);
-}
-
-void
-ev_transition_animation_paint (EvTransitionAnimation *animation,
- cairo_t *cr,
- GdkRectangle page_area)
-{
- EvTransitionAnimationPriv *priv;
- EvTransitionEffectType type;
- gdouble progress;
-
- g_return_if_fail (EV_IS_TRANSITION_ANIMATION (animation));
-
- priv = EV_TRANSITION_ANIMATION_GET_PRIVATE (animation);
- g_object_get (priv->effect, "type", &type, NULL);
- progress = ev_timeline_get_progress (EV_TIMELINE (animation));
-
- if (!priv->dest_surface) {
- /* animation is still not ready, paint the origin surface */
- paint_surface (cr, priv->origin_surface, 0, 0, 0, page_area);
- return;
- }
-
- switch (type) {
- case EV_TRANSITION_EFFECT_REPLACE:
- /* just paint the destination slide */
- paint_surface (cr, priv->dest_surface, 0, 0, 0, page_area);
- break;
- case EV_TRANSITION_EFFECT_SPLIT:
- ev_transition_animation_split (cr, animation, priv->effect, progress, page_area);
- break;
- case EV_TRANSITION_EFFECT_BLINDS:
- ev_transition_animation_blinds (cr, animation, priv->effect, progress, page_area);
- break;
- case EV_TRANSITION_EFFECT_BOX:
- ev_transition_animation_box (cr, animation, priv->effect, progress, page_area);
- break;
- case EV_TRANSITION_EFFECT_WIPE:
- ev_transition_animation_wipe (cr, animation, priv->effect, progress, page_area);
- break;
- case EV_TRANSITION_EFFECT_DISSOLVE:
- ev_transition_animation_dissolve (cr, animation, priv->effect, progress, page_area);
- break;
- case EV_TRANSITION_EFFECT_PUSH:
- ev_transition_animation_push (cr, animation, priv->effect, progress, page_area);
- break;
- case EV_TRANSITION_EFFECT_COVER:
- ev_transition_animation_cover (cr, animation, priv->effect, progress, page_area);
- break;
- case EV_TRANSITION_EFFECT_UNCOVER:
- ev_transition_animation_uncover (cr, animation, priv->effect, progress, page_area);
- break;
- case EV_TRANSITION_EFFECT_FADE:
- ev_transition_animation_fade (cr, animation, priv->effect, progress, page_area);
- break;
- default: {
- GEnumValue *enum_value;
-
- enum_value = g_enum_get_value (g_type_class_peek (EV_TYPE_TRANSITION_EFFECT_TYPE), type);
-
- g_warning ("Unimplemented transition animation: '%s', "
- "please post a bug report in Evince bugzilla "
- "(http://bugzilla.gnome.org) with a testcase.",
- enum_value->value_nick);
-
- /* just paint the destination slide */
- paint_surface (cr, priv->dest_surface, 0, 0, 0, page_area);
- }
- }
-}
-
-EvTransitionAnimation *
-ev_transition_animation_new (EvTransitionEffect *effect)
-{
- g_return_val_if_fail (EV_IS_TRANSITION_EFFECT (effect), NULL);
-
- return g_object_new (EV_TYPE_TRANSITION_ANIMATION,
- "effect", effect,
- NULL);
-}
-
-void
-ev_transition_animation_set_origin_surface (EvTransitionAnimation *animation,
- cairo_surface_t *origin_surface)
-{
- EvTransitionAnimationPriv *priv;
- cairo_surface_t *surface;
-
- g_return_if_fail (EV_IS_TRANSITION_ANIMATION (animation));
-
- priv = EV_TRANSITION_ANIMATION_GET_PRIVATE (animation);
-
- surface = cairo_surface_reference (origin_surface);
-
- if (priv->origin_surface)
- cairo_surface_destroy (priv->origin_surface);
-
- priv->origin_surface = surface;
- g_object_notify (G_OBJECT (animation), "origin-surface");
-
- if (priv->origin_surface && priv->dest_surface)
- ev_timeline_start (EV_TIMELINE (animation));
-}
-
-void
-ev_transition_animation_set_dest_surface (EvTransitionAnimation *animation,
- cairo_surface_t *dest_surface)
-{
- EvTransitionAnimationPriv *priv;
- cairo_surface_t *surface;
-
- g_return_if_fail (EV_IS_TRANSITION_ANIMATION (animation));
-
- priv = EV_TRANSITION_ANIMATION_GET_PRIVATE (animation);
-
- surface = cairo_surface_reference (dest_surface);
-
- if (priv->dest_surface)
- cairo_surface_destroy (priv->dest_surface);
-
- priv->dest_surface = surface;
- g_object_notify (G_OBJECT (animation), "dest-surface");
-
- if (priv->origin_surface && priv->dest_surface)
- ev_timeline_start (EV_TIMELINE (animation));
-}
-
-gboolean
-ev_transition_animation_ready (EvTransitionAnimation *animation)
-{
- EvTransitionAnimationPriv *priv;
-
- g_return_val_if_fail (EV_IS_TRANSITION_ANIMATION (animation), FALSE);
-
- priv = EV_TRANSITION_ANIMATION_GET_PRIVATE (animation);
-
- return (priv->origin_surface && priv->dest_surface);
-}