2 * Raster graphics library
4 * Copyright (c) 1997 Alfredo K. Kojima
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Library General Public License for more details.
16 * You should have received a copy of the GNU Library General Public
17 * License along with this library; if not, write to the Free
18 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 /* AIX requires this to be the first thing in the file. */
25 # define alloca __builtin_alloca
33 # ifndef alloca /* predefined by HP cc +Olibcalls */
49 *----------------------------------------------------------------------
51 * Apply 3x3 1 1 1 low pass, convolution mask to image.
54 *----------------------------------------------------------------------
57 RBlurImage(RImage
*image
)
61 unsigned char *r
, *g
, *b
, *a
;
62 unsigned char *pr
=NULL
, *pg
=NULL
, *pb
=NULL
, *pa
=NULL
;
64 #define MASK(c,pc,p) ((*c + *(c-1) + *(c+1) + pc[p] + pc[p-1] + pc[p+1] \
65 + *(c+w) + *(c+w-1) + *(c+w+1))/9)
67 pr
= (unsigned char*)alloca(image
->width
*sizeof(char));
71 pg
= (unsigned char*)alloca(image
->width
*sizeof(char));
75 pb
= (unsigned char*)alloca(image
->width
*sizeof(char));
79 pa
= (unsigned char*)alloca(image
->width
*sizeof(char));
90 for (x
=0; x
<image
->width
; x
++) {
98 for (y
=1; y
<image
->height
-1; y
++) {
107 for (x
=1; x
<image
->width
-1; x
++) {
109 *(r
++) = MASK(r
,pr
,x
);
113 *(g
++) = MASK(g
,pg
,x
);
117 *(b
++) = MASK(b
,pb
,x
);
133 RErrorCode
= RERR_NOMEMORY
;
147 REdgeDetectImage(RImage
*image
)
149 register int x
, y
, d1
, d2
, d3
, d4
, rsum
;
151 unsigned char *r
, *g
, *b
, *a
;
152 unsigned char *dr
, *dg
, *db
, *da
;
153 unsigned char *pr
=NULL
, *pg
=NULL
, *pb
=NULL
, *pa
=NULL
;
157 image2
= RCloneImage(image
);
159 pr
= alloca(image
->width
*sizeof(char));
163 pg
= alloca(image
->width
*sizeof(char));
167 pb
= alloca(image
->width
*sizeof(char));
171 pa
= alloca(image
->width
*sizeof(char));
181 dr
= image2
->data
[0];
182 dg
= image2
->data
[1];
183 db
= image2
->data
[2];
184 da
= image2
->data
[3];
187 for (x
=0; x
<image
->width
; x
++) {
195 for (y
=1; y
<image
->height
-1; y
++) {
204 for (x
=1; x
<image
->width
-1; x
++) {
205 d1
= r
[w
+1] - r
[-w
-1];
207 d3
= r
[-w
+1] - r
[w
-1];
211 if (rsum
< 0) rsum
= -rsum
;
212 d1
= d1
- d2
- d4
; /* vertical gradient */
213 if (d1
< 0) d1
= -d1
;
214 if (d1
> rsum
) rsum
= d1
;
219 d1
= g
[w
+1] - g
[-w
-1];
221 d3
= g
[-w
+1] - g
[w
-1];
225 if (rsum
< 0) rsum
= -rsum
;
226 d1
= d1
- d2
- d4
; /* vertical gradient */
227 if (d1
< 0) d1
= -d1
;
228 if (d1
> rsum
) rsum
= d1
;
233 d1
= b
[w
+1] - b
[-w
-1];
235 d3
= b
[-w
+1] - b
[w
-1];
239 if (rsum
< 0) rsum
= -rsum
;
240 d1
= d1
- d2
- d4
; /* vertical gradient */
241 if (d1
< 0) d1
= -d1
;
242 if (d1
> rsum
) rsum
= d1
;
266 RDestroyImage(image2
);
276 RSmoothImage(RImage
*image
)
280 unsigned char *r
, *g
, *b
, *a
;
288 for (y
=0; y
<image
->height
- 1; y
++) {
289 for (x
=0; x
<image
->width
- 1; x
++) {
290 v
= *r
+ 2 * *(r
+ 1) + 2 * *(r
+ w
) + *(r
+ w
+ 1);
293 v
= *g
+ 2 * *(g
+ 1) + 2 * *(g
+ w
) + *(g
+ w
+ 1);
296 v
= *b
+ 2 * *(b
+ 1) + 2 * *(b
+ w
) + *(b
+ w
+ 1);
301 v
= 3 * *r
+ 3 * *(r
+ w
);
304 v
= 3 * *g
+ 3 * *(g
+ w
);
307 v
= 3 * *b
+ 3 * *(b
+ w
);
312 for (x
=0; x
<image
->width
- 1; x
++) {
313 v
= 3 * *r
+ 3 * *(r
+ 1);
316 v
= 3 * *g
+ 3 * *(g
+ 1);
319 v
= 3 * *b
+ 3 * *(b
+ 1);