|
|
@@ -25,6 +25,9 @@ |
|
|
|
#include "caca.h" |
|
|
|
#include "caca_internals.h" |
|
|
|
|
|
|
|
static int draw_box(caca_canvas_t *cv, int x, int y, int w, int h, |
|
|
|
uint32_t const *chars); |
|
|
|
|
|
|
|
/** \brief Draw a box on the canvas using the given character. |
|
|
|
* |
|
|
|
* This function never fails. |
|
|
@@ -63,53 +66,12 @@ int caca_draw_box(caca_canvas_t *cv, int x, int y, int w, int h, uint32_t ch) |
|
|
|
*/ |
|
|
|
int caca_draw_thin_box(caca_canvas_t *cv, int x, int y, int w, int h) |
|
|
|
{ |
|
|
|
int i, j, xmax, ymax; |
|
|
|
|
|
|
|
int x2 = x + w - 1; |
|
|
|
int y2 = y + h - 1; |
|
|
|
|
|
|
|
if(x > x2) |
|
|
|
static uint32_t const ascii_chars[] = |
|
|
|
{ |
|
|
|
int tmp = x; |
|
|
|
x = x2; x2 = tmp; |
|
|
|
} |
|
|
|
|
|
|
|
if(y > y2) |
|
|
|
{ |
|
|
|
int tmp = y; |
|
|
|
y = y2; y2 = tmp; |
|
|
|
} |
|
|
|
|
|
|
|
xmax = cv->width - 1; |
|
|
|
ymax = cv->height - 1; |
|
|
|
|
|
|
|
if(x2 < 0 || y2 < 0 || x > xmax || y > ymax) |
|
|
|
return 0; |
|
|
|
|
|
|
|
/* Draw edges */ |
|
|
|
if(y >= 0) |
|
|
|
for(i = x < 0 ? 1 : x + 1; i < x2 && i < xmax; i++) |
|
|
|
caca_put_char(cv, i, y, '-'); |
|
|
|
|
|
|
|
if(y2 <= ymax) |
|
|
|
for(i = x < 0 ? 1 : x + 1; i < x2 && i < xmax; i++) |
|
|
|
caca_put_char(cv, i, y2, '-'); |
|
|
|
|
|
|
|
if(x >= 0) |
|
|
|
for(j = y < 0 ? 1 : y + 1; j < y2 && j < ymax; j++) |
|
|
|
caca_put_char(cv, x, j, '|'); |
|
|
|
|
|
|
|
if(x2 <= xmax) |
|
|
|
for(j = y < 0 ? 1 : y + 1; j < y2 && j < ymax; j++) |
|
|
|
caca_put_char(cv, x2, j, '|'); |
|
|
|
'-', '|', ',', '`', '.', '\'' |
|
|
|
}; |
|
|
|
|
|
|
|
/* Draw corners */ |
|
|
|
caca_put_char(cv, x, y, ','); |
|
|
|
caca_put_char(cv, x, y2, '`'); |
|
|
|
caca_put_char(cv, x2, y, '.'); |
|
|
|
caca_put_char(cv, x2, y2, '\''); |
|
|
|
|
|
|
|
return 0; |
|
|
|
return draw_box(cv, x, y, w, h, ascii_chars); |
|
|
|
} |
|
|
|
|
|
|
|
/** \brief Draw a box on the canvas using CP437 characters. |
|
|
@@ -124,6 +86,30 @@ int caca_draw_thin_box(caca_canvas_t *cv, int x, int y, int w, int h) |
|
|
|
* \return This function always returns 0. |
|
|
|
*/ |
|
|
|
int caca_draw_cp437_box(caca_canvas_t *cv, int x, int y, int w, int h) |
|
|
|
{ |
|
|
|
static uint32_t const cp437_chars[] = |
|
|
|
{ |
|
|
|
/* ─ │ ┌ └ ┐ ┘ */ |
|
|
|
0x2500, 0x2502, 0x250c, 0x2514, 0x2510, 0x2518 |
|
|
|
}; |
|
|
|
|
|
|
|
return draw_box(cv, x, y, w, h, cp437_chars); |
|
|
|
} |
|
|
|
|
|
|
|
/** \brief Fill a box on the canvas using the given character. |
|
|
|
* |
|
|
|
* This function never fails. |
|
|
|
* |
|
|
|
* \param cv The handle to the libcaca canvas. |
|
|
|
* \param x X coordinate of the upper-left corner of the box. |
|
|
|
* \param y Y coordinate of the upper-left corner of the box. |
|
|
|
* \param w Width of the box. |
|
|
|
* \param h Height of the box. |
|
|
|
* \param ch UTF-32 character to be used to draw the box. |
|
|
|
* \return This function always returns 0. |
|
|
|
*/ |
|
|
|
int caca_fill_box(caca_canvas_t *cv, int x, int y, int w, int h, |
|
|
|
uint32_t ch) |
|
|
|
{ |
|
|
|
int i, j, xmax, ymax; |
|
|
|
|
|
|
@@ -148,46 +134,24 @@ int caca_draw_cp437_box(caca_canvas_t *cv, int x, int y, int w, int h) |
|
|
|
if(x2 < 0 || y2 < 0 || x > xmax || y > ymax) |
|
|
|
return 0; |
|
|
|
|
|
|
|
/* Draw edges */ |
|
|
|
if(y >= 0) |
|
|
|
for(i = x < 0 ? 1 : x + 1; i < x2 && i < xmax; i++) |
|
|
|
caca_put_char(cv, i, y, 0x2500); /* ─ */ |
|
|
|
|
|
|
|
if(y2 <= ymax) |
|
|
|
for(i = x < 0 ? 1 : x + 1; i < x2 && i < xmax; i++) |
|
|
|
caca_put_char(cv, i, y2, 0x2500); /* ─ */ |
|
|
|
|
|
|
|
if(x >= 0) |
|
|
|
for(j = y < 0 ? 1 : y + 1; j < y2 && j < ymax; j++) |
|
|
|
caca_put_char(cv, x, j, 0x2502); /* │ */ |
|
|
|
|
|
|
|
if(x2 <= xmax) |
|
|
|
for(j = y < 0 ? 1 : y + 1; j < y2 && j < ymax; j++) |
|
|
|
caca_put_char(cv, x2, j, 0x2502); /* │ */ |
|
|
|
if(x < 0) x = 0; |
|
|
|
if(y < 0) y = 0; |
|
|
|
if(x2 > xmax) x2 = xmax; |
|
|
|
if(y2 > ymax) y2 = ymax; |
|
|
|
|
|
|
|
/* Draw corners */ |
|
|
|
caca_put_char(cv, x, y, 0x250c); /* ┌ */ |
|
|
|
caca_put_char(cv, x, y2, 0x2514); /* └ */ |
|
|
|
caca_put_char(cv, x2, y, 0x2510); /* ┐ */ |
|
|
|
caca_put_char(cv, x2, y2, 0x2518); /* ┘ */ |
|
|
|
for(j = y; j <= y2; j++) |
|
|
|
for(i = x; i <= x2; i++) |
|
|
|
caca_put_char(cv, i, j, ch); |
|
|
|
|
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
/** \brief Fill a box on the canvas using the given character. |
|
|
|
* |
|
|
|
* This function never fails. |
|
|
|
* |
|
|
|
* \param cv The handle to the libcaca canvas. |
|
|
|
* \param x X coordinate of the upper-left corner of the box. |
|
|
|
* \param y Y coordinate of the upper-left corner of the box. |
|
|
|
* \param w Width of the box. |
|
|
|
* \param h Height of the box. |
|
|
|
* \param ch UTF-32 character to be used to draw the box. |
|
|
|
* \return This function always returns 0. |
|
|
|
/* |
|
|
|
* XXX: The following functions are local. |
|
|
|
*/ |
|
|
|
int caca_fill_box(caca_canvas_t *cv, int x, int y, int w, int h, |
|
|
|
uint32_t ch) |
|
|
|
|
|
|
|
static int draw_box(caca_canvas_t *cv, int x, int y, int w, int h, |
|
|
|
uint32_t const *chars) |
|
|
|
{ |
|
|
|
int i, j, xmax, ymax; |
|
|
|
|
|
|
@@ -212,14 +176,28 @@ int caca_fill_box(caca_canvas_t *cv, int x, int y, int w, int h, |
|
|
|
if(x2 < 0 || y2 < 0 || x > xmax || y > ymax) |
|
|
|
return 0; |
|
|
|
|
|
|
|
if(x < 0) x = 0; |
|
|
|
if(y < 0) y = 0; |
|
|
|
if(x2 > xmax) x2 = xmax; |
|
|
|
if(y2 > ymax) y2 = ymax; |
|
|
|
/* Draw edges */ |
|
|
|
if(y >= 0) |
|
|
|
for(i = x < 0 ? 1 : x + 1; i < x2 && i < xmax; i++) |
|
|
|
caca_put_char(cv, i, y, chars[0]); |
|
|
|
|
|
|
|
for(j = y; j <= y2; j++) |
|
|
|
for(i = x; i <= x2; i++) |
|
|
|
caca_put_char(cv, i, j, ch); |
|
|
|
if(y2 <= ymax) |
|
|
|
for(i = x < 0 ? 1 : x + 1; i < x2 && i < xmax; i++) |
|
|
|
caca_put_char(cv, i, y2, chars[0]); |
|
|
|
|
|
|
|
if(x >= 0) |
|
|
|
for(j = y < 0 ? 1 : y + 1; j < y2 && j < ymax; j++) |
|
|
|
caca_put_char(cv, x, j, chars[1]); |
|
|
|
|
|
|
|
if(x2 <= xmax) |
|
|
|
for(j = y < 0 ? 1 : y + 1; j < y2 && j < ymax; j++) |
|
|
|
caca_put_char(cv, x2, j, chars[1]); |
|
|
|
|
|
|
|
/* Draw corners */ |
|
|
|
caca_put_char(cv, x, y, chars[2]); |
|
|
|
caca_put_char(cv, x, y2, chars[3]); |
|
|
|
caca_put_char(cv, x2, y, chars[4]); |
|
|
|
caca_put_char(cv, x2, y2, chars[5]); |
|
|
|
|
|
|
|
return 0; |
|
|
|
} |
|
|
|