Explorar el Código

* src/:

+ Doxygenated public functions.
tags/v0.99.beta14
Sam Hocevar sam hace 21 años
padre
commit
36503f7b36
Se han modificado 11 ficheros con 353 adiciones y 5 borrados
  1. +40
    -0
      src/bitmap.c
  2. +29
    -0
      src/box.c
  3. +44
    -0
      src/caca.c
  4. +5
    -4
      src/caca.h
  5. +38
    -0
      src/conic.c
  6. +63
    -0
      src/graphics.c
  7. +5
    -0
      src/io.c
  8. +24
    -1
      src/line.c
  9. +14
    -0
      src/math.c
  10. +56
    -0
      src/sprite.c
  11. +35
    -0
      src/triangle.c

+ 40
- 0
src/bitmap.c Ver fichero

@@ -120,6 +120,19 @@ static void mask2shift(unsigned int mask, int *right, int *left)
*left = 12 - lshift;
}

/**
* \brief Create an internal bitmap object.
*
* \param bitmap The bitmap depth in bits per pixel.
* \param w The bitmap width in pixels.
* \param h The bitmap height in pixels.
* \param pitch The bitmap pitch in bytes.
* \param rmask The bitmask for red values.
* \param gmask The bitmask for green values.
* \param bmask The bitmask for blue values.
* \param amask The bitmask for alpha values.
* \return A bitmap object or NULL upon error.
*/
struct caca_bitmap *caca_create_bitmap(unsigned int bpp, unsigned int w,
unsigned int h, unsigned int pitch,
unsigned int rmask, unsigned int gmask,
@@ -174,6 +187,16 @@ struct caca_bitmap *caca_create_bitmap(unsigned int bpp, unsigned int w,
return bitmap;
}

/**
* \brief Set the palette of an 8bpp bitmap object.
*
* \param bpp The bitmap object.
* \param red An array of 256 red values.
* \param green An array of 256 green values.
* \param blue An array of 256 blue values.
* \param alpha An array of 256 alpha values.
* \return void
*/
void caca_set_bitmap_palette(struct caca_bitmap *bitmap,
unsigned int red[], unsigned int green[],
unsigned int blue[], unsigned int alpha[])
@@ -204,6 +227,12 @@ void caca_set_bitmap_palette(struct caca_bitmap *bitmap,
bitmap->has_alpha = has_alpha;
}

/**
* \brief Free the memory associated with a bitmap.
*
* \param bitmap The bitmap object to be freed.
* \return void
*/
void caca_free_bitmap(struct caca_bitmap *bitmap)
{
if(!bitmap)
@@ -298,6 +327,17 @@ static void rgb2hsv_default(int r, int g, int b, int *hue, int *sat, int *val)
}
}

/**
* \brief Draw a bitmap on the screen.
*
* \param x1 X coordinate of the upper-left corner of the drawing area.
* \param y1 Y coordinate of the upper-left corner of the drawing area.
* \param x2 X coordinate of the lower-right corner of the drawing area.
* \param y2 Y coordinate of the lower-right corner of the drawing area.
* \param bitmap The bitmap object to be drawn.
* \param pixels A pointer to the bitmap's pixels.
* \return void
*/
void caca_draw_bitmap(int x1, int y1, int x2, int y2,
const struct caca_bitmap *bitmap, void *pixels)
{


+ 29
- 0
src/box.c Ver fichero

@@ -34,6 +34,16 @@
#include "caca.h"
#include "caca_internals.h"

/**
* \brief Draw a box on the screen using the given character.
*
* \param x1 X coordinate of the upper-left corner of the box.
* \param y1 Y coordinate of the upper-left corner of the box.
* \param x2 X coordinate of the lower-right corner of the box.
* \param y2 Y coordinate of the lower-right corner of the box.
* \param c Character to draw the box outline with.
* \return void
*/
void caca_draw_box(int x1, int y1, int x2, int y2, char c)
{
caca_draw_line(x1, y1, x1, y2, c);
@@ -42,6 +52,15 @@ void caca_draw_box(int x1, int y1, int x2, int y2, char c)
caca_draw_line(x2, y1, x1, y1, c);
}

/**
* \brief Draw a thin box on the screen.
*
* \param x1 X coordinate of the upper-left corner of the box.
* \param y1 Y coordinate of the upper-left corner of the box.
* \param x2 X coordinate of the lower-right corner of the box.
* \param y2 Y coordinate of the lower-right corner of the box.
* \return void
*/
void caca_draw_thin_box(int x1, int y1, int x2, int y2)
{
int x, y, xmax, ymax;
@@ -95,6 +114,16 @@ void caca_draw_thin_box(int x1, int y1, int x2, int y2)
caca_putchar(x2, y2, '\'');
}

/**
* \brief Fill a box on the screen using the given character.
*
* \param x1 X coordinate of the upper-left corner of the box.
* \param y1 Y coordinate of the upper-left corner of the box.
* \param x2 X coordinate of the lower-right corner of the box.
* \param y2 Y coordinate of the lower-right corner of the box.
* \param c Character to fill the box with.
* \return void
*/
void caca_fill_box(int x1, int y1, int x2, int y2, char c)
{
int x, y, xmax, ymax;


+ 44
- 0
src/caca.c Ver fichero

@@ -57,6 +57,11 @@ static void caca_init_terminal(void);
static mmask_t oldmask;
#endif

/**
* \brief Initialise libcaca.
*
* \return 0 upon success, a non-zero value if an error occurs.
*/
int caca_init(void)
{
#if defined(USE_NCURSES)
@@ -125,16 +130,32 @@ int caca_init(void)
return 0;
}

/**
* \brief Get the screen width.
*
* \return The screen width, in character cells.
*/
unsigned int caca_get_width(void)
{
return _caca_width;
}

/**
* \brief Get the screen height.
*
* \return The screen height, in character cells.
*/
unsigned int caca_get_height(void)
{
return _caca_height;
}

/**
* \brief Translate a colour value into its name.
*
* \param color The colour value.
* \return A static string containing the colour's name.
*/
const char *caca_get_color_name(enum caca_color color)
{
static const char *color_names[] =
@@ -163,6 +184,12 @@ const char *caca_get_color_name(enum caca_color color)
return color_names[color];
}

/**
* \brief Get the current value of a feature.
*
* \param feature The requested feature.
* \return The current value of the feature.
*/
enum caca_feature caca_get_feature(enum caca_feature feature)
{
switch(feature)
@@ -179,6 +206,12 @@ enum caca_feature caca_get_feature(enum caca_feature feature)
}
}

/**
* \brief Set a feature.
*
* \param feature The wanted feature.
* \return void
*/
void caca_set_feature(enum caca_feature feature)
{
switch(feature)
@@ -212,6 +245,12 @@ void caca_set_feature(enum caca_feature feature)
}
}

/**
* \brief Translate a feature value into its name.
*
* \param feature The feature value.
* \return A static string containing the feature's name.
*/
const char *caca_get_feature_name(enum caca_feature feature)
{
switch(feature)
@@ -232,6 +271,11 @@ const char *caca_get_feature_name(enum caca_feature feature)
}
}

/**
* \brief Uninitialise libcaca.
*
* \return void
*/
void caca_end(void)
{
_caca_end_graphics();


+ 5
- 4
src/caca.h Ver fichero

@@ -226,9 +226,9 @@ void caca_clear(void);
* Graphics primitives
*/
void caca_draw_line(int, int, int, int, char);
void caca_draw_polyline(const int[], const int[], int, char);
void caca_draw_polyline(const int x[], const int y[], int, char);
void caca_draw_thin_line(int, int, int, int);
void caca_draw_thin_polyline(const int[], const int[], int);
void caca_draw_thin_polyline(const int x[], const int y[], int);

void caca_draw_circle(int, int, int, char);
void caca_draw_ellipse(int, int, int, int, char);
@@ -270,8 +270,9 @@ struct caca_bitmap *caca_create_bitmap(unsigned int, unsigned int,
unsigned int, unsigned int,
unsigned int, unsigned int,
unsigned int, unsigned int);
void caca_set_bitmap_palette(struct caca_bitmap *, unsigned int[],
unsigned int[], unsigned int[], unsigned int[]);
void caca_set_bitmap_palette(struct caca_bitmap *,
unsigned int r[], unsigned int g[],
unsigned int b[], unsigned int a[]);
void caca_draw_bitmap(int, int, int, int, const struct caca_bitmap *, void *);
void caca_free_bitmap(struct caca_bitmap *);



+ 38
- 0
src/conic.c Ver fichero

@@ -43,6 +43,15 @@ typedef unsigned char uint8_t;

static void ellipsepoints(int, int, int, int, char);

/**
* \brief Draw a circle on the screen using the given character.
*
* \param x Center X coordinate.
* \param y Center Y coordinate.
* \param r Circle radius.
* \param c Character to draw the circle outline with.
* \return void
*/
void caca_draw_circle(int x, int y, int r, char c)
{
int test, dx, dy;
@@ -57,6 +66,16 @@ void caca_draw_circle(int x, int y, int r, char c)
}
}

/**
* \brief Fill an ellipse on the screen using the given character.
*
* \param xo Center X coordinate.
* \param yo Center Y coordinate.
* \param a Ellipse X radius.
* \param b Ellipse Y radius.
* \param c Character to fill the ellipse with.
* \return void
*/
void caca_fill_ellipse(int xo, int yo, int a, int b, char c)
{
int d2;
@@ -102,6 +121,16 @@ void caca_fill_ellipse(int xo, int yo, int a, int b, char c)
}
}

/**
* \brief Draw an ellipse on the screen using the given character.
*
* \param xo Center X coordinate.
* \param yo Center Y coordinate.
* \param a Ellipse X radius.
* \param b Ellipse Y radius.
* \param c Character to draw the ellipse outline with.
* \return void
*/
void caca_draw_ellipse(int xo, int yo, int a, int b, char c)
{
int d2;
@@ -144,6 +173,15 @@ void caca_draw_ellipse(int xo, int yo, int a, int b, char c)
}
}

/**
* \brief Draw a thin ellipse on the screen.
*
* \param xo Center X coordinate.
* \param yo Center Y coordinate.
* \param a Ellipse X radius.
* \param b Ellipse Y radius.
* \return void
*/
void caca_draw_thin_ellipse(int xo, int yo, int a, int b)
{
/* FIXME: this is not correct */


+ 63
- 0
src/graphics.c Ver fichero

@@ -92,6 +92,13 @@ static unsigned int _caca_rendertime;
static enum caca_color _caca_fgcolor = CACA_COLOR_LIGHTGRAY;
static enum caca_color _caca_bgcolor = CACA_COLOR_BLACK;

/**
* \brief Set the default colour pair.
*
* \param fgcolor The desired foreground colour.
* \param bgcolor The desired background colour.
* \return void
*/
void caca_set_color(enum caca_color fgcolor, enum caca_color bgcolor)
{
if(fgcolor < 0 || fgcolor > 15 || bgcolor < 0 || bgcolor > 15)
@@ -111,16 +118,34 @@ void caca_set_color(enum caca_color fgcolor, enum caca_color bgcolor)
#endif
}

/**
* \brief Get the current foreground colour.
*
* \return The current foreground colour.
*/
enum caca_color caca_get_fg_color(void)
{
return _caca_fgcolor;
}

/**
* \brief Get the current background colour.
*
* \return The current background colour.
*/
enum caca_color caca_get_bg_color(void)
{
return _caca_bgcolor;
}

/**
* \brief Print a character at given coordinates.
*
* \param x The X coordinate of the character.
* \param y The Y coordinate of the character.
* \param c The character to print.
* \return void
*/
void caca_putchar(int x, int y, char c)
{
#if defined(USE_CONIO)
@@ -147,6 +172,14 @@ void caca_putchar(int x, int y, char c)
#endif
}

/**
* \brief Print a string at given coordinates.
*
* \param x The X coordinate of the string.
* \param y The Y coordinate of the string.
* \param s The string to print.
* \return void
*/
void caca_putstr(int x, int y, const char *s)
{
unsigned int len;
@@ -192,6 +225,15 @@ void caca_putstr(int x, int y, const char *s)
#endif
}

/**
* \brief Format a string at given coordinates.
*
* \param x The X coordinate of the string.
* \param y The Y coordinate of the string.
* \param format The format string to print.
* \param ... Arguments to the format string.
* \return void
*/
void caca_printf(int x, int y, const char *format, ...)
{
char tmp[BUFSIZ];
@@ -219,6 +261,11 @@ void caca_printf(int x, int y, const char *format, ...)
free(buf);
}

/**
* \brief Clear the screen.
*
* \return void
*/
void caca_clear(void)
{
enum caca_color oldfg = caca_get_fg_color();
@@ -418,11 +465,22 @@ int _caca_end_graphics(void)
return 0;
}

/**
* \brief Set the refresh delay.
*
* \param usec The refresh delay in microseconds.
* \return void
*/
void caca_set_delay(unsigned int usec)
{
_caca_delay = usec;
}

/**
* \brief Get the average rendering time.
*
* \return The render time in microseconds.
*/
unsigned int caca_get_rendertime(void)
{
return _caca_rendertime;
@@ -448,6 +506,11 @@ static unsigned int _caca_getticks(void)
return ticks;
}

/**
* \brief Flush pending changes and redraw the screen.
*
* \return void
*/
void caca_refresh(void)
{
#define IDLE_USEC 10000


+ 5
- 0
src/io.c Ver fichero

@@ -53,6 +53,11 @@ static unsigned int _read_key(void);
static unsigned int keybuf[KEY_BUFLEN + 1]; /* zero-terminated */
static int keys = 0;

/**
* \brief Get the next mouse or keyboard input event.
*
* \return The next event in the queue, or 0 if no event is pending.
*/
unsigned int caca_get_event(void)
{
unsigned int event = 0;


+ 24
- 1
src/line.c Ver fichero

@@ -76,6 +76,18 @@ void caca_draw_line(int x1, int y1, int x2, int y2, char c)
clip_line(&s);
}

/**
* \brief Draw a polyline on the screen using the given character and
* coordinate arrays. The first and last points are not connected,
* so in order to draw a polygon you need to specify the starting
* point at the end of the list as well.
*
* \param x Array of X coordinates. Must have \p n + 1 elements.
* \param y Array of Y coordinates. Must have \p n + 1 elements.
* \param n Number of lines to draw.
* \param c Character to draw the lines with.
* \return void
*/
void caca_draw_polyline(const int x[], const int y[], int n, char c)
{
int i;
@@ -113,6 +125,17 @@ void caca_draw_thin_line(int x1, int y1, int x2, int y2)
clip_line(&s);
}

/**
* \brief Draw a thin polyline on the screen using the given coordinate
* arrays and with ASCII art. The first and last points are not
* connected, so in order to draw a polygon you need to specify the
* starting point at the end of the list as well.
*
* \param x Array of X coordinates. Must have \p n + 1 elements.
* \param y Array of Y coordinates. Must have \p n + 1 elements.
* \param n Number of lines to draw.
* \return void
*/
void caca_draw_thin_polyline(const int x[], const int y[], int n)
{
int i;
@@ -195,7 +218,7 @@ static void clip_line(struct line* s)
*
* \param x X coordinate of the point.
* \param y Y coordinate of the point.
* \return b The clipping bits for the given point.
* \return The clipping bits for the given point.
*/
static uint8_t clip_bits(int x, int y)
{


+ 14
- 0
src/math.c Ver fichero

@@ -34,11 +34,25 @@
#include "caca.h"
#include "caca_internals.h"

/**
* \brief Generate a random integer within a range.
*
* \param min The lower bound of the integer range.
* \param max The upper bound of the integer range.
* \return A random integer comprised between \p min and \p max, inclusive.
*/
int caca_rand(int min, int max)
{
return min + (int)((1.0*(max-min+1)) * rand() / (RAND_MAX+1.0));
}

/**
* \brief Approximate a square root, using Newton's method to avoid
* costly floating point calculations.
*
* \param a A positive integer.
* \return The approximate square root of \p a.
*/
unsigned int caca_sqrt(unsigned int a)
{
if(a == 0)


+ 56
- 0
src/sprite.c Ver fichero

@@ -50,6 +50,12 @@ struct caca_sprite
struct caca_frame *frames;
};

/**
* \brief Allocate a sprite loaded from a file.
*
* \param file The filename.
* \return The sprite, or NULL if an error occured.
*/
struct caca_sprite *caca_load_sprite(const char *file)
{
char buf[BUFSIZ];
@@ -165,6 +171,12 @@ sprite_alloc_failed:
return NULL;
}

/**
* \brief Return the number of frames in a sprite.
*
* \param sprite The sprite.
* \return The number of frames.
*/
int caca_get_sprite_frames(const struct caca_sprite *sprite)
{
if(sprite == NULL)
@@ -173,6 +185,13 @@ int caca_get_sprite_frames(const struct caca_sprite *sprite)
return sprite->nf;
}

/**
* \brief Return the width of a sprite.
*
* \param sprite The sprite.
* \param f The frame index.
* \return The width of the given frame of the sprite.
*/
int caca_get_sprite_width(const struct caca_sprite *sprite, int f)
{
if(sprite == NULL)
@@ -184,6 +203,13 @@ int caca_get_sprite_width(const struct caca_sprite *sprite, int f)
return sprite->frames[f].w;
}

/**
* \brief Return the height of a sprite.
*
* \param sprite The sprite.
* \param f The frame index.
* \return The height of the given frame of the sprite.
*/
int caca_get_sprite_height(const struct caca_sprite *sprite, int f)
{
if(sprite == NULL)
@@ -195,6 +221,13 @@ int caca_get_sprite_height(const struct caca_sprite *sprite, int f)
return sprite->frames[f].h;
}

/**
* \brief Return the X coordinate of a sprite's handle.
*
* \param sprite The sprite.
* \param f The frame index.
* \return The X coordinate of the given frame's handle.
*/
int caca_get_sprite_dx(const struct caca_sprite *sprite, int f)
{
if(sprite == NULL)
@@ -206,6 +239,13 @@ int caca_get_sprite_dx(const struct caca_sprite *sprite, int f)
return sprite->frames[f].dx;
}

/**
* \brief Return the Y coordinate of a sprite's handle.
*
* \param sprite The sprite.
* \param f The frame index.
* \return The Y coordinate of the given frame's handle.
*/
int caca_get_sprite_dy(const struct caca_sprite *sprite, int f)
{
if(sprite == NULL)
@@ -217,6 +257,16 @@ int caca_get_sprite_dy(const struct caca_sprite *sprite, int f)
return sprite->frames[f].dy;
}

/**
* \brief Draw a sprite's specific frame at the given coordinates. If the
* frame does not exist, nothing is displayed.
*
* \param x The X coordinate.
* \param y The Y coordinate.
* \param sprite The sprite.
* \param f The frame index.
* \return void
*/
void caca_draw_sprite(int x, int y, const struct caca_sprite *sprite, int f)
{
int i, j;
@@ -251,6 +301,12 @@ void caca_draw_sprite(int x, int y, const struct caca_sprite *sprite, int f)
caca_set_color(oldfg, oldbg);
}

/**
* \brief Free the memory associated with a sprite.
*
* \param sprite The sprite to be freed.
* \return void
*/
void caca_free_sprite(struct caca_sprite *sprite)
{
int i;


+ 35
- 0
src/triangle.c Ver fichero

@@ -34,6 +34,18 @@
#include "caca.h"
#include "caca_internals.h"

/**
* \brief Draw a triangle on the screen using the given character.
*
* \param x1 X coordinate of the first point.
* \param y1 Y coordinate of the first point.
* \param x2 X coordinate of the second point.
* \param y2 Y coordinate of the second point.
* \param x3 X coordinate of the third point.
* \param y3 Y coordinate of the third point.
* \param c Character to draw the triangle outline with.
* \return void
*/
void caca_draw_triangle(int x1, int y1, int x2, int y2, int x3, int y3, char c)
{
caca_draw_line(x1, y1, x2, y2, c);
@@ -41,6 +53,17 @@ void caca_draw_triangle(int x1, int y1, int x2, int y2, int x3, int y3, char c)
caca_draw_line(x3, y3, x1, y1, c);
}

/**
* \brief Draw a thin triangle on the screen.
*
* \param x1 X coordinate of the first point.
* \param y1 Y coordinate of the first point.
* \param x2 X coordinate of the second point.
* \param y2 Y coordinate of the second point.
* \param x3 X coordinate of the third point.
* \param y3 Y coordinate of the third point.
* \return void
*/
void caca_draw_thin_triangle(int x1, int y1, int x2, int y2, int x3, int y3)
{
caca_draw_thin_line(x1, y1, x2, y2);
@@ -48,6 +71,18 @@ void caca_draw_thin_triangle(int x1, int y1, int x2, int y2, int x3, int y3)
caca_draw_thin_line(x3, y3, x1, y1);
}

/**
* \brief Fill a triangle on the screen using the given character.
*
* \param x1 X coordinate of the first point.
* \param y1 Y coordinate of the first point.
* \param x2 X coordinate of the second point.
* \param y2 Y coordinate of the second point.
* \param x3 X coordinate of the third point.
* \param y3 Y coordinate of the third point.
* \param c Character to fill the triangle with.
* \return void
*/
void caca_fill_triangle(int x1, int y1, int x2, int y2, int x3, int y3, char c)
{
int x, y, xa, xb, xmax, ymax;


Cargando…
Cancelar
Guardar