From 0a06b0af5f43ac4e58a9abf953b3ae69cdde9ffb Mon Sep 17 00:00:00 2001 From: jylam Date: Wed, 27 Aug 2008 11:28:48 +0000 Subject: [PATCH] * Moved *line_template.c to .h files to avoid problems with autotools (sam) * Added antialiasing support to polylines * Ho, and previous commit (r2777) contains width/height/pitch accessors to pipi_image_t, too. LOL. git-svn-id: file:///srv/caca.zoy.org/var/lib/svn/libpipi/trunk@2778 92316355-f0b4-4df1-b90c-862c8a59935f --- .../{aline_template.c => aline_template.h} | 0 pipi/paint/line.c | 45 ++++++++++++++----- .../{line_template.c => line_template.h} | 0 pipi/pipi.h | 2 +- 4 files changed, 34 insertions(+), 13 deletions(-) rename pipi/paint/{aline_template.c => aline_template.h} (100%) rename pipi/paint/{line_template.c => line_template.h} (100%) diff --git a/pipi/paint/aline_template.c b/pipi/paint/aline_template.h similarity index 100% rename from pipi/paint/aline_template.c rename to pipi/paint/aline_template.h diff --git a/pipi/paint/line.c b/pipi/paint/line.c index 97d3cd2..08a0617 100644 --- a/pipi/paint/line.c +++ b/pipi/paint/line.c @@ -108,18 +108,39 @@ int pipi_draw_line(pipi_image_t *img , int x1, int y1, int x2, int y2, uint32_t int pipi_draw_polyline(pipi_image_t *img, int const x[], int const y[], - int n, uint32_t c) + int n, uint32_t c, int aa) { int i; struct line s; if(img->last_modified == PIPI_PIXELS_RGBA_C) { - uint32_t *dstdata; - dstdata = (uint32_t *)pipi_getpixels(img, PIPI_PIXELS_RGBA_C)->pixels; - s.color32 = c; - s.buf_u32 = dstdata; - s.draw = draw_aliased_line_u32; + if(!aa) + { + uint32_t *dstdata; + dstdata = (uint32_t *)pipi_getpixels(img, PIPI_PIXELS_RGBA_C)->pixels; + s.color32 = c; + s.buf_u32 = dstdata; + s.draw = draw_aliased_line_u32; + } + else + { + float *dstdata; + dstdata = (float *)pipi_getpixels(img, PIPI_PIXELS_RGBA_F)->pixels; + s.colorf[2] = ((c&0x00FF0000)>>16)/255.0f; /* XXX FIXME */ + s.colorf[1] = ((c&0x0000FF00)>>8)/255.0f; /* XXX FIXME */ + s.colorf[0] = (c&0x000000FF)/255.0f; /* XXX FIXME */ + s.buf_f = dstdata; + s.draw = draw_antialiased_line_float; + } + } + else if(img->last_modified == PIPI_PIXELS_Y_F) + { + float *dstdata; + dstdata = (float *)pipi_getpixels(img, PIPI_PIXELS_Y_F)->pixels; + s.colorf[0] = c/255.0f; /* XXX FIXME */ + s.buf_f = dstdata; + s.draw = aa==0?draw_aliased_line_gray:draw_antialiased_line_gray; } else { @@ -129,7 +150,7 @@ int pipi_draw_polyline(pipi_image_t *img, int const x[], int const y[], s.colorf[1] = (c&0x0000FF00)/255.0f; /* XXX FIXME */ s.colorf[2] = (c&0x000000FF)/255.0f; /* XXX FIXME */ s.buf_f = dstdata; - s.draw = draw_aliased_line_float; + s.draw = aa==0?draw_aliased_line_float:draw_antialiased_line_float; img->last_modified = PIPI_PIXELS_RGBA_F; } @@ -228,7 +249,7 @@ static void draw_aliased_line_u32(pipi_image_t *img, struct line* s) { #undef ASSIGN #define ASSIGN(x, y, w) s->buf_u32[x+y*w] = s->color32; -#include "line_template.c" +#include "line_template.h" } static void draw_aliased_line_float(pipi_image_t *img, struct line* s) { @@ -236,13 +257,13 @@ static void draw_aliased_line_float(pipi_image_t *img, struct line* s) #define ASSIGN(x, y, w) s->buf_f[(x*4)+y*(w*4)] = s->colorf[0]; \ s->buf_f[1 + (x*4)+y*(w*4)] = s->colorf[1]; \ s->buf_f[2 + (x*4)+y*(w*4)] = s->colorf[2]; -#include "line_template.c" +#include "line_template.h" } static void draw_aliased_line_gray(pipi_image_t *img, struct line* s) { #undef ASSIGN #define ASSIGN(x, y, w) s->buf_f[x+y*w] = s->colorf[0]; -#include "line_template.c" +#include "line_template.h" } /* Xiaolin Wu's line algorithm, as seen at http://portal.acm.org/citation.cfm?id=122734 */ @@ -265,7 +286,7 @@ static void draw_antialiased_line_float(pipi_image_t *img, struct line* s) (c*s->colorf[1]) + (1-c) * s->buf_f[(1+((int)(x)*4))+((int)(y))*(img->w*4)]; \ s->buf_f[(2+((int)(x)*4))+((int)(y))*(img->w*4)] = \ (c*s->colorf[2]) + (1-c) * s->buf_f[(2+((int)(x)*4))+((int)(y))*(img->w*4)]; -#include "aline_template.c" +#include "aline_template.h" } @@ -274,5 +295,5 @@ static void draw_antialiased_line_gray(pipi_image_t *img, struct line* s) #undef PLOT #define PLOT(x, y, c) s->buf_f[((int)(x))+((int)(y))*img->w] = \ (c*s->colorf[0]) + (1-c) * s->buf_f[((int)(x))+((int)(y))*img->w]; -#include "aline_template.c" +#include "aline_template.h" } diff --git a/pipi/paint/line_template.c b/pipi/paint/line_template.h similarity index 100% rename from pipi/paint/line_template.c rename to pipi/paint/line_template.h diff --git a/pipi/pipi.h b/pipi/pipi.h index 4dc9ca5..751b339 100644 --- a/pipi/pipi.h +++ b/pipi/pipi.h @@ -155,7 +155,7 @@ extern int pipi_flood_fill(pipi_image_t *, int, int, float, float, float, float); extern int pipi_draw_line(pipi_image_t *, int, int, int, int, uint32_t, int); extern int pipi_draw_polyline(pipi_image_t *, int const[], int const[], - int , uint32_t); + int , uint32_t, int); extern pipi_image_t *pipi_reduce(pipi_image_t *, int, double const *); extern pipi_image_t *pipi_dither_ediff(pipi_image_t *, pipi_image_t *,