~ubuntu-branches/ubuntu/gutsy/avscan/gutsy

« back to all changes in this revision

Viewing changes to avscan/animicon.c

  • Committer: Bazaar Package Importer
  • Author(s): Christoph Berg
  • Date: 2007-08-12 14:22:25 UTC
  • mfrom: (1.9.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20070812142225-2whp6690lilo2wg8
Tags: 3.2.1-openssl-2
Correctly handle DEB_BUILD_OPTIONS=nostrip (Closes: #436496).

Show diffs side-by-side

added added

removed removed

Lines of Context:
52
52
 
53
53
        AnimIconFlags   flags;
54
54
 
 
55
        gint            freeze_count;
 
56
 
55
57
        GdkColormap     *colormap;
56
58
        GdkGC           *gc;
57
59
 
58
 
        GdkPixmap       **pixmaps_list;
59
 
        GdkBitmap       **masks_list;
 
60
        GList           *pixmaps_list;  /* GList of GdkPixmap * */
 
61
        GList           *masks_list;    /* GList of GdkBitmap * */
60
62
        GdkColor        *color_bg;
61
63
 
62
64
        GtkWidget       *drawing_area;
74
76
};
75
77
 
76
78
 
77
 
#define ATOI(s)         (((s) != NULL) ? atoi(s) : 0)
78
 
#define ATOL(s)         (((s) != NULL) ? atol(s) : 0)
79
 
#define ATOF(s)         (((s) != NULL) ? atof(s) : 0.0f)
80
 
#define STRDUP(s)       (((s) != NULL) ? g_strdup(s) : NULL)
 
79
#define ATOI(s)         (((s) != NULL) ? atoi(s) : 0)
 
80
#define ATOL(s)         (((s) != NULL) ? atol(s) : 0)
 
81
#define ATOF(s)         (((s) != NULL) ? atof(s) : 0.0f)
 
82
#define STRDUP(s)       (((s) != NULL) ? g_strdup(s) : NULL)
81
83
 
82
 
#define MAX(a,b)        (((a) > (b)) ? (a) : (b))
83
 
#define MIN(a,b)        (((a) < (b)) ? (a) : (b))
84
 
#define CLIP(a,l,h)     (MIN(MAX((a),(l)),(h)))
85
 
#define STRLEN(s)       (((s) != NULL) ? strlen(s) : 0)
86
 
#define STRISEMPTY(s)   (((s) != NULL) ? (*(s) == '\0') : TRUE)
 
84
#define MAX(a,b)        (((a) > (b)) ? (a) : (b))
 
85
#define MIN(a,b)        (((a) < (b)) ? (a) : (b))
 
86
#define CLIP(a,l,h)     (MIN(MAX((a),(l)),(h)))
 
87
#define STRLEN(s)       (((s) != NULL) ? strlen(s) : 0)
 
88
#define STRISEMPTY(s)   (((s) != NULL) ? (*(s) == '\0') : TRUE)
87
89
 
88
90
 
89
91
/*
91
93
 */
92
94
static void AnimIconDataDestroyCB(gpointer data)
93
95
{
94
 
        gint i;
95
96
        AnimIcon *a = ANIM_ICON(data);
96
97
        if(a == NULL)
97
98
            return;
98
99
 
99
 
        GTK_TIMEOUT_REMOVE(a->toid);
100
 
        a->toid = 0;
101
 
 
102
 
        for(i = 0; i < a->nframes; i++)
103
 
        {
104
 
            GDK_PIXMAP_UNREF(a->pixmaps_list[i]);
105
 
            GDK_BITMAP_UNREF(a->masks_list[i]);
106
 
        }
107
 
        g_free(a->pixmaps_list);
108
 
        g_free(a->masks_list);
 
100
        a->freeze_count++;
 
101
 
 
102
        if(a->toid != 0)
 
103
            gtk_timeout_remove(a->toid);
 
104
 
 
105
        if(a->pixmaps_list != NULL)
 
106
        {
 
107
            GList *glist;
 
108
            for(glist = a->pixmaps_list;
 
109
                glist != NULL;
 
110
                glist = g_list_next(glist)
 
111
            )
 
112
            {
 
113
                if(glist->data != NULL)
 
114
                    gdk_pixmap_unref((GdkPixmap *)glist->data);
 
115
            }
 
116
            g_list_free(a->pixmaps_list);
 
117
        }
 
118
        if(a->masks_list != NULL)
 
119
        {
 
120
            GList *glist;
 
121
            for(glist = a->masks_list;
 
122
                glist != NULL;
 
123
                glist = g_list_next(glist)
 
124
            )
 
125
            {
 
126
                if(glist->data != NULL)
 
127
                    gdk_bitmap_unref((GdkBitmap *)glist->data);
 
128
            }
 
129
            g_list_free(a->masks_list);
 
130
        }
109
131
 
110
132
        if(a->color_bg != NULL)
111
133
        {
117
139
        GDK_PIXMAP_UNREF(a->pixmap);
118
140
        GDK_COLORMAP_UNREF(a->colormap);
119
141
 
 
142
        a->freeze_count--;
120
143
 
121
144
        g_free(a);
122
145
}
135
158
        if((widget == NULL) || (event == NULL) || (a == NULL))
136
159
            return(status);
137
160
 
 
161
        if(a->freeze_count > 0)
 
162
            return(status);
 
163
 
138
164
        switch((gint)event->type)
139
165
        {
140
166
          case GDK_CONFIGURE:
168
194
        if((widget == NULL) || (a == NULL))
169
195
            return;
170
196
 
 
197
        if(a->freeze_count > 0)
 
198
            return;
 
199
 
171
200
        window = widget->window;
172
201
        if(window == NULL)
173
202
            return;
202
231
 
203
232
        gdk_threads_enter();
204
233
 
 
234
        if(a->freeze_count > 0)
 
235
        {
 
236
            gdk_threads_leave();
 
237
            return(TRUE);
 
238
        }
 
239
 
205
240
        /* Go to next frame */
206
241
        a->frame++;
207
242
        if(a->frame >= a->nframes)
245
280
        if(a == NULL)
246
281
            return;
247
282
 
 
283
        if(a->freeze_count > 0)
 
284
            return;
 
285
 
248
286
        w = a->drawing_area;
249
287
        if(w == NULL)
250
288
            return;
285
323
            );
286
324
        }
287
325
 
288
 
        /* Draw animated icon */
289
 
        if(a->nframes > 0)
 
326
        /* Draw the animated icon */
 
327
        if(a->pixmaps_list != NULL)
290
328
        {
291
 
            const gint  frame = a->frame,
292
 
                        nframes = a->nframes;
293
 
            if((frame >= 0) && (frame < nframes))
 
329
            const guint frame = (guint)a->frame;
 
330
            GdkPixmap *pixmap = (GdkPixmap *)g_list_nth_data(
 
331
                a->pixmaps_list, frame
 
332
            );
 
333
            if(pixmap != NULL)
294
334
            {
295
 
                GdkPixmap *pixmap = a->pixmaps_list[frame];
296
 
                GdkBitmap *mask = a->masks_list[frame];
 
335
                GdkBitmap *mask = (GdkBitmap *)g_list_nth_data(
 
336
                    a->masks_list, frame
 
337
                );
297
338
                gdk_gc_set_clip_mask(gc, mask);
298
339
                gdk_gc_set_clip_origin(gc, 0, 0);
299
340
                gdk_draw_pixmap(
325
366
 */
326
367
GtkWidget *AnimIconNew(const gint width, const gint height)
327
368
{
328
 
        GtkWidget *w = gtk_drawing_area_new();
329
 
        AnimIcon *a = ANIM_ICON(g_malloc0(sizeof(AnimIcon)));
330
 
 
 
369
        GtkWidget *w;
 
370
        AnimIcon *a;
 
371
 
 
372
        a = ANIM_ICON(g_malloc0(sizeof(AnimIcon)));
 
373
        if(a == NULL)
 
374
            return(NULL);
 
375
 
 
376
        a->flags = 0;
 
377
        a->freeze_count = 0;
 
378
        a->colormap = NULL;
 
379
        a->gc = NULL;
 
380
        a->pixmaps_list = NULL;
 
381
        a->masks_list = NULL;
 
382
        a->color_bg = NULL;
 
383
        a->drawing_area = NULL;
 
384
        a->pixmap = NULL;
 
385
        a->nframes = 0;
 
386
        a->frame = 0;
 
387
        a->width = width;
 
388
        a->height = height;
 
389
        a->toid = 0;
 
390
 
 
391
        a->freeze_count++;
 
392
 
 
393
        a->drawing_area = w = gtk_drawing_area_new();
331
394
        gtk_object_set_data_full(
332
395
            GTK_OBJECT(w), ANIM_ICON_DATA_KEY,
333
396
            a, AnimIconDataDestroyCB
334
397
        );
335
 
 
336
398
        gtk_widget_set_usize(w, width, height);
337
399
        gtk_widget_add_events(
338
400
            w,
351
413
            GTK_SIGNAL_FUNC(AnimIconRealizeCB), a
352
414
        );
353
415
 
354
 
        a->flags = 0;
355
 
        a->colormap = NULL;
356
 
        a->gc = NULL;
357
 
        a->pixmaps_list = NULL;
358
 
        a->masks_list = NULL;
359
 
        a->color_bg = NULL;
360
 
        a->drawing_area = w;
361
 
        a->pixmap = NULL;
362
 
        a->frame = 0;
363
 
        a->nframes = 0;
364
 
        a->width = width;
365
 
        a->height = height;
366
 
        a->toid = 0;
 
416
        a->freeze_count--;
367
417
 
368
418
        return(w);
369
419
}
378
428
        GtkWidget *w, GList *data_list, const gulong interval
379
429
)
380
430
{
381
 
        gint i;
382
431
        AnimIcon *a = ANIM_ICON((w != NULL) ?
383
432
            gtk_object_get_data(GTK_OBJECT(w), ANIM_ICON_DATA_KEY) : NULL
384
433
        );
385
434
        if(a == NULL)
386
435
            return;
387
436
 
388
 
        /* Remove current draw timeout if any */
 
437
        a->freeze_count++;
 
438
 
 
439
        /* Remove the current draw timeout if any */
389
440
        if(a->toid != 0)
390
441
        {
391
442
            gtk_timeout_remove(a->toid);
392
443
            a->toid = 0;
393
444
        }
394
445
 
395
 
        /* Delete existing pixmaps and masks lists */
396
 
        for(i = 0; i < a->nframes; i++)
397
 
        {
398
 
            GDK_PIXMAP_UNREF(a->pixmaps_list[i]);
399
 
            GDK_BITMAP_UNREF(a->masks_list[i]);
400
 
        }
401
 
        g_free(a->pixmaps_list);
402
 
        a->pixmaps_list = NULL;
403
 
        g_free(a->masks_list);
404
 
        a->masks_list = NULL;
 
446
        /* Delete the pixmaps and masks lists */
 
447
        if(a->pixmaps_list != NULL)
 
448
        {
 
449
            GList *glist;
 
450
            for(glist = a->pixmaps_list;
 
451
                glist != NULL;
 
452
                glist = g_list_next(glist)
 
453
            )
 
454
            {
 
455
                if(glist->data != NULL)
 
456
                    gdk_pixmap_unref((GdkPixmap *)glist->data);
 
457
            }
 
458
            g_list_free(a->pixmaps_list);
 
459
            a->pixmaps_list = NULL;
 
460
        }
 
461
        if(a->masks_list != NULL)
 
462
        {
 
463
            GList *glist;
 
464
            for(glist = a->masks_list;
 
465
                glist != NULL;
 
466
                glist = g_list_next(glist)
 
467
            )
 
468
            {
 
469
                if(glist->data != NULL)
 
470
                    gdk_bitmap_unref((GdkBitmap *)glist->data);
 
471
            }
 
472
            g_list_free(a->masks_list);
 
473
            a->masks_list = NULL;
 
474
        }
405
475
        a->nframes = 0;
406
476
        a->frame = 0;
407
477
        a->interval = (gulong)AnimIconIntervalDefault;
408
478
 
409
479
 
410
 
        /* Load XPM data */
 
480
        /* Load the XPM data */
411
481
        if(data_list != NULL)
412
482
        {
413
483
            guint8 **data;
414
484
            GList *glist;
415
 
 
416
 
            /* Get number of frames */
417
 
            a->nframes = g_list_length(data_list);
418
 
 
419
 
            /* Allocate pixmaps and masks lists */
420
 
            a->pixmaps_list = (GdkPixmap **)g_malloc0(
421
 
                a->nframes * sizeof(GdkPixmap *)
422
 
            );
423
 
            a->masks_list = (GdkBitmap **)g_malloc0(
424
 
                a->nframes * sizeof(GdkBitmap *)
425
 
            );
426
 
            if((a->pixmaps_list == NULL) || (a->masks_list == NULL))
427
 
            {
428
 
                g_free(a->pixmaps_list);
429
 
                a->pixmaps_list = NULL;
430
 
                g_free(a->masks_list);
431
 
                a->masks_list = NULL;
432
 
                a->nframes = 0;
433
 
                return;
434
 
            }
 
485
            GdkBitmap *mask;
 
486
            GdkPixmap *pixmap;
435
487
 
436
488
            /* Load each pixmap and mask */
437
 
            for(glist = data_list, i = 0;
 
489
            for(glist = data_list;
438
490
                glist != NULL;
439
 
                glist = g_list_next(glist), i++
 
491
                glist = g_list_next(glist)
440
492
            )
441
493
            {
442
494
                data = (guint8 **)glist->data;
443
495
                if(data == NULL)
444
496
                    continue;
445
497
 
446
 
                a->pixmaps_list[i] = GDK_PIXMAP_NEW_FROM_XPM_DATA(
447
 
                    &a->masks_list[i], (guint8 **)data
 
498
                pixmap = GDK_PIXMAP_NEW_FROM_XPM_DATA(
 
499
                    &mask, (guint8 **)data
448
500
                );
 
501
                if(pixmap == NULL)
 
502
                    continue;
 
503
 
 
504
                a->pixmaps_list = g_list_append(a->pixmaps_list, pixmap);
 
505
                a->masks_list = g_list_append(a->masks_list, mask);
449
506
            }
450
507
 
451
 
            /* Set interval */
 
508
            /* Set the total number of frames */
 
509
            a->nframes = g_list_length(a->pixmaps_list);
 
510
 
 
511
            /* Set the interval */
452
512
            a->interval = interval;
453
513
        }
 
514
 
 
515
        a->freeze_count--;
454
516
}
455
517
 
456
518
/*
524
586
        AnimIcon *a = ANIM_ICON((w != NULL) ?
525
587
            gtk_object_get_data(GTK_OBJECT(w), ANIM_ICON_DATA_KEY) : NULL
526
588
        );
527
 
        return((a != NULL) ? (a->toid > 0) : FALSE);
 
589
        return((a != NULL) ? (a->toid != 0) : FALSE);
528
590
}
529
591
 
530
592
/*
569
631
        if(a == NULL)
570
632
            return;
571
633
 
572
 
        if(a->toid > 0)
573
 
        {
574
 
            gtk_timeout_remove(a->toid);
575
 
            a->toid = 0;
576
 
        }
 
634
        if(a->toid == 0)
 
635
            return;
 
636
 
 
637
        gtk_timeout_remove(a->toid);
 
638
        a->toid = 0;
577
639
}
578
640
 
579
641
 
589
651
            return;
590
652
 
591
653
        /* Already playing? */
592
 
        if(a->toid > 0)
 
654
        if(a->toid != 0)
593
655
            return;
594
656
 
595
657
        gtk_widget_queue_draw(w);
601
663
                AnimIconDrawTOCB, a
602
664
            );
603
665
}
604