Changeset 2795 for libpipi/trunk


Ignore:
Timestamp:
Aug 28, 2008, 11:43:56 PM (12 years ago)
Author:
Sam Hocevar
Message:
  • line.c: convert the aliased line drawing to the template system.
Location:
libpipi/trunk/pipi
Files:
1 deleted
2 edited

Legend:

Unmodified
Added
Removed
  • libpipi/trunk/pipi/Makefile.am

    r2793 r2795  
    4545paint_sources = \
    4646        paint/floodfill.c \
    47         paint/line.c paint/line_template.h paint/aline_template.h \
     47        paint/line.c paint/aline_template.h \
    4848        paint/bezier.c \
    4949        paint/tile.c
  • libpipi/trunk/pipi/paint/line.c

    r2788 r2795  
    2929#include <math.h>
    3030
    31 
    3231#include "pipi.h"
    3332#include "pipi_internals.h"
     33
     34#if !defined TEMPLATE_FILE /* This file uses the template system */
    3435
    3536struct line
     
    4950
    5051};
     52
     53#define TEMPLATE_FLAGS SET_FLAG_GRAY | SET_FLAG_8BIT
     54#define TEMPLATE_FILE "paint/line.c"
     55#include "pipi_template.h"
     56
    5157static void clip_line(pipi_image_t*, struct line*);
    5258static 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);
    5659static void draw_antialiased_line_float(pipi_image_t *img, struct line* s);
    5760static void draw_antialiased_line_gray(pipi_image_t *img, struct line* s);
    58 
    59 
    6061
    6162int pipi_draw_line(pipi_image_t *img , int x1, int y1, int x2, int y2, uint32_t c, int aa)
     
    7677            s.color32 = c;
    7778            s.buf_u32 = dstdata;
    78             s.draw = draw_aliased_line_u32;
     79            s.draw = aliased_line_8bit;
    7980        }
    8081        else
     
    9394        float  *dstdata;
    9495        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 */
    9697        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;
    9899    }
    99100    else
     
    105106        s.colorf[0] = (c&0x000000FF)/255.0f;       /* XXX FIXME */
    106107        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;
    108109    }
    109110
     
    127128            s.color32 = c;
    128129            s.buf_u32 = dstdata;
    129             s.draw = draw_aliased_line_u32;
     130            s.draw = aliased_line_8bit;
    130131        }
    131132        else
     
    146147        s.colorf[0] = c/255.0f; /* XXX FIXME */
    147148        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;
    149150    }
    150151    else
     
    156157        s.colorf[2] = (c&0x000000FF)/255.0f; /* XXX FIXME */
    157158        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;
    159160        img->last_modified = PIPI_PIXELS_RGBA_F;
    160161    }
     
    171172}
    172173
    173 
    174 
    175 
    176 
    177174/*
    178175 * XXX: The following functions are local.
    179176 */
     177
    180178/* Generic Cohen-Sutherland line clipping function. */
    181179static void clip_line(pipi_image_t *img, struct line* s)
     
    245243
    246244    return b;
    247 }
    248 
    249 
    250 
    251 /* Solid line drawing function, using Bresenham's mid-point line
    252  * scan-conversion algorithm. */
    253 static void draw_aliased_line_u32(pipi_image_t *img, struct line* s)
    254 {
    255 #undef  ASSIGN
    256 #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  ASSIGN
    262 #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  ASSIGN
    270 #define ASSIGN(x, y, w) s->buf_f[x+y*w]     = s->colorf[0];
    271 #include "line_template.h"
    272245}
    273246
     
    315288#include "aline_template.h"
    316289}
     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. */
     295static 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.