]> Pileus Git - ~andy/gtk/blob - demos/testpixbuf.c
Fixed up testpixbuf.c to simulate downloading at certain speed, set
[~andy/gtk] / demos / testpixbuf.c
1
2 /* testpixbuf -- test program for gdk-pixbuf code
3  * Copyright (C) 1999 Mark Crichton, Larry Ewing
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public
16  * License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18  * Boston, MA 02111-1307, USA.
19  */
20
21 #include <stdlib.h>
22 #include <unistd.h>
23 #include <string.h>
24
25 #include <gtk/gtk.h>
26 #include "gdk-pixbuf.h"
27 #include "gdk-pixbuf-io.h"
28 #include "gdk-pixbuf-loader.h"
29
30 typedef struct {
31         FILE             *imagefile;
32         GdkPixbufLoader  *loader;
33         guchar           *buf;
34         guint            timeout;
35         guint            readlen;
36
37 } ProgressFileStatus;
38
39
40 #define DEFAULT_WIDTH  24
41 #define DEFAULT_HEIGHT 24
42
43 static const unsigned char default_image[] = {
44         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
45         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
46         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
47         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
48         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
49         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
50         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
51         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
52         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
53         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
54         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
55         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
56         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
57         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
58         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
59         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
60         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
61         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
62         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
63         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
64         0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
65         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff,
66         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
67         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
68         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
69         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00,
70         0x00, 0x00, 0x00, 0xae, 0xb3, 0xb3, 0xc6, 0xc9, 0xcd, 0xd7, 0xd4, 0xdf,
71         0xec, 0xde, 0xf3, 0xe7, 0xcb, 0xe9, 0xd9, 0xb5, 0xd3, 0x00, 0x00, 0x00,
72         0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
73         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
74         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
75         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xb1, 0xb7, 0xa5,
76         0xb0, 0xb8, 0xad, 0xb3, 0xb9, 0xb6, 0xc1, 0xc6, 0xc8, 0xd5, 0xd3, 0xdc,
77         0xec, 0xde, 0xf3, 0xe5, 0xca, 0xe6, 0xe0, 0xbb, 0xd7, 0xe1, 0xad, 0xc2,
78         0xe3, 0xac, 0xa3, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
79         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
80         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
81         0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xca, 0xc1, 0xa4, 0xc5, 0xc7, 0xac,
82         0xb7, 0xbe, 0xaf, 0xad, 0xb4, 0xaf, 0xbd, 0xc2, 0xc3, 0xd1, 0xd0, 0xd8,
83         0xec, 0xde, 0xf3, 0xe5, 0xc7, 0xe4, 0xe0, 0xb6, 0xd1, 0xe7, 0xa9, 0xb4,
84         0xed, 0xcd, 0xb6, 0xd6, 0xcf, 0xae, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff,
85         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
86         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
87         0x00, 0x00, 0x00, 0xdf, 0xa7, 0x9f, 0xdd, 0xbf, 0xaa, 0xcf, 0xc5, 0xa9,
88         0xc1, 0xc4, 0xac, 0xb2, 0xba, 0xaf, 0xb6, 0xbb, 0xbb, 0xcd, 0xce, 0xd4,
89         0xec, 0xde, 0xf3, 0xe4, 0xc4, 0xe1, 0xe0, 0xaf, 0xc7, 0xea, 0xbc, 0xae,
90         0xe1, 0xd6, 0xb6, 0xc7, 0xcc, 0xae, 0xa2, 0xab, 0x9a, 0x00, 0x00, 0x00,
91         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
92         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
93         0x00, 0x00, 0x00, 0xe3, 0xab, 0xc0, 0xe6, 0xa3, 0xa7, 0xdf, 0xba, 0xa8,
94         0xcf, 0xc5, 0xa9, 0xbd, 0xc2, 0xae, 0xad, 0xb4, 0xaf, 0xc6, 0xc9, 0xcd,
95         0xec, 0xde, 0xf3, 0xe2, 0xbf, 0xdc, 0xe7, 0xa9, 0xb4, 0xe7, 0xd6, 0xb8,
96         0xc7, 0xcc, 0xae, 0xac, 0xb6, 0xa6, 0x9d, 0xa8, 0x9f, 0x00, 0x00, 0x00,
97         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
98         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00,
99         0xd9, 0xaf, 0xcf, 0xe1, 0xb4, 0xd2, 0xe2, 0xb0, 0xcb, 0xe4, 0xa9, 0xbb,
100         0xe2, 0xb2, 0xa6, 0xcf, 0xc5, 0xa9, 0x6a, 0x6a, 0x6a, 0x0d, 0x0d, 0x0d,
101         0x0d, 0x0d, 0x0d, 0x6a, 0x6a, 0x6a, 0xed, 0xcd, 0xb6, 0xc7, 0xcc, 0xae,
102         0xa6, 0xb1, 0xa3, 0x98, 0xa2, 0x9c, 0x8f, 0x97, 0x96, 0x7e, 0x84, 0x85,
103         0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
104         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00,
105         0xe8, 0xc6, 0xe7, 0xe5, 0xc2, 0xe3, 0xe3, 0xbd, 0xdd, 0xe1, 0xb6, 0xd5,
106         0xe2, 0xb0, 0xcb, 0x6a, 0x6a, 0x6a, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff,
107         0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x6a, 0x6a, 0x6a, 0x9d, 0xa8, 0x9f,
108         0x8f, 0x97, 0x96, 0x8b, 0x90, 0x92, 0x97, 0x9e, 0xa2, 0xa0, 0xa7, 0xae,
109         0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
110         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00,
111         0xe7, 0xd3, 0xed, 0xe8, 0xd1, 0xed, 0xe8, 0xce, 0xec, 0xe9, 0xcc, 0xeb,
112         0xe8, 0xc6, 0xe7, 0x0d, 0x0d, 0x0d, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
113         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x0d, 0x0d, 0x0d, 0x97, 0x9e, 0xa2,
114         0xa7, 0xae, 0xb7, 0xb2, 0xb6, 0xc5, 0xba, 0xbc, 0xce, 0xbf, 0xbe, 0xd3,
115         0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
116         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00,
117         0xe9, 0xdf, 0xf0, 0xe9, 0xdf, 0xf0, 0xe9, 0xdf, 0xf0, 0xe9, 0xdf, 0xf0,
118         0xe9, 0xdf, 0xf0, 0x0d, 0x0d, 0x0d, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
119         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x0d, 0x0d, 0x0d, 0xe1, 0xd2, 0xf7,
120         0xe1, 0xd2, 0xf7, 0xe1, 0xd2, 0xf7, 0xe1, 0xd2, 0xf7, 0xe1, 0xd2, 0xf7,
121         0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
122         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00,
123         0xca, 0xc7, 0xd2, 0xc5, 0xc4, 0xcd, 0xbf, 0xbf, 0xc7, 0xb8, 0xb9, 0xc0,
124         0xae, 0xaf, 0xb6, 0x6a, 0x6a, 0x6a, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff,
125         0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x6a, 0x6a, 0x6a, 0xd5, 0xa8, 0xe1,
126         0xd8, 0xb2, 0xe9, 0xd9, 0xb8, 0xed, 0xdb, 0xbd, 0xf0, 0xdc, 0xbf, 0xf1,
127         0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
128         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00,
129         0xa4, 0xa6, 0xac, 0xa8, 0xaa, 0xaf, 0xa0, 0xa6, 0xa8, 0x98, 0x9e, 0x9c,
130         0xa1, 0xa8, 0x9e, 0xb1, 0xb6, 0xa1, 0x6a, 0x6a, 0x6a, 0x0d, 0x0d, 0x0d,
131         0x0d, 0x0d, 0x0d, 0x6a, 0x6a, 0x6a, 0xc0, 0x8c, 0xad, 0xcc, 0x90, 0xb5,
132         0xd3, 0x94, 0xca, 0xd6, 0xa2, 0xdb, 0xd5, 0xa8, 0xe1, 0xcf, 0xa7, 0xdf,
133         0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
134         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
135         0x00, 0x00, 0x00, 0x98, 0x9f, 0x9b, 0xa1, 0xa8, 0x9e, 0xac, 0xb3, 0xa0,
136         0xb9, 0xb9, 0xa4, 0xd0, 0xb8, 0xa8, 0xc5, 0xb5, 0xb8, 0xb6, 0xbb, 0xad,
137         0xe3, 0xd7, 0xb5, 0xdd, 0xb4, 0xa9, 0xcb, 0x89, 0xac, 0xc0, 0x8c, 0xad,
138         0xc8, 0x91, 0xb5, 0xd1, 0x8d, 0xb7, 0xd3, 0x94, 0xca, 0x00, 0x00, 0x00,
139         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
140         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
141         0x00, 0x00, 0x00, 0xa1, 0xa7, 0x98, 0xb1, 0xb6, 0xa1, 0xbd, 0xb9, 0xa5,
142         0xd0, 0xb8, 0xa8, 0xca, 0xb5, 0xb7, 0xb8, 0xb1, 0xb1, 0xc2, 0xc8, 0xb2,
143         0xe3, 0xd7, 0xb5, 0xe1, 0xbf, 0xaf, 0xdb, 0x92, 0x9a, 0xbe, 0x82, 0xa6,
144         0xc0, 0x8c, 0xad, 0xc8, 0x91, 0xb4, 0xc7, 0x8b, 0xb0, 0x00, 0x00, 0x00,
145         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
146         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
147         0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xbc, 0xb6, 0xa1, 0xd0, 0xb8, 0xa8,
148         0xcd, 0xb6, 0xb7, 0xc0, 0xb4, 0xb5, 0xb1, 0xb1, 0xaa, 0xca, 0xd1, 0xb4,
149         0xe3, 0xd7, 0xb5, 0xe2, 0xc1, 0xb0, 0xdb, 0xa8, 0xa3, 0xd2, 0x8a, 0xa9,
150         0xb7, 0x7e, 0xa2, 0xbd, 0x89, 0xa9, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff,
151         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
152         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
153         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xc9, 0xaf, 0xaf,
154         0xc5, 0xb5, 0xb8, 0xb8, 0xb1, 0xb1, 0xb6, 0xbb, 0xad, 0xd0, 0xd6, 0xb5,
155         0xe3, 0xd7, 0xb5, 0xe2, 0xbf, 0xaf, 0xdd, 0xb4, 0xa9, 0xdb, 0x92, 0x9a,
156         0xc6, 0x84, 0xa7, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
157         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
158         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
159         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00,
160         0x00, 0x00, 0x00, 0xac, 0xaa, 0xa6, 0xbd, 0xc3, 0xb0, 0xd2, 0xd7, 0xb5,
161         0xe3, 0xd7, 0xb5, 0xe2, 0xbf, 0xae, 0xdb, 0xb6, 0xa8, 0x00, 0x00, 0x00,
162         0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
163         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
164         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
165         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
166         0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
167         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff,
168         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
169         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
170         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
171         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
172         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
173         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
174         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
175         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
176         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
177         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
178         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
179         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
180         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
181         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
182         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
183         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
184         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
185         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
186         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff,
187         0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff
188 };
189
190
191 static const char * book_open_xpm[] = {
192 "16 16 4 1",
193 "       c None s None",
194 ".      c black",
195 "X      c #808080",
196 "o      c white",
197 "                ",
198 "  ..            ",
199 " .Xo.    ...    ",
200 " .Xoo. ..oo.    ",
201 " .Xooo.Xooo...  ",
202 " .Xooo.oooo.X.  ",
203 " .Xooo.Xooo.X.  ",
204 " .Xooo.oooo.X.  ",
205 " .Xooo.Xooo.X.  ",
206 " .Xooo.oooo.X.  ",
207 "  .Xoo.Xoo..X.  ",
208 "   .Xo.o..ooX.  ",
209 "    .X..XXXXX.  ",
210 "    ..X.......  ",
211 "     ..         ",
212 "                "};
213
214 static const char * book_closed_xpm[] = {
215 "16 16 6 1",
216 "       c None s None",
217 ".      c black",
218 "X      c red",
219 "o      c yellow",
220 "O      c #808080",
221 "#      c white",
222 "                ",
223 "       ..       ",
224 "     ..XX.      ",
225 "   ..XXXXX.     ",
226 " ..XXXXXXXX.    ",
227 ".ooXXXXXXXXX.   ",
228 "..ooXXXXXXXXX.  ",
229 ".X.ooXXXXXXXXX. ",
230 ".XX.ooXXXXXX..  ",
231 " .XX.ooXXX..#O  ",
232 "  .XX.oo..##OO. ",
233 "   .XX..##OO..  ",
234 "    .X.#OO..    ",
235 "     ..O..      ",
236 "      ..        ",
237 "                "};
238
239 static const char * mini_page_xpm[] = {
240 "16 16 4 1",
241 "       c None s None",
242 ".      c black",
243 "X      c white",
244 "o      c #808080",
245 "                ",
246 "   .......      ",
247 "   .XXXXX..     ",
248 "   .XoooX.X.    ",
249 "   .XXXXX....   ",
250 "   .XooooXoo.o  ",
251 "   .XXXXXXXX.o  ",
252 "   .XooooooX.o  ",
253 "   .XXXXXXXX.o  ",
254 "   .XooooooX.o  ",
255 "   .XXXXXXXX.o  ",
256 "   .XooooooX.o  ",
257 "   .XXXXXXXX.o  ",
258 "   ..........o  ",
259 "    oooooooooo  ",
260 "                "};
261
262 static const char * gtk_mini_xpm[] = {
263 "15 20 17 1",
264 "       c None",
265 ".      c #14121F",
266 "+      c #278828",
267 "@      c #9B3334",
268 "#      c #284C72",
269 "$      c #24692A",
270 "%      c #69282E",
271 "&      c #37C539",
272 "*      c #1D2F4D",
273 "=      c #6D7076",
274 "-      c #7D8482",
275 ";      c #E24A49",
276 ">      c #515357",
277 ",      c #9B9C9B",
278 "'      c #2FA232",
279 ")      c #3CE23D",
280 "!      c #3B6CCB",
281 "               ",
282 "      ***>     ",
283 "    >.*!!!*    ",
284 "   ***....#*=  ",
285 "  *!*.!!!**!!# ",
286 " .!!#*!#*!!!!# ",
287 " @%#!.##.*!!$& ",
288 " @;%*!*.#!#')) ",
289 " @;;@%!!*$&)'' ",
290 " @%.%@%$'&)$+' ",
291 " @;...@$'*'*)+ ",
292 " @;%..@$+*.')$ ",
293 " @;%%;;$+..$)# ",
294 " @;%%;@$$$'.$# ",
295 " %;@@;;$$+))&* ",
296 "  %;;;@+$&)&*  ",
297 "   %;;@'))+>   ",
298 "    %;@'&#     ",
299 "     >%$$      ",
300 "      >=       "};
301
302 const gchar ** xpms[] = { 
303   book_open_xpm,
304   book_closed_xpm,
305   mini_page_xpm,
306   gtk_mini_xpm,
307   NULL
308 };
309
310 static void
311 quit_func (GtkWidget *widget, gpointer dummy)
312 {
313         gtk_main_quit ();
314 }
315
316 static void
317 expose_func (GtkWidget *drawing_area, GdkEventExpose *event, gpointer data)
318 {
319         GdkPixbuf *pixbuf;
320
321         pixbuf = (GdkPixbuf *)gtk_object_get_data(GTK_OBJECT(drawing_area), "pixbuf");
322
323         if (!pixbuf->art_pixbuf) {
324                 g_warning ("art_pixbuf is NULL in expose_func!!\n");
325                 return;
326         }
327
328         if (pixbuf->art_pixbuf->has_alpha) {
329                 gdk_draw_rgb_32_image (drawing_area->window,
330                                        drawing_area->style->black_gc,
331                                        event->area.x, event->area.y, 
332                                        event->area.width, 
333                                        event->area.height,
334                                        GDK_RGB_DITHER_MAX, 
335                                        pixbuf->art_pixbuf->pixels 
336                                        + (event->area.y * pixbuf->art_pixbuf->rowstride) 
337                                        + (event->area.x * pixbuf->art_pixbuf->n_channels),
338                                        pixbuf->art_pixbuf->rowstride);
339         } else {
340                 gdk_draw_rgb_image (drawing_area->window,
341                                     drawing_area->style->white_gc,
342                                     event->area.x, event->area.y, 
343                                     event->area.width, 
344                                     event->area.height,
345                                     GDK_RGB_DITHER_NORMAL,
346                                     pixbuf->art_pixbuf->pixels 
347                                     + (event->area.y * pixbuf->art_pixbuf->rowstride) 
348                                     + (event->area.x * pixbuf->art_pixbuf->n_channels),
349                                     pixbuf->art_pixbuf->rowstride);
350         }
351 }
352
353 static void
354 config_func (GtkWidget *drawing_area, GdkEventConfigure *event, gpointer data)
355 {
356         GdkPixbuf *pixbuf;
357     
358         pixbuf = (GdkPixbuf *)gtk_object_get_data(GTK_OBJECT(drawing_area), "pixbuf");
359
360         g_print("X:%d Y:%d\n", event->width, event->height);
361
362 #if 0
363         if (((event->width) != (pixbuf->art_pixbuf->width)) ||
364             ((event->height) != (pixbuf->art_pixbuf->height))) 
365                 gdk_pixbuf_scale(pixbuf, event->width, event->height);
366 #endif
367 }
368
369 static GtkWidget*
370 new_testrgb_window (GdkPixbuf *pixbuf, gchar *title)
371 {
372         GtkWidget *window;
373         GtkWidget *vbox;
374         GtkWidget *temp_box;
375         GtkWidget *button;
376         GtkWidget *drawing_area;
377         gint w, h;
378  
379         w = pixbuf->art_pixbuf->width;
380         h = pixbuf->art_pixbuf->height;
381
382         window = gtk_widget_new (gtk_window_get_type (),
383                                  "GtkObject::user_data", NULL,
384                                  "GtkWindow::type", GTK_WINDOW_TOPLEVEL,
385                                  "GtkWindow::title", "testrgb",
386                                  "GtkWindow::allow_shrink", TRUE,
387                                  NULL);
388         gtk_signal_connect (GTK_OBJECT (window), "destroy",
389                             (GtkSignalFunc) quit_func, NULL);
390
391         vbox = gtk_vbox_new (FALSE, 0);
392
393         if (title)
394                 gtk_box_pack_start (GTK_BOX (vbox), gtk_label_new (title),
395                                     TRUE, TRUE, 0);
396
397         drawing_area = gtk_drawing_area_new ();
398
399         temp_box = gtk_hbox_new (FALSE, 0);
400         gtk_drawing_area_size (GTK_DRAWING_AREA(drawing_area), w, h);
401         gtk_box_pack_start (GTK_BOX (temp_box), drawing_area, FALSE, FALSE, 0);
402         gtk_box_pack_start (GTK_BOX (vbox), temp_box, FALSE, FALSE, 0);
403         
404
405         gtk_signal_connect (GTK_OBJECT(drawing_area), "expose_event",
406                             GTK_SIGNAL_FUNC(expose_func), NULL);
407         gtk_signal_connect (GTK_OBJECT(drawing_area), "configure_event",
408                             GTK_SIGNAL_FUNC (config_func), NULL);
409
410         gtk_object_set_data (GTK_OBJECT(drawing_area), "pixbuf", pixbuf);
411
412         gtk_widget_show (drawing_area);
413
414         button = gtk_button_new_with_label ("Quit");
415         gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
416         gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
417                                    (GtkSignalFunc) gtk_widget_destroy,
418                                    GTK_OBJECT (window));
419
420         gtk_widget_show (button);
421
422         gtk_container_add (GTK_CONTAINER (window), vbox);
423         gtk_widget_show_all (vbox);
424
425         gtk_widget_show (window);
426
427         return window;
428 }
429
430
431 static gint
432 update_timeout(gpointer data)
433 {
434         ProgressFileStatus *status = data;
435         gboolean done;
436
437         done = TRUE;
438         if (!feof(status->imagefile)) {
439                 gint nbytes;
440
441                 nbytes = fread(status->buf, 1, status->readlen, 
442                                status->imagefile);
443
444                 done = !gdk_pixbuf_loader_write (GDK_PIXBUF_LOADER (status->loader), status->buf, nbytes);
445                         
446         }
447
448         if (done) {
449                 gdk_pixbuf_loader_close (GDK_PIXBUF_LOADER (status->loader));
450                 gtk_object_destroy (GTK_OBJECT(status->loader));
451                 fclose (status->imagefile);
452                 g_free (status->buf);
453         }
454
455         return !done;
456 }
457
458
459 static void
460 progressive_prepared_callback(GdkPixbufLoader* loader, gpointer data)
461 {
462         GtkWidget** retloc = data;
463         GdkPixbuf* pixbuf;
464
465         pixbuf = gdk_pixbuf_loader_get_pixbuf(loader);
466         g_assert(pixbuf != NULL);
467
468         gdk_pixbuf_ref(pixbuf); /* for the RGB window */
469
470         *retloc = new_testrgb_window(pixbuf, "Progressive");
471
472         return;
473 }
474
475
476 static void
477 progressive_updated_callback(GdkPixbufLoader* loader, guint x, guint y, guint width, guint height, gpointer data)
478 {
479         GtkWidget** window_loc = data;
480
481 /*      g_print ("progressive_updated_callback:\n\t%d\t%d\t%d\t%d\n", x, y, width, height); */
482
483         if (*window_loc != NULL)
484                 gtk_widget_queue_draw_area(*window_loc,
485                                            x, y, width, height);
486
487         return;
488 }
489
490 static int readlen = 1;
491
492 int
493 main (int argc, char **argv)
494 {
495         int i;
496         int found_valid = FALSE;
497
498         GdkPixbuf *pixbuf;
499         GdkPixbufLoader *pixbuf_loader;
500         FILE *file;
501
502         gtk_init (&argc, &argv);
503
504         gdk_rgb_set_verbose (TRUE);
505
506         gdk_rgb_init ();
507
508         gtk_widget_set_default_colormap (gdk_rgb_get_cmap ());
509         gtk_widget_set_default_visual (gdk_rgb_get_visual ());
510
511         {
512                 char *tbf_readlen = getenv("TBF_READLEN");
513                 if(tbf_readlen) readlen = atoi(tbf_readlen);
514         }
515
516         {
517                 char *tbf_bps = getenv("TBF_KBPS");
518                 guint bps;
519
520                 if (tbf_bps) {
521                         bps = atoi(tbf_bps);
522                         readlen = (bps*1024)/10;
523                 }
524         }
525
526         i = 1;
527         if (argc == 1) {
528                 const gchar*** xpmp;
529                 
530                 pixbuf = gdk_pixbuf_new_from_data ((guchar *) default_image, ART_PIX_RGB, FALSE,
531                                                    DEFAULT_WIDTH, DEFAULT_HEIGHT, DEFAULT_WIDTH * 3,
532                                                    NULL, NULL);
533                 new_testrgb_window (pixbuf, NULL);
534
535                 xpmp = xpms;
536                 while (*xpmp) {
537                         pixbuf = gdk_pixbuf_new_from_xpm_data (*xpmp);
538                         new_testrgb_window (pixbuf, NULL);
539                         ++xpmp;
540                 }
541                 
542                 found_valid = TRUE;
543         } else {
544                 for (i = 1; i < argc; i++) {
545
546                         pixbuf = gdk_pixbuf_new_from_file (argv[i]);
547 #if 0
548                         pixbuf = gdk_pixbuf_rotate(pixbuf, 10.0);
549 #endif
550
551                         if (pixbuf) {
552                                 new_testrgb_window (pixbuf, "File");
553                                 found_valid = TRUE;
554                         }
555                 }
556 #if 1
557                 {
558                         GtkWidget* rgb_window = NULL;
559                         ProgressFileStatus   status;
560
561                         pixbuf_loader = gdk_pixbuf_loader_new ();
562                         status.loader = pixbuf_loader;
563
564                         status.buf = g_malloc (readlen);
565                         gtk_signal_connect(GTK_OBJECT(pixbuf_loader),
566                                            "area_prepared",
567                                            GTK_SIGNAL_FUNC(progressive_prepared_callback),
568                                            &rgb_window);
569
570                         gtk_signal_connect(GTK_OBJECT(pixbuf_loader),
571                                            "area_updated",
572                                            GTK_SIGNAL_FUNC(progressive_updated_callback),
573                                            &rgb_window);
574
575                         
576                         status.imagefile = fopen (argv[1], "r");
577                         g_assert (status.imagefile != NULL);
578
579                         status.readlen = readlen;
580
581                         status.timeout = gtk_timeout_add(100, update_timeout, &status);
582                 }
583 #endif
584         }
585
586         if (found_valid)
587                 gtk_main ();
588
589         return 0;
590 }