2015-12-03 15:46:17 +00:00
|
|
|
/* Copyright (C) 2001-2015 Peter Selinger.
|
|
|
|
* This file is part of Potrace. It is free software and it is covered
|
|
|
|
* by the GNU General Public License. See the file COPYING for details. */
|
2010-06-10 18:43:12 +00:00
|
|
|
|
|
|
|
|
2015-12-03 15:46:17 +00:00
|
|
|
#ifndef GREYMAP_H
|
|
|
|
#define GREYMAP_H
|
2010-06-10 18:43:12 +00:00
|
|
|
|
|
|
|
#include <stdio.h>
|
2015-12-03 15:46:17 +00:00
|
|
|
#include <stdlib.h>
|
2010-06-10 18:43:12 +00:00
|
|
|
|
|
|
|
/* internal format for greymaps. Note: in this format, rows are
|
2015-12-03 15:46:17 +00:00
|
|
|
* ordered from bottom to top. The pixels in each row are given from
|
|
|
|
* left to right. */
|
|
|
|
|
|
|
|
struct greymap_s
|
|
|
|
{
|
|
|
|
int w; /* width, in pixels */
|
|
|
|
int h; /* height, in pixels */
|
|
|
|
signed short int* map; /* raw data, w*h values */
|
2010-06-10 18:43:12 +00:00
|
|
|
};
|
|
|
|
typedef struct greymap_s greymap_t;
|
|
|
|
|
|
|
|
/* macros for accessing pixel at index (x,y). Note that the origin is
|
2015-12-03 15:46:17 +00:00
|
|
|
* in the *lower* left corner. U* macros omit the bounds check. */
|
|
|
|
|
|
|
|
#define gm_index( gm, x, y ) (&(gm)->map[(x) + (y) * (ssize_t) (gm)->w])
|
|
|
|
#define gm_safe( gm, x, \
|
|
|
|
y ) ( (int) (x)>=0 && (int) (x)<(gm)->w && (int) (y)>=0 \
|
|
|
|
&& (int) (y)<(gm)->h )
|
|
|
|
#define gm_bound( x, m ) ( (x)<0 ? 0 : (x)>=(m) ? (m) - 1 : (x) )
|
|
|
|
#define GM_UGET( gm, x, y ) ( *gm_index( gm, x, y ) )
|
|
|
|
#define GM_UINC( gm, x, y, b ) ( *gm_index( gm, x, y ) += (short int) (b) )
|
|
|
|
#define GM_UINV( gm, x, y ) ( *gm_index( gm, x, y ) = 255 - *gm_index( gm, x, y ) )
|
|
|
|
#define GM_UPUT( gm, x, y, b ) ( *gm_index( gm, x, y ) = (short int) (b) )
|
|
|
|
#define GM_GET( gm, x, y ) (gm_safe( gm, x, y ) ? GM_UGET( gm, x, y ) : 0)
|
|
|
|
#define GM_INC( gm, x, y, b ) (gm_safe( gm, x, y ) ? GM_UINC( gm, x, y, b ) : 0)
|
|
|
|
#define GM_INV( gm, x, y ) (gm_safe( gm, x, y ) ? GM_UINV( gm, x, y ) : 0)
|
|
|
|
#define GM_PUT( gm, x, y, b ) (gm_safe( gm, x, y ) ? GM_UPUT( gm, x, y, b ) : 0)
|
|
|
|
#define GM_BGET( gm, x, y ) GM_UGET( gm, gm_bound( x, gm->w ), gm_bound( y, gm->h ) )
|
2010-06-10 18:43:12 +00:00
|
|
|
|
|
|
|
/* modes for cutting off out-of-range values. The following names
|
2015-12-03 15:46:17 +00:00
|
|
|
* refer to winding numbers. I.e., make a pixel black if winding
|
|
|
|
* number is nonzero, odd, or positive, respectively. We assume that 0
|
|
|
|
* winding number corresponds to white (255). */
|
|
|
|
#define GM_MODE_NONZERO 1
|
|
|
|
#define GM_MODE_ODD 2
|
|
|
|
#define GM_MODE_POSITIVE 3
|
|
|
|
#define GM_MODE_NEGATIVE 4
|
|
|
|
|
|
|
|
extern const char* gm_read_error;
|
|
|
|
|
|
|
|
greymap_t* gm_new( int w, int h );
|
|
|
|
greymap_t* gm_dup( greymap_t* gm );
|
|
|
|
void gm_free( greymap_t* gm );
|
|
|
|
void gm_clear( greymap_t* gm, int b );
|
|
|
|
int gm_read( FILE* f, greymap_t** gmp );
|
|
|
|
int gm_writepgm( FILE* f, greymap_t* gm, char* comment, int raw, int mode, double gamma );
|
|
|
|
int gm_print( FILE* f, greymap_t* gm );
|
|
|
|
|
|
|
|
#endif /* GREYMAP_H */
|