KiCad PCB EDA Suite
greymap.h
Go to the documentation of this file.
1 /* Copyright (C) 2001-2015 Peter Selinger.
2  * This file is part of Potrace. It is free software and it is covered
3  * by the GNU General Public License. See the file COPYING for details. */
4 
5 
6 #ifndef GREYMAP_H
7 #define GREYMAP_H
8 
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <stddef.h>
12 
13 /* internal format for greymaps. Note: in this format, rows are
14  * ordered from bottom to top. The pixels in each row are given from
15  * left to right. */
16 
17 struct greymap_s
18 {
19  int w; /* width, in pixels */
20  int h; /* height, in pixels */
21  signed short int* map; /* raw data, w*h values */
22 };
23 typedef struct greymap_s greymap_t;
24 
25 /* macros for accessing pixel at index (x,y). Note that the origin is
26  * in the *lower* left corner. U* macros omit the bounds check. */
27 
28 #define gm_index( gm, x, y ) (&(gm)->map[(x) + (y) * (ptrdiff_t) (gm)->w])
29 #define gm_safe( gm, x, \
30  y ) ( (int) (x)>=0 && (int) (x)<(gm)->w && (int) (y)>=0 \
31  && (int) (y)<(gm)->h )
32 #define gm_bound( x, m ) ( (x)<0 ? 0 : (x)>=(m) ? (m) - 1 : (x) )
33 #define GM_UGET( gm, x, y ) ( *gm_index( gm, x, y ) )
34 #define GM_UINC( gm, x, y, b ) ( *gm_index( gm, x, y ) += (short int) (b) )
35 #define GM_UINV( gm, x, y ) ( *gm_index( gm, x, y ) = 255 - *gm_index( gm, x, y ) )
36 #define GM_UPUT( gm, x, y, b ) ( *gm_index( gm, x, y ) = (short int) (b) )
37 #define GM_GET( gm, x, y ) (gm_safe( gm, x, y ) ? GM_UGET( gm, x, y ) : 0)
38 #define GM_INC( gm, x, y, b ) (gm_safe( gm, x, y ) ? GM_UINC( gm, x, y, b ) : 0)
39 #define GM_INV( gm, x, y ) (gm_safe( gm, x, y ) ? GM_UINV( gm, x, y ) : 0)
40 #define GM_PUT( gm, x, y, b ) (gm_safe( gm, x, y ) ? GM_UPUT( gm, x, y, b ) : 0)
41 #define GM_BGET( gm, x, y ) GM_UGET( gm, gm_bound( x, gm->w ), gm_bound( y, gm->h ) )
42 
43 /* modes for cutting off out-of-range values. The following names
44  * refer to winding numbers. I.e., make a pixel black if winding
45  * number is nonzero, odd, or positive, respectively. We assume that 0
46  * winding number corresponds to white (255). */
47 #define GM_MODE_NONZERO 1
48 #define GM_MODE_ODD 2
49 #define GM_MODE_POSITIVE 3
50 #define GM_MODE_NEGATIVE 4
51 
52 extern const char* gm_read_error;
53 
54 greymap_t* gm_new( int w, int h );
55 greymap_t* gm_dup( greymap_t* gm );
56 void gm_free( greymap_t* gm );
57 void gm_clear( greymap_t* gm, int b );
58 int gm_read( FILE* f, greymap_t** gmp );
59 int gm_writepgm( FILE* f, greymap_t* gm, char* comment, int raw, int mode, double gamma );
60 int gm_print( FILE* f, greymap_t* gm );
61 
62 #endif /* GREYMAP_H */
int h
Definition: greymap.h:20
int gm_read(FILE *f, greymap_t **gmp)
Definition: greymap.cpp:239
greymap_t * gm_dup(greymap_t *gm)
Definition: greymap.cpp:80
int gm_writepgm(FILE *f, greymap_t *gm, char *comment, int raw, int mode, double gamma)
Definition: greymap.cpp:1144
greymap_t * gm_new(int w, int h)
Definition: greymap.cpp:34
signed short int * map
Definition: greymap.h:21
int w
Definition: greymap.h:19
void gm_clear(greymap_t *gm, int b)
Definition: greymap.cpp:95
const char * gm_read_error
Definition: greymap.cpp:237
void gm_free(greymap_t *gm)
Definition: greymap.cpp:68
int gm_print(FILE *f, greymap_t *gm)
Definition: greymap.cpp:1249