Evince
Evince is a document viewer capable of displaying multiple and single page document formats like PDF and Postscript.
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
ev-transition-animation.c File Reference
#include <cairo.h>
#include <gdk/gdk.h>
#include "ev-transition-animation.h"
#include "ev-timeline.h"
+ Include dependency graph for ev-transition-animation.c:

Go to the source code of this file.

Data Structures

struct  EvTransitionAnimationPriv
 

Macros

#define EV_TRANSITION_ANIMATION_GET_PRIVATE(obj)   (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EV_TYPE_TRANSITION_ANIMATION, EvTransitionAnimationPriv))
 
#define N_BLINDS   6
 

Typedefs

typedef struct
EvTransitionAnimationPriv 
EvTransitionAnimationPriv
 

Enumerations

enum  { PROP_0, PROP_EFFECT, PROP_ORIGIN_SURFACE, PROP_DEST_SURFACE }
 

Functions

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)
 
static void ev_transition_animation_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
 
static void ev_transition_animation_finalize (GObject *object)
 
static GObject * ev_transition_animation_constructor (GType type, guint n_construct_properties, GObjectConstructParam *construct_params)
 
static void ev_transition_animation_class_init (EvTransitionAnimationClass *klass)
 
static void paint_surface (cairo_t *cr, cairo_surface_t *surface, gdouble x_offset, gdouble y_offset, gdouble alpha, GdkRectangle page_area)
 
static void ev_transition_animation_split (cairo_t *cr, EvTransitionAnimation *animation, EvTransitionEffect *effect, gdouble progress, GdkRectangle page_area)
 
static void ev_transition_animation_blinds (cairo_t *cr, EvTransitionAnimation *animation, EvTransitionEffect *effect, gdouble progress, GdkRectangle page_area)
 
static void ev_transition_animation_box (cairo_t *cr, EvTransitionAnimation *animation, EvTransitionEffect *effect, gdouble progress, GdkRectangle page_area)
 
static void ev_transition_animation_wipe (cairo_t *cr, EvTransitionAnimation *animation, EvTransitionEffect *effect, gdouble progress, GdkRectangle page_area)
 
static void ev_transition_animation_dissolve (cairo_t *cr, EvTransitionAnimation *animation, EvTransitionEffect *effect, gdouble progress, GdkRectangle page_area)
 
static void ev_transition_animation_push (cairo_t *cr, EvTransitionAnimation *animation, EvTransitionEffect *effect, gdouble progress, GdkRectangle page_area)
 
static void ev_transition_animation_cover (cairo_t *cr, EvTransitionAnimation *animation, EvTransitionEffect *effect, gdouble progress, GdkRectangle page_area)
 
static void ev_transition_animation_uncover (cairo_t *cr, EvTransitionAnimation *animation, EvTransitionEffect *effect, gdouble progress, GdkRectangle page_area)
 
static void ev_transition_animation_fade (cairo_t *cr, EvTransitionAnimation *animation, EvTransitionEffect *effect, gdouble progress, GdkRectangle page_area)
 
void ev_transition_animation_paint (EvTransitionAnimation *animation, cairo_t *cr, GdkRectangle page_area)
 
EvTransitionAnimationev_transition_animation_new (EvTransitionEffect *effect)
 
void ev_transition_animation_set_origin_surface (EvTransitionAnimation *animation, cairo_surface_t *origin_surface)
 
void ev_transition_animation_set_dest_surface (EvTransitionAnimation *animation, cairo_surface_t *dest_surface)
 
gboolean ev_transition_animation_ready (EvTransitionAnimation *animation)
 

Macro Definition Documentation

#define EV_TRANSITION_ANIMATION_GET_PRIVATE (   obj)    (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EV_TYPE_TRANSITION_ANIMATION, EvTransitionAnimationPriv))

Definition at line 27 of file ev-transition-animation.c.

#define N_BLINDS   6

Definition at line 28 of file ev-transition-animation.c.

Typedef Documentation

Enumeration Type Documentation

anonymous enum
Enumerator
PROP_0 
PROP_EFFECT 
PROP_ORIGIN_SURFACE 
PROP_DEST_SURFACE 

Definition at line 38 of file ev-transition-animation.c.

38  {
39  PROP_0,
43 };

Function Documentation

static void ev_transition_animation_blinds ( cairo_t *  cr,
EvTransitionAnimation animation,
EvTransitionEffect effect,
gdouble  progress,
GdkRectangle  page_area 
)
static

Definition at line 276 of file ev-transition-animation.c.

281 {
283  EvTransitionEffectAlignment alignment;
284  gint width, height, i;
285 
286  priv = EV_TRANSITION_ANIMATION_GET_PRIVATE (animation);
287  width = page_area.width;
288  height = page_area.height;
289 
290  g_object_get (effect,
291  "alignment", &alignment,
292  NULL);
293 
294  paint_surface (cr, priv->origin_surface, 0, 0, 1., page_area);
295 
296  for (i = 0; i < N_BLINDS; i++) {
297  cairo_save (cr);
298 
299  if (alignment == EV_TRANSITION_ALIGNMENT_HORIZONTAL) {
300  cairo_rectangle (cr,
301  0,
302  height / N_BLINDS * i,
303  width,
304  height / N_BLINDS * progress);
305  } else {
306  cairo_rectangle (cr,
307  width / N_BLINDS * i,
308  0,
309  width / N_BLINDS * progress,
310  height);
311  }
312 
313  cairo_clip (cr);
314  paint_surface (cr, priv->dest_surface, 0, 0, 1., page_area);
315  cairo_restore (cr);
316  }
317 }

+ Here is the caller graph for this function:

static void ev_transition_animation_box ( cairo_t *  cr,
EvTransitionAnimation animation,
EvTransitionEffect effect,
gdouble  progress,
GdkRectangle  page_area 
)
static

Definition at line 320 of file ev-transition-animation.c.

325 {
327  EvTransitionEffectDirection direction;
328  gint width, height;
329 
330  priv = EV_TRANSITION_ANIMATION_GET_PRIVATE (animation);
331  width = page_area.width;
332  height = page_area.height;
333 
334  g_object_get (effect,
335  "direction", &direction,
336  NULL);
337 
338  if (direction == EV_TRANSITION_DIRECTION_INWARD) {
339  paint_surface (cr, priv->dest_surface, 0, 0, 1., page_area);
340 
341  cairo_rectangle (cr,
342  width * progress / 2,
343  height * progress / 2,
344  width * (1 - progress),
345  height * (1 - progress));
346  cairo_clip (cr);
347 
348  paint_surface (cr, priv->origin_surface, 0, 0, 1., page_area);
349  } else {
350  paint_surface (cr, priv->origin_surface, 0, 0, 1., page_area);
351 
352  cairo_rectangle (cr,
353  (width / 2) - (width * progress / 2),
354  (height / 2) - (height * progress / 2),
355  width * progress,
356  height * progress);
357  cairo_clip (cr);
358 
359  paint_surface (cr, priv->dest_surface, 0, 0, 1., page_area);
360  }
361 }

+ Here is the caller graph for this function:

static void ev_transition_animation_class_init ( EvTransitionAnimationClass klass)
static

Definition at line 152 of file ev-transition-animation.c.

153 {
154  GObjectClass *object_class = G_OBJECT_CLASS (klass);
155 
156  object_class->set_property = ev_transition_animation_set_property;
157  object_class->get_property = ev_transition_animation_get_property;
158  object_class->finalize = ev_transition_animation_finalize;
159  object_class->constructor = ev_transition_animation_constructor;
160 
161  g_object_class_install_property (object_class,
162  PROP_EFFECT,
163  g_param_spec_object ("effect",
164  "Effect",
165  "Transition effect description",
167  G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE |
168  G_PARAM_STATIC_STRINGS));
169  g_object_class_install_property (object_class,
171  g_param_spec_pointer ("origin-surface",
172  "Origin surface",
173  "Cairo surface from which the animation will happen",
174  G_PARAM_READWRITE |
175  G_PARAM_STATIC_STRINGS));
176  g_object_class_install_property (object_class,
178  g_param_spec_pointer ("dest-surface",
179  "Destination surface",
180  "Cairo surface to which the animation will happen",
181  G_PARAM_READWRITE |
182  G_PARAM_STATIC_STRINGS));
183 
184  g_type_class_add_private (klass, sizeof (EvTransitionAnimationPriv));
185 }
static GObject* ev_transition_animation_constructor ( GType  type,
guint  n_construct_properties,
GObjectConstructParam *  construct_params 
)
static

Definition at line 129 of file ev-transition-animation.c.

132 {
133  GObject *object;
135  EvTransitionEffect *effect;
136  gint duration;
137 
138  object = G_OBJECT_CLASS (ev_transition_animation_parent_class)->constructor (type,
139  n_construct_properties,
140  construct_params);
141 
142  priv = EV_TRANSITION_ANIMATION_GET_PRIVATE (object);
143  effect = priv->effect;
144 
145  g_object_get (effect, "duration", &duration, NULL);
146  ev_timeline_set_duration (EV_TIMELINE (object), duration * 1000);
147 
148  return object;
149 }

+ Here is the caller graph for this function:

static void ev_transition_animation_cover ( cairo_t *  cr,
EvTransitionAnimation animation,
EvTransitionEffect effect,
gdouble  progress,
GdkRectangle  page_area 
)
static

Definition at line 463 of file ev-transition-animation.c.

468 {
470  gint width, height;
471  gint angle;
472 
473  priv = EV_TRANSITION_ANIMATION_GET_PRIVATE (animation);
474  width = page_area.width;
475  height = page_area.height;
476 
477  g_object_get (effect,
478  "angle", &angle,
479  NULL);
480 
481  paint_surface (cr, priv->origin_surface, 0, 0, 1., page_area);
482 
483  if (angle == 0) {
484  /* left to right */
485  paint_surface (cr, priv->dest_surface, width * (1 - progress), 0, 1., page_area);
486  } else {
487  /* top to bottom */
488  paint_surface (cr, priv->dest_surface, 0, height * (1 - progress), 1., page_area);
489  }
490 }

+ Here is the caller graph for this function:

static void ev_transition_animation_dissolve ( cairo_t *  cr,
EvTransitionAnimation animation,
EvTransitionEffect effect,
gdouble  progress,
GdkRectangle  page_area 
)
static

Definition at line 418 of file ev-transition-animation.c.

423 {
425 
426  priv = EV_TRANSITION_ANIMATION_GET_PRIVATE (animation);
427 
428  paint_surface (cr, priv->dest_surface, 0, 0, 1., page_area);
429  paint_surface (cr, priv->origin_surface, 0, 0, 1 - progress, page_area);
430 }

+ Here is the caller graph for this function:

static void ev_transition_animation_fade ( cairo_t *  cr,
EvTransitionAnimation animation,
EvTransitionEffect effect,
gdouble  progress,
GdkRectangle  page_area 
)
static

Definition at line 523 of file ev-transition-animation.c.

528 {
530 
531  priv = EV_TRANSITION_ANIMATION_GET_PRIVATE (animation);
532 
533  paint_surface (cr, priv->origin_surface, 0, 0, 1., page_area);
534  paint_surface (cr, priv->dest_surface, 0, 0, progress, page_area);
535 }

+ Here is the caller graph for this function:

static void ev_transition_animation_finalize ( GObject *  object)
static

Definition at line 110 of file ev-transition-animation.c.

111 {
113 
114  priv = EV_TRANSITION_ANIMATION_GET_PRIVATE (object);
115 
116  if (priv->effect)
117  g_object_unref (priv->effect);
118 
119  if (priv->origin_surface)
120  cairo_surface_destroy (priv->origin_surface);
121 
122  if (priv->dest_surface)
123  cairo_surface_destroy (priv->dest_surface);
124 
125  G_OBJECT_CLASS (ev_transition_animation_parent_class)->finalize (object);
126 }

+ Here is the caller graph for this function:

static void ev_transition_animation_get_property ( GObject *  object,
guint  prop_id,
GValue *  value,
GParamSpec *  pspec 
)
static

Definition at line 85 of file ev-transition-animation.c.

89 {
91 
93 
94  switch (prop_id) {
95  case PROP_EFFECT:
96  g_value_set_object (value, priv->effect);
97  break;
99  g_value_set_pointer (value, priv->origin_surface);
100  break;
101  case PROP_DEST_SURFACE:
102  g_value_set_pointer (value, priv->dest_surface);
103  break;
104  default:
105  G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
106  }
107 }

+ Here is the caller graph for this function:

static void ev_transition_animation_init ( EvTransitionAnimation animation)
static

Definition at line 50 of file ev-transition-animation.c.

51 {
52 }
EvTransitionAnimation* ev_transition_animation_new ( EvTransitionEffect effect)

Definition at line 608 of file ev-transition-animation.c.

609 {
610  g_return_val_if_fail (EV_IS_TRANSITION_EFFECT (effect), NULL);
611 
612  return g_object_new (EV_TYPE_TRANSITION_ANIMATION,
613  "effect", effect,
614  NULL);
615 }

+ Here is the caller graph for this function:

void ev_transition_animation_paint ( EvTransitionAnimation animation,
cairo_t *  cr,
GdkRectangle  page_area 
)

Definition at line 538 of file ev-transition-animation.c.

541 {
544  gdouble progress;
545 
546  g_return_if_fail (EV_IS_TRANSITION_ANIMATION (animation));
547 
548  priv = EV_TRANSITION_ANIMATION_GET_PRIVATE (animation);
549 
550  if (!priv->dest_surface) {
551  /* animation is still not ready, paint the origin surface */
552  paint_surface (cr, priv->origin_surface, 0, 0, 1., page_area);
553  return;
554  }
555 
556  g_object_get (priv->effect, "type", &type, NULL);
557  progress = ev_timeline_get_progress (EV_TIMELINE (animation));
558 
559  switch (type) {
561  /* just paint the destination slide */
562  paint_surface (cr, priv->dest_surface, 0, 0, 1., page_area);
563  break;
565  ev_transition_animation_split (cr, animation, priv->effect, progress, page_area);
566  break;
568  ev_transition_animation_blinds (cr, animation, priv->effect, progress, page_area);
569  break;
571  ev_transition_animation_box (cr, animation, priv->effect, progress, page_area);
572  break;
574  ev_transition_animation_wipe (cr, animation, priv->effect, progress, page_area);
575  break;
577  ev_transition_animation_dissolve (cr, animation, priv->effect, progress, page_area);
578  break;
580  ev_transition_animation_push (cr, animation, priv->effect, progress, page_area);
581  break;
583  ev_transition_animation_cover (cr, animation, priv->effect, progress, page_area);
584  break;
586  ev_transition_animation_uncover (cr, animation, priv->effect, progress, page_area);
587  break;
589  ev_transition_animation_fade (cr, animation, priv->effect, progress, page_area);
590  break;
591  default: {
592  GEnumValue *enum_value;
593 
594  enum_value = g_enum_get_value (g_type_class_peek (EV_TYPE_TRANSITION_EFFECT_TYPE), type);
595 
596  g_warning ("Unimplemented transition animation: '%s', "
597  "please post a bug report in Evince bugzilla "
598  "(http://bugzilla.gnome.org) with a testcase.",
599  enum_value->value_nick);
600 
601  /* just paint the destination slide */
602  paint_surface (cr, priv->dest_surface, 0, 0, 1., page_area);
603  }
604  }
605 }

+ Here is the caller graph for this function:

static void ev_transition_animation_push ( cairo_t *  cr,
EvTransitionAnimation animation,
EvTransitionEffect effect,
gdouble  progress,
GdkRectangle  page_area 
)
static

Definition at line 433 of file ev-transition-animation.c.

438 {
440  gint width, height;
441  gint angle;
442 
443  priv = EV_TRANSITION_ANIMATION_GET_PRIVATE (animation);
444  width = page_area.width;
445  height = page_area.height;
446 
447  g_object_get (effect,
448  "angle", &angle,
449  NULL);
450 
451  if (angle == 0) {
452  /* left to right */
453  paint_surface (cr, priv->origin_surface, - (width * progress), 0, 1., page_area);
454  paint_surface (cr, priv->dest_surface, width * (1 - progress), 0, 1., page_area);
455  } else {
456  /* top to bottom */
457  paint_surface (cr, priv->origin_surface, 0, - (height * progress), 1., page_area);
458  paint_surface (cr, priv->dest_surface, 0, height * (1 - progress), 1., page_area);
459  }
460 }

+ Here is the caller graph for this function:

gboolean ev_transition_animation_ready ( EvTransitionAnimation animation)

Definition at line 670 of file ev-transition-animation.c.

671 {
673 
674  g_return_val_if_fail (EV_IS_TRANSITION_ANIMATION (animation), FALSE);
675 
676  priv = EV_TRANSITION_ANIMATION_GET_PRIVATE (animation);
677 
678  return (priv->origin_surface != NULL);
679 }

+ Here is the caller graph for this function:

void ev_transition_animation_set_dest_surface ( EvTransitionAnimation animation,
cairo_surface_t *  dest_surface 
)

Definition at line 644 of file ev-transition-animation.c.

646 {
648  cairo_surface_t *surface;
649 
650  g_return_if_fail (EV_IS_TRANSITION_ANIMATION (animation));
651 
652  priv = EV_TRANSITION_ANIMATION_GET_PRIVATE (animation);
653 
654  if (priv->dest_surface == dest_surface)
655  return;
656 
657  surface = cairo_surface_reference (dest_surface);
658 
659  if (priv->dest_surface)
660  cairo_surface_destroy (priv->dest_surface);
661 
662  priv->dest_surface = surface;
663  g_object_notify (G_OBJECT (animation), "dest-surface");
664 
665  if (priv->origin_surface && priv->dest_surface)
666  ev_timeline_start (EV_TIMELINE (animation));
667 }

+ Here is the caller graph for this function:

void ev_transition_animation_set_origin_surface ( EvTransitionAnimation animation,
cairo_surface_t *  origin_surface 
)

Definition at line 618 of file ev-transition-animation.c.

620 {
622  cairo_surface_t *surface;
623 
624  g_return_if_fail (EV_IS_TRANSITION_ANIMATION (animation));
625 
626  priv = EV_TRANSITION_ANIMATION_GET_PRIVATE (animation);
627 
628  if (priv->origin_surface == origin_surface)
629  return;
630 
631  surface = cairo_surface_reference (origin_surface);
632 
633  if (priv->origin_surface)
634  cairo_surface_destroy (priv->origin_surface);
635 
636  priv->origin_surface = surface;
637  g_object_notify (G_OBJECT (animation), "origin-surface");
638 
639  if (priv->origin_surface && priv->dest_surface)
640  ev_timeline_start (EV_TIMELINE (animation));
641 }

+ Here is the caller graph for this function:

static void ev_transition_animation_set_property ( GObject *  object,
guint  prop_id,
const GValue *  value,
GParamSpec *  pspec 
)
static

Definition at line 55 of file ev-transition-animation.c.

59 {
61 
63 
64  switch (prop_id) {
65  case PROP_EFFECT:
66  if (priv->effect)
67  g_object_unref (priv->effect);
68 
69  priv->effect = g_value_dup_object (value);
70  break;
73  g_value_get_pointer (value));
74  break;
75  case PROP_DEST_SURFACE:
77  g_value_get_pointer (value));
78  break;
79  default:
80  G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
81  }
82 }

+ Here is the caller graph for this function:

static void ev_transition_animation_split ( cairo_t *  cr,
EvTransitionAnimation animation,
EvTransitionEffect effect,
gdouble  progress,
GdkRectangle  page_area 
)
static

Definition at line 212 of file ev-transition-animation.c.

217 {
219  EvTransitionEffectAlignment alignment;
220  EvTransitionEffectDirection direction;
221  gint width, height;
222 
223  priv = EV_TRANSITION_ANIMATION_GET_PRIVATE (animation);
224  width = page_area.width;
225  height = page_area.height;
226 
227  g_object_get (effect,
228  "alignment", &alignment,
229  "direction", &direction,
230  NULL);
231 
232  if (direction == EV_TRANSITION_DIRECTION_INWARD) {
233  paint_surface (cr, priv->dest_surface, 0, 0, 1., page_area);
234 
235  if (alignment == EV_TRANSITION_ALIGNMENT_HORIZONTAL) {
236  cairo_rectangle (cr,
237  0,
238  height * progress / 2,
239  width,
240  height * (1 - progress));
241  } else {
242  cairo_rectangle (cr,
243  width * progress / 2,
244  0,
245  width * (1 - progress),
246  height);
247  }
248 
249  cairo_clip (cr);
250 
251  paint_surface (cr, priv->origin_surface, 0, 0, 1., page_area);
252  } else {
253  paint_surface (cr, priv->origin_surface, 0, 0, 1., page_area);
254 
255  if (alignment == EV_TRANSITION_ALIGNMENT_HORIZONTAL) {
256  cairo_rectangle (cr,
257  0,
258  (height / 2) - (height * progress / 2),
259  width,
260  height * progress);
261  } else {
262  cairo_rectangle (cr,
263  (width / 2) - (width * progress / 2),
264  0,
265  width * progress,
266  height);
267  }
268 
269  cairo_clip (cr);
270 
271  paint_surface (cr, priv->dest_surface, 0, 0, 1., page_area);
272  }
273 }

+ Here is the caller graph for this function:

static void ev_transition_animation_uncover ( cairo_t *  cr,
EvTransitionAnimation animation,
EvTransitionEffect effect,
gdouble  progress,
GdkRectangle  page_area 
)
static

Definition at line 493 of file ev-transition-animation.c.

498 {
500  gint width, height;
501  gint angle;
502 
503  priv = EV_TRANSITION_ANIMATION_GET_PRIVATE (animation);
504  width = page_area.width;
505  height = page_area.height;
506 
507  g_object_get (effect,
508  "angle", &angle,
509  NULL);
510 
511  paint_surface (cr, priv->dest_surface, 0, 0, 1., page_area);
512 
513  if (angle == 0) {
514  /* left to right */
515  paint_surface (cr, priv->origin_surface, - (width * progress), 0, 1., page_area);
516  } else {
517  /* top to bottom */
518  paint_surface (cr, priv->origin_surface, 0, - (height * progress), 1., page_area);
519  }
520 }

+ Here is the caller graph for this function:

static void ev_transition_animation_wipe ( cairo_t *  cr,
EvTransitionAnimation animation,
EvTransitionEffect effect,
gdouble  progress,
GdkRectangle  page_area 
)
static

Definition at line 364 of file ev-transition-animation.c.

369 {
371  gint width, height;
372  gint angle;
373 
374  priv = EV_TRANSITION_ANIMATION_GET_PRIVATE (animation);
375  width = page_area.width;
376  height = page_area.height;
377 
378  g_object_get (effect,
379  "angle", &angle,
380  NULL);
381 
382  paint_surface (cr, priv->origin_surface, 0, 0, 1., page_area);
383 
384  if (angle == 0) {
385  /* left to right */
386  cairo_rectangle (cr,
387  0, 0,
388  width * progress,
389  height);
390  } else if (angle <= 90) {
391  /* bottom to top */
392  cairo_rectangle (cr,
393  0,
394  height * (1 - progress),
395  width,
396  height * progress);
397  } else if (angle <= 180) {
398  /* right to left */
399  cairo_rectangle (cr,
400  width * (1 - progress),
401  0,
402  width * progress,
403  height);
404  } else if (angle <= 270) {
405  /* top to bottom */
406  cairo_rectangle (cr,
407  0, 0,
408  width,
409  height * progress);
410  }
411 
412  cairo_clip (cr);
413 
414  paint_surface (cr, priv->dest_surface, 0, 0, 1., page_area);
415 }

+ Here is the caller graph for this function:

static void paint_surface ( cairo_t *  cr,
cairo_surface_t *  surface,
gdouble  x_offset,
gdouble  y_offset,
gdouble  alpha,
GdkRectangle  page_area 
)
static

Definition at line 188 of file ev-transition-animation.c.

194 {
195  cairo_save (cr);
196 
197  gdk_cairo_rectangle (cr, &page_area);
198  cairo_clip (cr);
199  cairo_surface_set_device_offset (surface, x_offset, y_offset);
200  cairo_set_source_surface (cr, surface, 0, 0);
201 
202  if (alpha == 1.)
203  cairo_paint (cr);
204  else
205  cairo_paint_with_alpha (cr, alpha);
206 
207  cairo_restore (cr);
208 }

+ Here is the caller graph for this function: