- Timestamp:
- Aug 28, 2008, 11:43:56 PM (13 years ago)
- Location:
- libpipi/trunk/pipi
- Files:
-
- 1 deleted
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
libpipi/trunk/pipi/Makefile.am
r2793 r2795 45 45 paint_sources = \ 46 46 paint/floodfill.c \ 47 paint/line.c paint/ line_template.h paint/aline_template.h \47 paint/line.c paint/aline_template.h \ 48 48 paint/bezier.c \ 49 49 paint/tile.c -
libpipi/trunk/pipi/paint/line.c
r2788 r2795 29 29 #include <math.h> 30 30 31 32 31 #include "pipi.h" 33 32 #include "pipi_internals.h" 33 34 #if !defined TEMPLATE_FILE /* This file uses the template system */ 34 35 35 36 struct line … … 49 50 50 51 }; 52 53 #define TEMPLATE_FLAGS SET_FLAG_GRAY | SET_FLAG_8BIT 54 #define TEMPLATE_FILE "paint/line.c" 55 #include "pipi_template.h" 56 51 57 static void clip_line(pipi_image_t*, struct line*); 52 58 static uint8_t clip_bits(pipi_image_t*, int, int); 53 static void draw_aliased_line_u32(pipi_image_t*, struct line*);54 static void draw_aliased_line_gray(pipi_image_t *img, struct line* s);55 static void draw_aliased_line_float(pipi_image_t *img, struct line* s);56 59 static void draw_antialiased_line_float(pipi_image_t *img, struct line* s); 57 60 static void draw_antialiased_line_gray(pipi_image_t *img, struct line* s); 58 59 60 61 61 62 int pipi_draw_line(pipi_image_t *img , int x1, int y1, int x2, int y2, uint32_t c, int aa) … … 76 77 s.color32 = c; 77 78 s.buf_u32 = dstdata; 78 s.draw = draw_aliased_line_u32;79 s.draw = aliased_line_8bit; 79 80 } 80 81 else … … 93 94 float *dstdata; 94 95 dstdata = (float *)pipi_getpixels(img, PIPI_PIXELS_Y_F)->pixels; 95 s.colorf[0] = c/255.0f; /* XXX FIXME */96 s.colorf[0] = (c & 0xff) / 255.0f; /* XXX FIXME */ 96 97 s.buf_f = dstdata; 97 s.draw = aa==0? draw_aliased_line_gray:draw_antialiased_line_gray;98 s.draw = aa==0?aliased_line_gray:draw_antialiased_line_gray; 98 99 } 99 100 else … … 105 106 s.colorf[0] = (c&0x000000FF)/255.0f; /* XXX FIXME */ 106 107 s.buf_f = dstdata; 107 s.draw = aa==0? draw_aliased_line_float:draw_antialiased_line_float;108 s.draw = aa==0?aliased_line:draw_antialiased_line_float; 108 109 } 109 110 … … 127 128 s.color32 = c; 128 129 s.buf_u32 = dstdata; 129 s.draw = draw_aliased_line_u32;130 s.draw = aliased_line_8bit; 130 131 } 131 132 else … … 146 147 s.colorf[0] = c/255.0f; /* XXX FIXME */ 147 148 s.buf_f = dstdata; 148 s.draw = aa==0? draw_aliased_line_gray:draw_antialiased_line_gray;149 s.draw = aa==0?aliased_line_gray:draw_antialiased_line_gray; 149 150 } 150 151 else … … 156 157 s.colorf[2] = (c&0x000000FF)/255.0f; /* XXX FIXME */ 157 158 s.buf_f = dstdata; 158 s.draw = aa==0? draw_aliased_line_float:draw_antialiased_line_float;159 s.draw = aa==0?aliased_line:draw_antialiased_line_float; 159 160 img->last_modified = PIPI_PIXELS_RGBA_F; 160 161 } … … 171 172 } 172 173 173 174 175 176 177 174 /* 178 175 * XXX: The following functions are local. 179 176 */ 177 180 178 /* Generic Cohen-Sutherland line clipping function. */ 181 179 static void clip_line(pipi_image_t *img, struct line* s) … … 245 243 246 244 return b; 247 }248 249 250 251 /* Solid line drawing function, using Bresenham's mid-point line252 * scan-conversion algorithm. */253 static void draw_aliased_line_u32(pipi_image_t *img, struct line* s)254 {255 #undef ASSIGN256 #define ASSIGN(x, y, w) s->buf_u32[x+y*w] = s->color32;257 #include "line_template.h"258 }259 static void draw_aliased_line_float(pipi_image_t *img, struct line* s)260 {261 #undef ASSIGN262 #define ASSIGN(x, y, w) s->buf_f[(x*4)+y*(w*4)] = s->colorf[0]; \263 s->buf_f[1 + (x*4)+y*(w*4)] = s->colorf[1]; \264 s->buf_f[2 + (x*4)+y*(w*4)] = s->colorf[2];265 #include "line_template.h"266 }267 static void draw_aliased_line_gray(pipi_image_t *img, struct line* s)268 {269 #undef ASSIGN270 #define ASSIGN(x, y, w) s->buf_f[x+y*w] = s->colorf[0];271 #include "line_template.h"272 245 } 273 246 … … 315 288 #include "aline_template.h" 316 289 } 290 291 #else /* XXX: the following functions use the template system */ 292 293 /* Solid line drawing function, using Bresenham's mid-point line 294 * scan-conversion algorithm. */ 295 static void SUFFIX(aliased_line)(pipi_image_t *img, struct line* s) 296 { 297 int x1, y1, x2, y2; 298 int dx, dy; 299 int xinc, yinc; 300 301 x1 = s->x1; y1 = s->y1; x2 = s->x2; y2 = s->y2; 302 303 dx = abs(x2 - x1); 304 dy = abs(y2 - y1); 305 306 xinc = (x1 > x2) ? -1 : 1; 307 yinc = (y1 > y2) ? -1 : 1; 308 309 if(dx >= dy) 310 { 311 int dpr = dy << 1; 312 int dpru = dpr - (dx << 1); 313 int delta = dpr - dx; 314 315 for(; dx >= 0; dx--) 316 { 317 if(FLAG_GRAY) 318 { 319 if(FLAG_8BIT) 320 /* TODO */; 321 else 322 s->buf_f[x1 + y1 * img->w] = s->colorf[0]; 323 } 324 else 325 { 326 if(FLAG_8BIT) 327 s->buf_u32[x1 + y1 * img->w] = s->color32; 328 else 329 { 330 s->buf_f[4 * (y1 * img->w + x1)] = s->colorf[0]; 331 s->buf_f[4 * (y1 * img->w + x1) + 1] = s->colorf[1]; 332 s->buf_f[4 * (y1 * img->w + x1) + 2] = s->colorf[2]; 333 } 334 } 335 336 if(delta > 0) 337 { 338 x1 += xinc; 339 y1 += yinc; 340 delta += dpru; 341 } 342 else 343 { 344 x1 += xinc; 345 delta += dpr; 346 } 347 } 348 } 349 else 350 { 351 int dpr = dx << 1; 352 int dpru = dpr - (dy << 1); 353 int delta = dpr - dy; 354 355 for(; dy >= 0; dy--) 356 { 357 if(FLAG_GRAY) 358 { 359 if(FLAG_8BIT) 360 /* TODO */; 361 else 362 s->buf_f[x1 + y1 * img->w] = s->colorf[0]; 363 } 364 else 365 { 366 if(FLAG_8BIT) 367 s->buf_u32[x1 + y1 * img->w] = s->color32; 368 else 369 { 370 s->buf_f[4 * (y1 * img->w + x1)] = s->colorf[0]; 371 s->buf_f[4 * (y1 * img->w + x1) + 1] = s->colorf[1]; 372 s->buf_f[4 * (y1 * img->w + x1) + 2] = s->colorf[2]; 373 } 374 } 375 376 if(delta > 0) 377 { 378 x1 += xinc; 379 y1 += yinc; 380 delta += dpru; 381 } 382 else 383 { 384 y1 += yinc; 385 delta += dpr; 386 } 387 } 388 } 389 } 390 391 #endif 392
Note: See TracChangeset
for help on using the changeset viewer.