11 Primitivas de dibujo



Excepto _putpixel(), todas estas rutinas son afectadas por el modo actual de dibujo y el área de recorte del bitmap destino.

void putpixel(BITMAP *bmp, int x, int y, int color);
Escribe un pixel en la posición especificada del bitmap, usando el modo de dibujo actual y el área de recorte del bitmap.

void _putpixel(BITMAP *bmp, int x, int y, unsigned char color);
Como putpixel(), pero más rápido porque está implementado como una función de ensamblador en línea. Esto no funcionará en modo-X o modos gráficos truecolor, no soporta áreas de recorte (¡se bloqueará si intenta dibujar fuera del bitmap!), e ignora el modo de dibujo. Modifica el registro %fs, por lo que no debería mezclar esta función con código que usa las funciones _farsetsel() y _farns*().

int getpixel(BITMAP *bmp, int x, int y);
Lee el pixel del punto x, y en el bitmap. Devuelve -1 si el punto está fuera del bitmap.

unsigned char _getpixel(BITMAP *bmp, int x, int y);
Versión en línea acelerada de getpixel(). Esto no funciona en modo-X o modos gráficos truecolor, y no soporta áreas de recorte, así que asegurese de que el punto está dentro del bitmap.

void vline(BITMAP *bmp, int x, int y1, int y2, int color);
Dibuja una línea vertical en el bitmap, desde (x, y1) hasta (x, y2).

void hline(BITMAP *bmp, int x1, int y, int x2, int color);
Dibuja una línea horizontal en el bitmap, desde (x1, y) hasta (x2, y).

void do_line(BITMAP *bmp, int x1, y1, x2, y2, int d, void (*proc)());
Calcula todos los puntos de una línea desde el punto (x1, y1) hasta (x2, y2), llamando la función *proc para cada pixel. A ésta función se le pasa una copia del parámetro bmp, la posición x e y, y el parámetro d, por lo que puede llamar la función putpixel().

void line(BITMAP *bmp, int x1, int y1, int x2, int y2, int color);
Dibuja una línea en el bitmap, desde (x1, y1) hasta (x2, y2).

void triangle(BITMAP *bmp, int x1, y1, x2, y2, x3, y3, int color);
Dibuja un triángulo relleno entre los tres puntos.

void polygon(BITMAP *bmp, int vertices, int *points, int color);
Dibuja un polígono relleno con un número arbitrario de vértices. Pase el número de vértices y un array que contenga series de puntos x e y (hasta un total del valor vertices*2).

void rect(BITMAP *bmp, int x1, int y1, int x2, int y2, int color);
Dibuja los bordes de un rectángulo con los dos puntos dados como esquinas opuestas.

void rectfill(BITMAP *bmp, int x1, int y1, int x2, int y2, int color);
Dibuja un rectángulo sólido con los dos puntos dados como esquinas opuestas.

void do_circle(BITMAP *bmp, int x, int y, int radius, int d, void (*proc)());
Calcula todos los puntos de un círculo alrededor de (x, y) con el radio r, llamando a la función *proc para cada pixel. A ésta función se le pasa una copia del parámetro bmp, la posición x e y, y el parámetro d, por lo que puede llamar la función putpixel().

void circle(BITMAP *bmp, int x, int y, int radius, int color);
Dibuja un círculo con el centro y radio especificados.

void circlefill(BITMAP *bmp, int x, int y, int radius, int color);
Dibuja un círculo relleno con el centro y radio especificados.

void do_ellipse(BITMAP *bmp, int x, y, int rx, ry, int d, void (*proc)());
Calcula todos los puntos de una elipse alrededor de (x, y) con el radio rx y ry, llamando a la función *proc por cada pixel. A ésta función se le pasa una copia del parámetro bmp, la posición x e y, y el parámetro d, por lo que puede llamar la función putpixel().

void ellipse(BITMAP *bmp, int x, int y, int rx, int ry, int color);
Dibuja una elipse con el centro y radio especificados.

void ellipsefill(BITMAP *bmp, int cx, int cy, int rx, int ry, int color);
Dibuja una elipse rellena con el centro y radio especificados.

void do_arc(BITMAP *bmp, int x, y, fixed a1, a2, int r, d, void (*proc)());
Calcula todos los puntos en un arco circular alrededor del punto (x, y) con radio r, llamando a la función proc por cada uno de ellos. A ésta se le pasará una copia del parámetro bmp, la posición x e y, y una copia del parámetro d, por lo que puede usar putpixel(). El arco será pintado en sentido antihorario empezando desde el ángulo a1 y terminando en a2. Estos valores deben ser especificados en fromato de punto fijo 16.16, siendo 256 un círculo total, 64 un ángulo derecho, etc. Cero comienza a la derecha del punto central, y valores mayores rotan en dirección antihoraria desde ahí.

void arc(BITMAP *bmp, int x, y, fixed ang1, ang2, int r, int color);
Dibuja un arco circular con centro radio r y centro x, y, en dirección antihoraria empezando desde el ángulo a1 y terminando en a2. Estos valores deben ser especificados en fromato de punto fijo 16.16, siendo 256 un círculo total, 64 un ángulo derecho, etc. Cero comienza a la derecha del punto central, y valores mayores rotan en dirección antihoraria desde ahí.

void calc_spline(int points[8], int npts, int *x, int *y);
Calcula una serie de puntos npts a lo largo de una curva bezier, almacenándolos en los arrays x e y. La curva bezier es especificada por los cuatro puntos de control x/y del array points: points[0] y points[1] contienen las coordenadas del primer punto de control, points[2] y points[3] son el segundo punto de control, etc. Los puntos de control 0 y 3 son los extremos de la curva, y los puntos 1 y 2 son las guías. La curva probablemente no pasará por los puntos 1 y 2, pero estos afectan a la forma de la curva entre los puntos 0 y 3 (las líneas p0-p1 y p2-p3 son tangentes de la curva bezier). La forma más fácil de imaginárselo es pensar que la curva empieza en p0 en la dirección de p1, pero gira de tal forma que llega a p3 desde la dirección de p2. Además de su rol de primitivas gráficas, las curvas bezier pueden ser útiles para construir caminos alrededor de una serie de puntos de control, como en ex23.c.

void spline(BITMAP *bmp, int points[8], int color);
Dibuja una curva bezier usando los cuatro puntos de control especificados en el array points.

void floodfill(BITMAP *bmp, int x, int y, int color);
Rellena un área cerrada, comenzando en el punto (x, y), con el color especificado.




Volver al Indice