ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/CV/CV.xs
(Generate patch)

Comparing CV/CV.xs (file contents):
Revision 1.2 by root, Mon Nov 3 00:04:22 2003 UTC vs.
Revision 1.4 by root, Sat Nov 8 18:22:21 2003 UTC

5#include <gdk-pixbuf/gdk-pixbuf.h> 5#include <gdk-pixbuf/gdk-pixbuf.h>
6 6
7#include <gperl.h> 7#include <gperl.h>
8#include <gtk2perl.h> 8#include <gtk2perl.h>
9 9
10static guint32 a85_val;
11static guint a85_cnt;
12static guchar a85_buf[80], *a85_ptr;
13
14static void
15a85_init (void)
16{
17 a85_cnt = 4;
18 a85_ptr = a85_buf;
19}
20
21static void
22a85_push (PerlIO *fp, guchar c)
23{
24 a85_val = a85_val << 8 | c;
25
26 if (!--a85_cnt)
27 {
28 a85_cnt = 4;
29 if (a85_val)
30 {
31 a85_ptr[4] = (a85_val % 85) + 33; a85_val /= 85;
32 a85_ptr[3] = (a85_val % 85) + 33; a85_val /= 85;
33 a85_ptr[2] = (a85_val % 85) + 33; a85_val /= 85;
34 a85_ptr[1] = (a85_val % 85) + 33; a85_val /= 85;
35 a85_ptr[0] = (a85_val ) + 33;
36
37 a85_ptr += 5;
38 }
39 else
40 *a85_ptr++ = 'z';
41
42 if (a85_ptr >= a85_buf + sizeof (a85_buf) - 7)
43 {
44 *a85_ptr++ = '\n';
45 PerlIO_write (fp, a85_buf, a85_ptr - a85_buf);
46 a85_ptr = a85_buf;
47 }
48 }
49
50}
51
52a85_finish (PerlIO *fp)
53{
54 while (a85_cnt != 4)
55 a85_push (fp, 0);
56
57 *a85_ptr++ = '~'; // probably buggy end-marker
58 *a85_ptr++ = '>'; // probably buggy end-marker
59 *a85_ptr++ = '\n';
60
61 PerlIO_write (fp, a85_buf, a85_ptr - a85_buf);
62}
63
10MODULE = Gtk2::CV PACKAGE = Gtk2::CV::ImageWindow 64MODULE = Gtk2::CV PACKAGE = Gtk2::CV::ImageWindow
11 65
12PROTOTYPES: ENABLE 66PROTOTYPES: ENABLE
13 67
14GdkPixbuf * 68GdkPixbuf_noinc *
15transpose (GdkPixbuf *pb) 69transpose (GdkPixbuf *pb)
16 CODE: 70 CODE:
17{ 71{
18 int w = gdk_pixbuf_get_width (pb); 72 int w = gdk_pixbuf_get_width (pb);
19 int h = gdk_pixbuf_get_height (pb); 73 int h = gdk_pixbuf_get_height (pb);
25 RETVAL = gdk_pixbuf_new (GDK_COLORSPACE_RGB, bpp == 4, 8, h, w); 79 RETVAL = gdk_pixbuf_new (GDK_COLORSPACE_RGB, bpp == 4, 8, h, w);
26 80
27 dst = gdk_pixbuf_get_pixels (RETVAL); 81 dst = gdk_pixbuf_get_pixels (RETVAL);
28 dstr = gdk_pixbuf_get_rowstride (RETVAL); 82 dstr = gdk_pixbuf_get_rowstride (RETVAL);
29 83
30 for (x = 0; x < w; x++)
31 for (y = 0; y < h; y++) 84 for (y = 0; y < h; y++)
85 for (x = 0; x < w; x++)
32 for (i = 0; i < bpp; i++) 86 for (i = 0; i < bpp; i++)
33 dst[y * bpp + x * dstr + i] = src[x * bpp + y * sstr + i]; 87 dst[y * bpp + x * dstr + i] = src[x * bpp + y * sstr + i];
34} 88}
35 OUTPUT: 89 OUTPUT:
36 RETVAL 90 RETVAL
37 91
38GdkPixbuf * 92GdkPixbuf_noinc *
39flop (GdkPixbuf *pb) 93flop (GdkPixbuf *pb)
40 CODE: 94 CODE:
41{ 95{
42 int w = gdk_pixbuf_get_width (pb); 96 int w = gdk_pixbuf_get_width (pb);
43 int h = gdk_pixbuf_get_height (pb); 97 int h = gdk_pixbuf_get_height (pb);
49 RETVAL = gdk_pixbuf_new (GDK_COLORSPACE_RGB, bpp == 4, 8, w, h); 103 RETVAL = gdk_pixbuf_new (GDK_COLORSPACE_RGB, bpp == 4, 8, w, h);
50 104
51 dst = gdk_pixbuf_get_pixels (RETVAL); 105 dst = gdk_pixbuf_get_pixels (RETVAL);
52 dstr = gdk_pixbuf_get_rowstride (RETVAL); 106 dstr = gdk_pixbuf_get_rowstride (RETVAL);
53 107
54 for (x = 0; x < w; x++)
55 for (y = 0; y < h; y++) 108 for (y = 0; y < h; y++)
109 for (x = 0; x < w; x++)
56 for (i = 0; i < bpp; i++) 110 for (i = 0; i < bpp; i++)
57 dst[(w - x) * bpp + y * dstr + i] = src[x *bpp + y * sstr + i]; 111 dst[(w - 1 - x) * bpp + y * dstr + i] = src[x * bpp + y * sstr + i];
58} 112}
59 OUTPUT: 113 OUTPUT:
60 RETVAL 114 RETVAL
61 115
62MODULE = Gtk2::CV PACKAGE = Gtk2::CV::Schnauzer 116MODULE = Gtk2::CV PACKAGE = Gtk2::CV::Schnauzer
63 117
64GdkPixbuf * 118GdkPixbuf_noinc *
65p7_to_pb (int w, int h, guchar *src) 119p7_to_pb (int w, int h, guchar *src)
66 CODE: 120 CODE:
67{ 121{
68 int x, y; 122 int x, y;
69 guchar *dst, *d; 123 guchar *dst, *d;
74 dstr = gdk_pixbuf_get_rowstride (RETVAL); 128 dstr = gdk_pixbuf_get_rowstride (RETVAL);
75 129
76 for (y = 0; y < h; y++) 130 for (y = 0; y < h; y++)
77 for (d = dst + y * dstr, x = 0; x < w; x++) 131 for (d = dst + y * dstr, x = 0; x < w; x++)
78 { 132 {
79 *d++ = ((*src >> 5) & 7) * 255 / 7; 133 *d++ = (((*src >> 5) & 7) * 255 + 4) / 7;
80 *d++ = ((*src >> 2) & 7) * 255 / 7; 134 *d++ = (((*src >> 2) & 7) * 255 + 4) / 7;
81 *d++ = ((*src >> 0) & 3) * 255 / 3; 135 *d++ = (((*src >> 0) & 3) * 255 + 2) / 3;
82 136
83 src++; 137 src++;
84 } 138 }
85} 139}
86 OUTPUT: 140 OUTPUT:
87 RETVAL 141 RETVAL
88 142
143SV *
144pb_to_p7 (GdkPixbuf *pb)
145 CODE:
146{
147 int w = gdk_pixbuf_get_width (pb);
148 int h = gdk_pixbuf_get_height (pb);
149 int x, y;
150 guchar *dst;
151 int bpp = gdk_pixbuf_get_has_alpha (pb) ? 4 : 3;
152 guchar *src = gdk_pixbuf_get_pixels (pb);
153 int sstr = gdk_pixbuf_get_rowstride (pb);
89 154
155 RETVAL = newSV (w * h);
156 SvPOK_only (RETVAL);
157 SvCUR_set (RETVAL, w * h);
90 158
159 dst = SvPVX (RETVAL);
160
161 for (y = 0; y < h; y++)
162 {
163 /* use a very primitive form of error distribution. */
164 int er = 0, eg = 0, eb = 0;
165
166 for (x = 0; x < w; x++)
167 {
168 int r, g, b;
169 guchar *p = src + x * bpp + y * sstr;
170
171 r = ((p[0] + er) * 7 + 128) / 255;
172 g = ((p[1] + eg) * 7 + 128) / 255;
173 b = ((p[2] + eb) * 3 + 128) / 255;
174
175 r = r > 7 ? 7 : r < 0 ? 0 : r;
176 g = g > 7 ? 7 : g < 0 ? 0 : g;
177 b = b > 3 ? 3 : b < 0 ? 0 : b;
178
179 er += p[0] - (r * 255 + 4) / 7;
180 eg += p[1] - (g * 255 + 4) / 7;
181 eb += p[2] - (b * 255 + 2) / 3;
182
183 *dst++ = r << 5 | g << 2 | b;
184 }
185 }
186}
187 OUTPUT:
188 RETVAL
189
190MODULE = Gtk2::CV PACKAGE = Gtk2::CV::PostScript
191
192void
193dump_pb (PerlIO *fp, GdkPixbuf *pb)
194 CODE:
195{
196 int w = gdk_pixbuf_get_width (pb);
197 int h = gdk_pixbuf_get_height (pb);
198 int x, y, i;
199 guchar *dst;
200 int bpp = gdk_pixbuf_get_has_alpha (pb) ? 4 : 3;
201 guchar *src = gdk_pixbuf_get_pixels (pb);
202 int sstr = gdk_pixbuf_get_rowstride (pb);
203
204 a85_init ();
205
206 for (y = 0; y < h; y++)
207 for (x = 0; x < w; x++)
208 for (i = 0; i < 3; i++)
209 a85_push (fp, src [x * bpp + y * sstr + i]);
210
211 a85_finish (fp);
212}
213
214
215
216

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines