14 PLDLLIMPEXP_DRIVER const char* plD_DEVICE_INFO_pbm =
"pbm:PDB (PPM) Driver:0:pbm:38:pbm\n";
20 void plD_line_pbm(
PLStream *,
short,
short,
short,
short );
37 #define MAX( a, b ) ( ( a > b ) ? a : b )
38 #define ABS( a ) ( ( a < 0 ) ? -a : a )
40 #define MAX_INTENSITY 255
44 #ifndef ENABLE_DYNDRIVERS
105 plD_line_pbm(
PLStream *pls,
short x1a,
short y1a,
short x2a,
short y2a )
107 int steps, i,
dx,
dy;
108 double x_off, y_off, dx_step, dy_step;
117 dx_step = dx / steps;
118 dy_step = dy / steps;
122 for ( i = 0; i < steps; i++ )
124 cmap[(int) y_off][(
int) x_off][0] = pls->curcolor.r;
125 cmap[(
int) y_off][(
int) x_off][1] = pls->curcolor.g;
126 cmap[(
int) y_off][(
int) x_off][2] = pls->curcolor.b;
131 cmap[(
int) y_off][(
int) x_off][0] = pls->curcolor.r;
132 cmap[(
int) y_off][(
int) x_off][1] = pls->curcolor.g;
133 cmap[(
int) y_off][(
int) x_off][2] = pls->curcolor.b;
139 #define sign( a ) ( ( a < 0 ) ? -1 : ( ( a == 0 ) ? 0 : 1 ) )
142 #define plot( x, y, c ) { cmap[y - 1][x - 1][0] = ( c )->curcolor.r; \
143 cmap[y - 1][x - 1][1] = ( c )->curcolor.g; \
144 cmap[y - 1][x - 1][2] = ( c )->curcolor.b; }
149 plD_line_pbm(
PLStream *pls,
short x1a,
short y1a,
short x2a,
short y2a )
151 int e, x, y,
dx,
dy, s1, s2, temp, change, i;
156 dx =
ABS( x2a - x1a );
157 dy =
ABS( y2a - y1a );
158 s1 = sign( x2a - x1a );
159 s2 = sign( y2a - y1a );
174 for ( i = 1; i <
dx; i++ )
193 #define plot( x, y, c ) { int i = 3 * ( ( y ) * ( c )->xlength + ( x ) ); \
194 cmap[i + 0] = ( c )->curcolor.r; \
195 cmap[i + 1] = ( c )->curcolor.g; \
196 cmap[i + 2] = ( c )->curcolor.b; }
200 plD_line_pbm(
PLStream *pls,
short x1a,
short y1a,
short x2a,
short y2a )
203 int x1 = x1a, y1 = y1a, x2 = x2a, y2 = y2a;
204 PLINT x1b, y1b, x2b, y2b;
209 y1 = pls->
ylength - ( y1 - 0 );
210 y2 = pls->
ylength - ( y2 - 0 );
212 x1b = x1, x2b = x2, y1b = y1, y2b = y2;
213 length = (
PLFLT) sqrt( (
double)
214 ( ( x2b - x1b ) * ( x2b - x1b ) + ( y2b - y1b ) * ( y2b - y1b ) ) );
218 dx = ( x2 - x1 ) / length;
219 dy = ( y2 - y1 ) / length;
226 for ( i = 1; i <= (int) length; i++ )
235 plD_polyline_pbm(
PLStream *pls,
short *xa,
short *ya,
PLINT npts )
238 for ( i = 0; i < npts - 1; i++ )
239 plD_line_pbm( pls, xa[i], ya[i], xa[i + 1], ya[i + 1] );
246 size_t im_size, nwrite;
250 fprintf( fp,
"%s\n",
"P6" );
252 fprintf( fp,
"%d\n", MAX_INTENSITY );
263 nwrite = fwrite( cmap, 1, im_size, fp );
264 if ( nwrite != im_size )
265 plabort(
"pbm driver: Error writing pbm file" );
278 for ( i = 0; i < pls->
ylength; i++ )
279 for ( j = 0; j < pls->
xlength; j++ )
281 k = ( i * pls->
xlength + j ) * 3;
282 cmap[k + 0] = pls->
cmap0[0].
r;
283 cmap[k + 1] = pls->
cmap0[0].
g;
284 cmap[k + 2] = pls->
cmap0[0].
b;