瀏覽代碼

* All output plugins should now work again.

* Renamed caca_refresh() into caca_display() which makes more sense.
  * Optimised gl_bgpal by directly storing floats instead of doing the
    conversion at runtime.
  * Handle resizing in cucul_set_size() and try to keep as much information
    as possible from the previous canvas.
  * Moved most global variables into cucul_t or caca_t contexts.
  * Moved time.c into libcaca.
tags/v0.99.beta14
Sam Hocevar sam 19 年之前
父節點
當前提交
6d99c79d26
共有 31 個檔案被更改,包括 586 行新增591 行删除
  1. +2
    -11
      caca-config.in
  2. +1
    -1
      configure.ac
  3. +1
    -1
      examples/aafire.c
  4. +1
    -1
      examples/cacaball.c
  5. +1
    -1
      examples/cacamoir.c
  6. +1
    -1
      examples/cacaplas.c
  7. +3
    -3
      examples/cacaview.c
  8. +1
    -1
      src/Makefile.am
  9. +8
    -8
      src/bitmap.c
  10. +2
    -2
      src/box.c
  11. +27
    -16
      src/caca.c
  12. +1
    -1
      src/caca.h
  13. +56
    -3
      src/caca_internals.h
  14. +2
    -162
      src/char.c
  15. +2
    -2
      src/conic.c
  16. +90
    -14
      src/cucul.c
  17. +0
    -4
      src/cucul_internals.h
  18. +54
    -63
      src/event.c
  19. +2
    -2
      src/export.c
  20. +312
    -275
      src/graphics.c
  21. +2
    -2
      src/line.c
  22. +2
    -2
      src/math.c
  23. +2
    -2
      src/sprite.c
  24. +2
    -2
      src/time.c
  25. +2
    -2
      src/triangle.c
  26. +1
    -1
      test/colors.c
  27. +3
    -3
      test/demo.c
  28. +1
    -1
      test/dithering.c
  29. +2
    -2
      test/event.c
  30. +1
    -1
      test/hsv.c
  31. +1
    -1
      test/spritedit.c

+ 2
- 11
caca-config.in 查看文件

@@ -63,13 +63,9 @@ do
--ldflags)
echo_ldflags=yes
;;
@NEED_PIC_TRUE@ --libs)
@NEED_PIC_FALSE@ --libs | --plugin-libs)
--libs | --plugin-libs)
echo_libs=yes
;;
@NEED_PIC_TRUE@ --plugin-libs)
@NEED_PIC_TRUE@ echo_plugin_libs=yes
@NEED_PIC_TRUE@ ;;
*)
usage 1 1>&2
;;
@@ -109,11 +105,6 @@ fi

if test "$echo_libs" = "yes"
then
echo -L@libdir@ -lcaca @CACA_LIBS@
echo -L@libdir@ -lcucul -lcaca @CUCUL_LIBS@ @CACA_LIBS@
fi

@NEED_PIC_TRUE@if test "$echo_plugin_libs" = "yes"
@NEED_PIC_TRUE@then
@NEED_PIC_TRUE@ echo -L@libdir@ -lcaca_pic @CACA_LIBS@
@NEED_PIC_TRUE@fi


+ 1
- 1
configure.ac 查看文件

@@ -6,7 +6,7 @@ AC_PREREQ(2.50)
AC_CONFIG_AUX_DIR(autotools)
AC_CANONICAL_SYSTEM

AM_INIT_AUTOMAKE(libcaca, 0.9)
AM_INIT_AUTOMAKE(libcaca, 0.10)
AM_CONFIG_HEADER(config.h)

AM_PROG_CC_C_O


+ 1
- 1
examples/aafire.c 查看文件

@@ -236,7 +236,7 @@ paused:
cucul_draw_bitmap(qq, 0, 0,
cucul_get_width(qq) - 1, cucul_get_height(qq) - 1,
cucul_bitmap, bitmap);
caca_refresh(kk);
caca_display(kk);
/*XSIZ = caca_get_width() * 2;
YSIZ = caca_get_height() * 2 - 4;*/
#else


+ 1
- 1
examples/cacaball.c 查看文件

@@ -144,7 +144,7 @@ paused:
cucul_draw_bitmap(qq, 0, 0,
cucul_get_width(qq) - 1, cucul_get_height(qq) - 1,
cucul_bitmap, pixels + (METASIZE / 2) * (1 + XSIZ));
caca_refresh(kk);
caca_display(kk);
}

/* End, bye folks */


+ 1
- 1
examples/cacamoir.c 查看文件

@@ -103,7 +103,7 @@ paused:
cucul_draw_bitmap(qq, 0, 0,
cucul_get_width(qq) - 1, cucul_get_height(qq) - 1,
bitmap, screen);
caca_refresh(kk);
caca_display(kk);
}

end:


+ 1
- 1
examples/cacaplas.c 查看文件

@@ -113,7 +113,7 @@ paused:
cucul_draw_bitmap(qq, 0, 0,
cucul_get_width(qq) - 1, cucul_get_height(qq) - 1,
bitmap, screen);
caca_refresh(kk);
caca_display(kk);
}

end:


+ 3
- 3
examples/cacaview.c 查看文件

@@ -270,7 +270,7 @@ int main(int argc, char **argv)
}
else if(event == CACA_EVENT_RESIZE)
{
caca_refresh(kk);
caca_display(kk);
ww = cucul_get_width(qq);
wh = cucul_get_height(qq);
update = 1;
@@ -300,7 +300,7 @@ int main(int argc, char **argv)
buffer[ww] = '\0';
cucul_set_color(qq, CUCUL_COLOR_WHITE, CUCUL_COLOR_BLUE);
cucul_putstr(qq, (ww - strlen(buffer)) / 2, wh / 2, buffer);
caca_refresh(kk);
caca_display(kk);
ww = cucul_get_width(qq);
wh = cucul_get_height(qq);

@@ -394,7 +394,7 @@ int main(int argc, char **argv)
print_help(ww - 25, 2);
}

caca_refresh(kk);
caca_display(kk);
update = 0;
}



+ 1
- 1
src/Makefile.am 查看文件

@@ -17,7 +17,6 @@ libcucul_la_SOURCES = \
sprite.c \
bitmap.c \
export.c \
time.c \
$(NULL)
libcucul_la_LDFLAGS = -no-undefined
libcucul_la_LIBADD = @CUCUL_LIBS@
@@ -28,6 +27,7 @@ libcaca_la_SOURCES = \
caca_internals.h \
graphics.c \
event.c \
time.c \
$(NULL)
libcaca_la_LDFLAGS = -no-undefined
libcaca_la_LIBADD = libcucul.la @CACA_LIBS@


+ 8
- 8
src/bitmap.c 查看文件

@@ -1,6 +1,6 @@
/*
* libcaca ASCII-Art library
* Copyright (c) 2002, 2003 Sam Hocevar <sam@zoy.org>
* libcucul Unicode canvas library
* Copyright (c) 2002-2006 Sam Hocevar <sam@zoy.org>
* All Rights Reserved
*
* This library is free software; you can redistribute it and/or
@@ -832,12 +832,12 @@ static void increment_no_dither(void)
/*
* Ordered 2 dithering
*/
static unsigned int *ordered2_table;
static unsigned int const *ordered2_table;
static unsigned int ordered2_index;

static void init_ordered2_dither(int line)
{
static unsigned int dither2x2[] =
static unsigned int const dither2x2[] =
{
0x00, 0x80,
0xc0, 0x40,
@@ -864,12 +864,12 @@ static void increment_ordered2_dither(void)
-1, -6, -5, 2,
-2, -7, -8, 3,
4, -3, -4, -7};*/
static unsigned int *ordered4_table;
static unsigned int const *ordered4_table;
static unsigned int ordered4_index;

static void init_ordered4_dither(int line)
{
static unsigned int dither4x4[] =
static unsigned int const dither4x4[] =
{
0x00, 0x80, 0x20, 0xa0,
0xc0, 0x40, 0xe0, 0x60,
@@ -894,12 +894,12 @@ static void increment_ordered4_dither(void)
/*
* Ordered 8 dithering
*/
static unsigned int *ordered8_table;
static unsigned int const *ordered8_table;
static unsigned int ordered8_index;

static void init_ordered8_dither(int line)
{
static unsigned int dither8x8[] =
static unsigned int const dither8x8[] =
{
0x00, 0x80, 0x20, 0xa0, 0x08, 0x88, 0x28, 0xa8,
0xc0, 0x40, 0xe0, 0x60, 0xc8, 0x48, 0xe8, 0x68,


+ 2
- 2
src/box.c 查看文件

@@ -1,6 +1,6 @@
/*
* libcaca ASCII-Art library
* Copyright (c) 2002, 2003 Sam Hocevar <sam@zoy.org>
* libcucul Unicode canvas library
* Copyright (c) 2002-2006 Sam Hocevar <sam@zoy.org>
* All Rights Reserved
*
* This library is free software; you can redistribute it and/or


+ 27
- 16
src/caca.c 查看文件

@@ -1,6 +1,6 @@
/*
* libcaca ASCII-Art library
* Copyright (c) 2002, 2003 Sam Hocevar <sam@zoy.org>
* Copyright (c) 2002-2006 Sam Hocevar <sam@zoy.org>
* All Rights Reserved
*
* This library is free software; you can redistribute it and/or
@@ -166,22 +166,22 @@ caca_t * caca_attach(cucul_t * qq)
#if defined(USE_WIN32)
if(kk->driver == CACA_DRIVER_WIN32)
{
/* This call is allowed to fail in cas we already have a console */
/* This call is allowed to fail in case we already have a console */
AllocConsole();

win32_hin = GetStdHandle(STD_INPUT_HANDLE);
win32_hout = CreateFile("CONOUT$", GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
kk->win32.hin = GetStdHandle(STD_INPUT_HANDLE);
kk->win32.hout = CreateFile("CONOUT$", GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

if(win32_hout == INVALID_HANDLE_VALUE)
if(kk->win32.hout == INVALID_HANDLE_VALUE)
return NULL;

GetConsoleCursorInfo(win32_hout, &cci);
GetConsoleCursorInfo(kk->win32.hout, &cci);
cci.bVisible = FALSE;
SetConsoleCursorInfo(win32_hout, &cci);
SetConsoleCursorInfo(kk->win32.hout, &cci);

SetConsoleMode(win32_hout, ENABLE_MOUSE_INPUT);
SetConsoleMode(kk->win32.hout, ENABLE_MOUSE_INPUT);
}
else
#endif
@@ -196,9 +196,20 @@ caca_t * caca_attach(cucul_t * qq)
/* Dummy */
}

/* Initialise events stuff */
kk->events.key_timer.last_sec = 0;
kk->events.key_timer.last_usec = 0;
kk->events.last_key_ticks = 0;
kk->events.autorepeat_ticks = 0;
kk->events.last_key = 0;

qq->refcount++;
kk->qq = qq;

kk->timer.last_sec = 0;
kk->timer.last_usec = 0;
kk->lastticks = 0;

kk->resize = 0;
kk->resize_event = 0;

@@ -254,13 +265,13 @@ void caca_detach(caca_t *kk)
#if defined(USE_WIN32)
if(kk->driver == CACA_DRIVER_WIN32)
{
SetConsoleTextAttribute(win32_hout, FOREGROUND_INTENSITY
| FOREGROUND_RED
| FOREGROUND_GREEN
| FOREGROUND_BLUE);
SetConsoleTextAttribute(kk->win32.hout, FOREGROUND_INTENSITY
| FOREGROUND_RED
| FOREGROUND_GREEN
| FOREGROUND_BLUE);
cci.bVisible = TRUE;
SetConsoleCursorInfo(win32_hout, &cci);
CloseHandle(win32_hout);
SetConsoleCursorInfo(kk->win32.hout, &cci);
CloseHandle(kk->win32.hout);
}
else
#endif


+ 1
- 1
src/caca.h 查看文件

@@ -177,7 +177,7 @@ typedef struct caca_context caca_t;
caca_t * caca_attach(cucul_t *qq);
void caca_detach(caca_t *kk);
void caca_set_delay(caca_t *kk, unsigned int);
void caca_refresh(caca_t *kk);
void caca_display(caca_t *kk);
unsigned int caca_get_rendertime(caca_t *kk);
unsigned int caca_get_window_width(caca_t *kk);
unsigned int caca_get_window_height(caca_t *kk);


+ 56
- 3
src/caca_internals.h 查看文件

@@ -1,6 +1,6 @@
/*
* libcaca ASCII-Art library
* Copyright (c) 2002, 2003 Sam Hocevar <sam@zoy.org>
* Copyright (c) 2002-2006 Sam Hocevar <sam@zoy.org>
* All Rights Reserved
*
* This library is free software; you can redistribute it and/or
@@ -49,7 +49,6 @@ enum caca_driver
};

/* Timer structure */
#define CACA_TIMER_INITIALIZER { 0, 0 }
struct caca_timer
{
int last_sec, last_usec;
@@ -67,6 +66,18 @@ struct caca_context
int resize_event;

unsigned int delay, rendertime;
struct caca_timer timer;
int lastticks;

struct events
{
#if defined(USE_SLANG) || defined(USE_NCURSES)
struct caca_timer key_timer;
unsigned int last_key_ticks;
unsigned int autorepeat_ticks;
unsigned int last_key;
#endif
} events;

#if defined(USE_X11) && !defined(_DOXYGEN_SKIP_ME)
struct x11
@@ -83,10 +94,52 @@ struct caca_context
XFontStruct *font_struct;
int font_offset;
#if defined(HAVE_X11_XKBLIB_H)
Bool detect_autorepeat;
Bool autorepeat;
#endif
} x11;
#endif
#if defined(USE_NCURSES)
struct ncurses
{
int attr[16*16];
} ncurses;
#endif
#if defined(USE_CONIO)
struct conio
{
struct text_info ti;
char *screen;
} conio;
#endif
#if defined(USE_WIN32)
struct win32
{
HANDLE hin, hout;
HANDLE front, back;
CHAR_INFO *buffer;
} win32;
#endif
#if defined(USE_GL)
struct gl
{
int window;
unsigned int width, height;
float font_width, font_height;
float incx, incy;
int id[94];
unsigned char resized, bit;
unsigned char mouse_changed, mouse_clicked;
unsigned int mouse_x, mouse_y;
unsigned int mouse_button, mouse_state;

unsigned char key;
int special_key;
int new_width;
int new_height;

float sw, sh;
} gl;
#endif
};

/* Initialisation functions */


+ 2
- 162
src/char.c 查看文件

@@ -1,6 +1,6 @@
/*
* libcaca ASCII-Art library
* Copyright (c) 2002, 2003 Sam Hocevar <sam@zoy.org>
* libcucul Unicode canvas library
* Copyright (c) 2002-2006 Sam Hocevar <sam@zoy.org>
* All Rights Reserved
*
* This library is free software; you can redistribute it and/or
@@ -59,68 +59,6 @@ void cucul_set_color(cucul_t *qq, enum cucul_color fgcolor, enum cucul_color bgc

qq->fgcolor = fgcolor;
qq->bgcolor = bgcolor;

#if 0
switch(kk->driver)
{
#if defined(USE_SLANG)
case CACA_DRIVER_SLANG:

#if defined(OPTIMISE_SLANG_PALETTE)
/* If foreground == background, discard this colour pair. Functions
* such as cucul_putchar will print spaces instead of characters */
if(fgcolor != bgcolor)
qq->fgisbg = 0;
else
{
qq->fgisbg = 1;
if(fgcolor == CUCUL_COLOR_BLACK)
fgcolor = CUCUL_COLOR_WHITE;
else if(fgcolor == CUCUL_COLOR_WHITE
|| fgcolor <= CUCUL_COLOR_LIGHTGRAY)
fgcolor = CUCUL_COLOR_BLACK;
else
fgcolor = CUCUL_COLOR_WHITE;
}
#endif

#if defined(OPTIMISE_SLANG_PALETTE)
SLsmg_set_color(slang_assoc[fgcolor + 16 * bgcolor]);
#else
SLsmg_set_color(fgcolor + 16 * bgcolor);
#endif
break;
#endif
#if defined(USE_NCURSES)
case CACA_DRIVER_NCURSES:
attrset(ncurses_attr[fgcolor + 16 * bgcolor]);
break;
#endif
#if defined(USE_CONIO)
case CACA_DRIVER_CONIO:
textbackground(bgcolor);
textcolor(fgcolor);
break;
#endif
#if defined(USE_X11)
case CACA_DRIVER_X11:
/* Nothing to do */
break;
#endif
#if defined(USE_WIN32)
case CACA_DRIVER_WIN32:
/* Nothing to do */
break;
#endif
#if defined(USE_GL)
case CACA_DRIVER_GL:
/* Nothing to do */
break;
#endif
default:
break;
}
#endif
}

/** \brief Get the current foreground colour.
@@ -159,59 +97,12 @@ enum cucul_color cucul_get_bg_color(cucul_t *qq)
*/
void cucul_putchar(cucul_t *qq, int x, int y, char c)
{
#if defined(USE_CONIO)
char *data;
#endif
if(x < 0 || x >= (int)qq->width ||
y < 0 || y >= (int)qq->height)
return;

qq->chars[x + y * qq->width] = c;
qq->attr[x + y * qq->width] = (qq->bgcolor << 4) | qq->fgcolor;

#if 0
switch(kk->driver)
{
#if defined(USE_SLANG)
case CACA_DRIVER_SLANG:
SLsmg_gotorc(y, x);
#if defined(OPTIMISE_SLANG_PALETTE)
if(qq->fgisbg)
SLsmg_write_char(' ');
else
#endif
SLsmg_write_char(c);
break;
#endif
#if defined(USE_NCURSES)
case CACA_DRIVER_NCURSES:
move(y, x);
addch(c);
break;
#endif
#if defined(USE_CONIO)
case CACA_DRIVER_CONIO:
data = conio_screen + 2 * (x + y * qq->width);
data[0] = c;
data[1] = (qq->bgcolor << 4) | qq->fgcolor;
break;
#endif
#if defined(USE_X11)
case CACA_DRIVER_X11:
break;
#endif
#if defined(USE_WIN32)
case CACA_DRIVER_WIN32:
break;
#endif
#if defined(USE_GL)
case CACA_DRIVER_GL:
break;
#endif
default:
break;
}
#endif
}

/** \brief Print a string.
@@ -262,57 +153,6 @@ void cucul_putstr(cucul_t *qq, int x, int y, char const *s)
*charbuf++ = *t++;
*attrbuf++ = (qq->bgcolor << 4) | qq->fgcolor;
}

#if 0
switch(kk->driver)
{
#if defined(USE_SLANG)
case CACA_DRIVER_SLANG:
SLsmg_gotorc(y, x);
#if defined(OPTIMISE_SLANG_PALETTE)
if(qq->fgisbg)
SLsmg_write_string(qq->empty_line + qq->width - len);
else
#endif
{
union { char *ch; const char *constch; } u;
u.constch = s;
SLsmg_write_string(u.ch);
}
break;
#endif
#if defined(USE_NCURSES)
case CACA_DRIVER_NCURSES:
move(y, x);
addstr(s);
break;
#endif
#if defined(USE_CONIO)
case CACA_DRIVER_CONIO:
charbuf = conio_screen + 2 * (x + y * qq->width);
while(*s)
{
*charbuf++ = *s++;
*charbuf++ = (qq->bgcolor << 4) | qq->fgcolor;
}
break;
#endif
#if defined(USE_X11)
case CACA_DRIVER_X11:
break;
#endif
#if defined(USE_WIN32)
case CACA_DRIVER_WIN32:
break;
#endif
#if defined(USE_GL)
case CACA_DRIVER_GL:
break;
#endif
default:
break;
}
#endif
}

/** \brief Format a string.


+ 2
- 2
src/conic.c 查看文件

@@ -1,6 +1,6 @@
/*
* libcaca ASCII-Art library
* Copyright (c) 2002, 2003 Sam Hocevar <sam@zoy.org>
* libcucul Unicode canvas library
* Copyright (c) 2002-2006 Sam Hocevar <sam@zoy.org>
* All Rights Reserved
*
* This library is free software; you can redistribute it and/or


+ 90
- 14
src/cucul.c 查看文件

@@ -32,7 +32,7 @@ typedef unsigned char uint8_t;
#include "cucul.h"
#include "cucul_internals.h"

static void cucul_init_features(cucul_t *qq);
static void cucul_read_environment(cucul_t *qq);

/** \brief Initialise \e libcucul.
*
@@ -47,24 +47,20 @@ cucul_t * cucul_init(void)
{
cucul_t *qq = malloc(sizeof(cucul_t));

cucul_init_features(qq);
cucul_read_environment(qq);

qq->fgcolor = CUCUL_COLOR_LIGHTGRAY;
qq->bgcolor = CUCUL_COLOR_BLACK;
#if defined(OPTIMISE_SLANG_PALETTE)
qq->fgisbg = 0;
#endif

/* Initialise to a default size. If a graphic driver attaches to
* us before cucul_set_size is called, we'll adapt. */
/* Initialise to a default size. When a graphic driver attaches to
* us, we'll adapt to its size. */
qq->width = 80;
qq->height = 32;
qq->size_set = 0;

qq->chars = malloc(qq->width * qq->height * sizeof(uint8_t));
qq->attr = malloc(qq->width * qq->height * sizeof(uint8_t));

memset(qq->chars, 0, qq->width * qq->height * sizeof(uint8_t));
memset(qq->chars, ' ', qq->width * qq->height * sizeof(uint8_t));
memset(qq->attr, 0, qq->width * qq->height * sizeof(uint8_t));

qq->empty_line = malloc(qq->width + 1);
@@ -91,9 +87,89 @@ cucul_t * cucul_init(void)
*/
void cucul_set_size(cucul_t *qq, unsigned int width, unsigned int height)
{
unsigned int x, y, old_width, old_height, new_size, old_size;

old_width = qq->width;
old_height = qq->height;
old_size = old_width * old_height;

qq->width = width;
qq->height = height;
qq->size_set = 1;
new_size = width * height;

/* Step 1: if new area is bigger, resize the memory area now. */
if(new_size > old_size)
{
qq->chars = realloc(qq->chars, new_size * sizeof(uint8_t));
qq->attr = realloc(qq->attr, new_size * sizeof(uint8_t));
}

/* Step 2: move line data if necessary. */
if(width == old_width)
{
/* Width did not change, which means we do not need to move data. */
;
}
else if(width > old_width)
{
/* New width is bigger than old width, which means we need to
* copy lines starting from the bottom of the screen otherwise
* we will overwrite information. */
for(y = height < old_height ? height : old_height; y--; )
{
for(x = old_width; x--; )
{
qq->chars[y * width + x] = qq->chars[y * old_width + x];
qq->attr[y * width + x] = qq->attr[y * old_width + x];
}

/* Zero the end of the line */
memset(qq->chars + y * width + old_width, ' ',
width - old_width);
memset(qq->attr + y * width + old_width, 0,
width - old_width);
}
}
else
{
/* New width is smaller. Copy as many lines as possible. Ignore
* the first line, it is already in place. */
unsigned int lines = height < old_height ? height : old_height;

for(y = 1; y < lines; y++)
{
for(x = 0; x < width; x++)
{
qq->chars[y * width + x] = qq->chars[y * old_width + x];
qq->attr[y * width + x] = qq->attr[y * old_width + x];
}
}
}

/* Step 3: fill the bottom of the new screen if necessary. */
if(height > old_height)
{
/* Zero the bottom of the screen */
memset(qq->chars + old_height * width, ' ',
(height - old_height) * width);
}

/* Step 4: if new area is smaller, resize memory area now. */
if(new_size <= old_size)
{
qq->chars = realloc(qq->chars, new_size * sizeof(uint8_t));
qq->attr = realloc(qq->attr, new_size * sizeof(uint8_t));
}

/* Recompute the scratch line and the empty line */
if(width != old_width)
{
qq->empty_line = realloc(qq->empty_line, width + 1);
memset(qq->empty_line, ' ', width);
qq->empty_line[width] = '\0';

qq->scratch_line = realloc(qq->scratch_line, width + 1);
}
}

/** \brief Get the screen width.
@@ -120,7 +196,7 @@ unsigned int cucul_get_height(cucul_t *qq)

/** \brief Translate a colour index into the colour's name.
*
* This function translates a caca_color enum into a human-readable
* This function translates a cucul_color enum into a human-readable
* description string of the associated colour.
*
* \param color The colour value.
@@ -156,7 +232,7 @@ char const *cucul_get_color_name(enum cucul_color color)

/** \brief Get the current value of a feature.
*
* This function retrieves the value of an internal \e libcaca feature. A
* This function retrieves the value of an internal \e libcucul feature. A
* generic feature value is expected, such as CUCUL_ANTIALIASING.
*
* \param feature The requested feature.
@@ -181,7 +257,7 @@ enum cucul_feature cucul_get_feature(cucul_t *qq, enum cucul_feature feature)

/** \brief Set a feature.
*
* This function sets an internal \e libcaca feature such as the antialiasing
* This function sets an internal \e libcucul feature such as the antialiasing
* or dithering modes. If a specific feature such as CUCUL_DITHERING_RANDOM,
* cucul_set_feature() will set it immediately. If a generic feature is given
* instead, such as CUCUL_DITHERING, the default value will be used instead.
@@ -274,7 +350,7 @@ void cucul_end(cucul_t *qq)
* XXX: The following functions are local.
*/

static void cucul_init_features(cucul_t * qq)
static void cucul_read_environment(cucul_t * qq)
{
/* FIXME: if strcasecmp isn't available, use strcmp */
#if defined(HAVE_GETENV) && defined(HAVE_STRCASECMP)


+ 0
- 4
src/cucul_internals.h 查看文件

@@ -24,16 +24,12 @@ struct cucul_context
{
/* Context size */
unsigned int width, height;
int size_set;

uint8_t *chars, *attr;
uint8_t *empty_line, *scratch_line;

enum cucul_color fgcolor;
enum cucul_color bgcolor;
#if defined(OPTIMISE_SLANG_PALETTE)
int fgisbg;
#endif

/* Internal libcucul features */
enum cucul_feature background, antialiasing, dithering;


+ 54
- 63
src/event.c 查看文件

@@ -1,6 +1,6 @@
/*
* libcaca ASCII-Art library
* Copyright (c) 2002, 2003 Sam Hocevar <sam@zoy.org>
* Copyright (c) 2002-2006 Sam Hocevar <sam@zoy.org>
* All Rights Reserved
*
* This library is free software; you can redistribute it and/or
@@ -54,17 +54,8 @@ typedef unsigned char uint8_t;
#include <GL/gl.h>
#include <GL/glut.h>
#include <GL/freeglut_ext.h>
extern int gl_special_key;
extern unsigned char gl_key;
extern unsigned char gl_resized;
extern float gl_font_width;
extern float gl_font_height;
extern int gl_new_width;
extern int gl_new_height;
extern unsigned char gl_mouse_changed, gl_mouse_clicked;
extern unsigned int gl_mouse_x, gl_mouse_y;
extern unsigned int gl_mouse_button, gl_mouse_state;
#endif

#include "cucul.h"
#include "cucul_internals.h"
#include "caca.h"
@@ -189,10 +180,6 @@ unsigned int caca_get_mouse_y(caca_t *kk)
static unsigned int _get_next_event(caca_t *kk)
{
#if defined(USE_SLANG) || defined(USE_NCURSES)
static struct caca_timer key_timer = CACA_TIMER_INITIALIZER;
static unsigned int last_key_ticks = 0;
static unsigned int autorepeat_ticks = 0;
static unsigned int last_key = 0;
unsigned int ticks;
#endif
unsigned int event;
@@ -209,45 +196,47 @@ static unsigned int _get_next_event(caca_t *kk)

#if defined(USE_SLANG) || defined(USE_NCURSES)
/* Simulate long keypresses using autorepeat features */
ticks = _caca_getticks(&key_timer);
last_key_ticks += ticks;
autorepeat_ticks += ticks;
ticks = _caca_getticks(&kk->events.key_timer);
kk->events.last_key_ticks += ticks;
kk->events.autorepeat_ticks += ticks;

/* Handle autorepeat */
if(last_key && autorepeat_ticks > AUTOREPEAT_TRIGGER
&& autorepeat_ticks > AUTOREPEAT_THRESHOLD
&& autorepeat_ticks > AUTOREPEAT_RATE)
if(kk->events.last_key
&& kk->events.autorepeat_ticks > AUTOREPEAT_TRIGGER
&& kk->events.autorepeat_ticks > AUTOREPEAT_THRESHOLD
&& kk->events.autorepeat_ticks > AUTOREPEAT_RATE)
{
_push_event(event);
autorepeat_ticks -= AUTOREPEAT_RATE;
return CACA_EVENT_KEY_PRESS | last_key;
kk->events.autorepeat_ticks -= AUTOREPEAT_RATE;
return CACA_EVENT_KEY_PRESS | kk->events.last_key;
}

/* We are in autorepeat mode and the same key was just pressed, ignore
* this event and return the next one by calling ourselves. */
if(event == (CACA_EVENT_KEY_PRESS | last_key))
if(event == (CACA_EVENT_KEY_PRESS | kk->events.last_key))
{
last_key_ticks = 0;
kk->events.last_key_ticks = 0;
return _get_next_event(kk);
}

/* We are in autorepeat mode, but key has expired or a new key was
* pressed - store our event and return a key release event first */
if(last_key && (last_key_ticks > AUTOREPEAT_THRESHOLD
|| (event & CACA_EVENT_KEY_PRESS)))
if(kk->events.last_key
&& (kk->events.last_key_ticks > AUTOREPEAT_THRESHOLD
|| (event & CACA_EVENT_KEY_PRESS)))
{
_push_event(event);
event = CACA_EVENT_KEY_RELEASE | last_key;
last_key = 0;
event = CACA_EVENT_KEY_RELEASE | kk->events.last_key;
kk->events.last_key = 0;
return event;
}

/* A new key was pressed, enter autorepeat mode */
if(event & CACA_EVENT_KEY_PRESS)
{
last_key_ticks = 0;
autorepeat_ticks = 0;
last_key = event & 0x00ffffff;
kk->events.last_key_ticks = 0;
kk->events.autorepeat_ticks = 0;
kk->events.last_key = event & 0x00ffffff;
}

return event;
@@ -280,7 +269,8 @@ static unsigned int _lowlevel_event(caca_t *kk)
/* Expose event */
if(xevent.type == Expose)
{
XCopyArea(kk->x11.dpy, kk->x11.pixmap, kk->x11.window, kk->x11.gc, 0, 0,
XCopyArea(kk->x11.dpy, kk->x11.pixmap,
kk->x11.window, kk->x11.gc, 0, 0,
kk->qq->width * kk->x11.font_width,
kk->qq->height * kk->x11.font_height, 0, 0);
continue;
@@ -302,6 +292,7 @@ static unsigned int _lowlevel_event(caca_t *kk)
kk->x11.new_width = w;
kk->x11.new_height = h;

/* If we are already resizing, ignore the new signal */
if(kk->resize)
continue;

@@ -738,56 +729,56 @@ static unsigned int _lowlevel_event(caca_t *kk)
{
glutMainLoopEvent();

if(gl_resized && !kk->resize)
if(kk->gl.resized && !kk->resize)
{
kk->resize = 1;
gl_resized = 0;
kk->gl.resized = 0;
return CACA_EVENT_RESIZE;
}

if(gl_mouse_changed)
if(kk->gl.mouse_changed)
{
if(gl_mouse_clicked)
if(kk->gl.mouse_clicked)
{
event|= CACA_EVENT_MOUSE_PRESS | gl_mouse_button;
gl_mouse_clicked=0;
event|= CACA_EVENT_MOUSE_PRESS | kk->gl.mouse_button;
kk->gl.mouse_clicked=0;
}
mouse_x = gl_mouse_x;
mouse_y = gl_mouse_y;
mouse_x = kk->gl.mouse_x;
mouse_y = kk->gl.mouse_y;
event |= CACA_EVENT_MOUSE_MOTION | (mouse_x << 12) | mouse_y;
gl_mouse_changed = 0;
kk->gl.mouse_changed = 0;
}

if(gl_key != 0)
if(kk->gl.key != 0)
{
event |= CACA_EVENT_KEY_PRESS;
event |= gl_key;
gl_key = 0;
event |= kk->gl.key;
kk->gl.key = 0;
return event;
}

if(gl_special_key != 0)
if(kk->gl.special_key != 0)
{
event |= CACA_EVENT_KEY_PRESS;
switch(gl_special_key)
switch(kk->gl.special_key)
{
case GLUT_KEY_F1 : gl_special_key = 0; return event | CACA_KEY_F1;
case GLUT_KEY_F2 : gl_special_key = 0; return event | CACA_KEY_F2;
case GLUT_KEY_F3 : gl_special_key = 0; return event | CACA_KEY_F3;
case GLUT_KEY_F4 : gl_special_key = 0; return event | CACA_KEY_F4;
case GLUT_KEY_F5 : gl_special_key = 0; return event | CACA_KEY_F5;
case GLUT_KEY_F6 : gl_special_key = 0; return event | CACA_KEY_F6;
case GLUT_KEY_F7 : gl_special_key = 0; return event | CACA_KEY_F7;
case GLUT_KEY_F8 : gl_special_key = 0; return event | CACA_KEY_F8;
case GLUT_KEY_F9 : gl_special_key = 0; return event | CACA_KEY_F9;
case GLUT_KEY_F10: gl_special_key = 0; return event | CACA_KEY_F10;
case GLUT_KEY_F11: gl_special_key = 0; return event | CACA_KEY_F11;
case GLUT_KEY_F12: gl_special_key = 0; return event | CACA_KEY_F12;
case GLUT_KEY_LEFT : gl_special_key = 0; return event | CACA_KEY_LEFT;
case GLUT_KEY_RIGHT: gl_special_key = 0; return event | CACA_KEY_RIGHT;
case GLUT_KEY_UP : gl_special_key = 0; return event | CACA_KEY_UP;
case GLUT_KEY_DOWN : gl_special_key = 0; return event | CACA_KEY_DOWN;
case GLUT_KEY_F1 : kk->gl.special_key = 0; return event | CACA_KEY_F1;
case GLUT_KEY_F2 : kk->gl.special_key = 0; return event | CACA_KEY_F2;
case GLUT_KEY_F3 : kk->gl.special_key = 0; return event | CACA_KEY_F3;
case GLUT_KEY_F4 : kk->gl.special_key = 0; return event | CACA_KEY_F4;
case GLUT_KEY_F5 : kk->gl.special_key = 0; return event | CACA_KEY_F5;
case GLUT_KEY_F6 : kk->gl.special_key = 0; return event | CACA_KEY_F6;
case GLUT_KEY_F7 : kk->gl.special_key = 0; return event | CACA_KEY_F7;
case GLUT_KEY_F8 : kk->gl.special_key = 0; return event | CACA_KEY_F8;
case GLUT_KEY_F9 : kk->gl.special_key = 0; return event | CACA_KEY_F9;
case GLUT_KEY_F10: kk->gl.special_key = 0; return event | CACA_KEY_F10;
case GLUT_KEY_F11: kk->gl.special_key = 0; return event | CACA_KEY_F11;
case GLUT_KEY_F12: kk->gl.special_key = 0; return event | CACA_KEY_F12;
case GLUT_KEY_LEFT : kk->gl.special_key = 0; return event | CACA_KEY_LEFT;
case GLUT_KEY_RIGHT: kk->gl.special_key = 0; return event | CACA_KEY_RIGHT;
case GLUT_KEY_UP : kk->gl.special_key = 0; return event | CACA_KEY_UP;
case GLUT_KEY_DOWN : kk->gl.special_key = 0; return event | CACA_KEY_DOWN;
default: return CACA_EVENT_NONE;
}
}


+ 2
- 2
src/export.c 查看文件

@@ -1,6 +1,6 @@
/*
* libcaca ASCII-Art library
* Copyright (c) 2002, 2003 Sam Hocevar <sam@zoy.org>
* libcucul Unicode canvas library
* Copyright (c) 2002-2006 Sam Hocevar <sam@zoy.org>
* All Rights Reserved
*
* This library is free software; you can redistribute it and/or


+ 312
- 275
src/graphics.c
文件差異過大導致無法顯示
查看文件


+ 2
- 2
src/line.c 查看文件

@@ -1,6 +1,6 @@
/*
* libcaca ASCII-Art library
* Copyright (c) 2002, 2003 Sam Hocevar <sam@zoy.org>
* libcucul Unicode canvas library
* Copyright (c) 2002-2006 Sam Hocevar <sam@zoy.org>
* All Rights Reserved
*
* This library is free software; you can redistribute it and/or


+ 2
- 2
src/math.c 查看文件

@@ -1,6 +1,6 @@
/*
* libcaca ASCII-Art library
* Copyright (c) 2002, 2003 Sam Hocevar <sam@zoy.org>
* libcucul Unicode canvas library
* Copyright (c) 2002-2006 Sam Hocevar <sam@zoy.org>
* All Rights Reserved
*
* This library is free software; you can redistribute it and/or


+ 2
- 2
src/sprite.c 查看文件

@@ -1,6 +1,6 @@
/*
* libcaca ASCII-Art library
* Copyright (c) 2002, 2003 Sam Hocevar <sam@zoy.org>
* libcucul Unicode canvas library
* Copyright (c) 2002-2006 Sam Hocevar <sam@zoy.org>
* All Rights Reserved
*
* This library is free software; you can redistribute it and/or


+ 2
- 2
src/time.c 查看文件

@@ -1,6 +1,6 @@
/*
* libcaca ASCII-Art library
* Copyright (c) 2002, 2003, 2004 Sam Hocevar <sam@zoy.org>
* Copyright (c) 2002-2006 Sam Hocevar <sam@zoy.org>
* All Rights Reserved
*
* This library is free software; you can redistribute it and/or
@@ -52,7 +52,7 @@ unsigned int _caca_getticks(struct caca_timer *timer)
#if defined(HAVE_GETTIMEOFDAY)
struct timeval tv;
#elif defined(USE_WIN32)
static __int64 freq = -1;
static __int64 freq = -1; /* FIXME: can this move to caca_context? */
unsigned __int64 usec;
#endif
unsigned int ticks = 0;


+ 2
- 2
src/triangle.c 查看文件

@@ -1,6 +1,6 @@
/*
* libcaca ASCII-Art library
* Copyright (c) 2002, 2003 Sam Hocevar <sam@zoy.org>
* libcucul Unicode canvas library
* Copyright (c) 2002-2006 Sam Hocevar <sam@zoy.org>
* All Rights Reserved
*
* This library is free software; you can redistribute it and/or


+ 1
- 1
test/colors.c 查看文件

@@ -46,7 +46,7 @@ int main(int argc, char **argv)
}
}

caca_refresh(kk);
caca_display(kk);
caca_wait_event(kk, CACA_EVENT_KEY_PRESS);

caca_detach(kk);


+ 3
- 3
test/demo.c 查看文件

@@ -63,7 +63,7 @@ int main(int argc, char **argv)

/* Main menu */
display_menu();
caca_refresh(kk);
caca_display(kk);

/* Go ! */
while(!quit)
@@ -155,7 +155,7 @@ int main(int argc, char **argv)
cucul_set_color(qq, CUCUL_COLOR_RED, CUCUL_COLOR_BLACK);
cucul_putstr(qq, xmouse, ymouse, "|\\");
}
caca_refresh(kk);
caca_display(kk);
mouse = menu = 0;
}

@@ -168,7 +168,7 @@ int main(int argc, char **argv)
cucul_printf(qq, 4, 1, "[%i.%i fps]----",
1000000 / caca_get_rendertime(kk),
(10000000 / caca_get_rendertime(kk)) % 10);
caca_refresh(kk);
caca_display(kk);
}
}



+ 1
- 1
test/dithering.c 查看文件

@@ -121,7 +121,7 @@ int main(void)
(100 - y) * cucul_get_height(qq) / 100, ch);
}

caca_refresh(kk);
caca_display(kk);

while(!caca_get_event(kk, CACA_EVENT_KEY_PRESS));



+ 2
- 2
test/event.c 查看文件

@@ -45,7 +45,7 @@ int main(int argc, char **argv)
cucul_draw_line(qq, 0, h, cucul_get_width(qq) - 1, h, ' ');
cucul_putstr(qq, 0, h, "type \"quit\" to exit");

caca_refresh(kk);
caca_display(kk);

events = malloc(h * sizeof(int));
memset(events, 0, h * sizeof(int));
@@ -95,7 +95,7 @@ int main(int argc, char **argv)
for(i = 1; i < h && events[i]; i++)
print_event(0, i, events[i]);

caca_refresh(kk);
caca_display(kk);
}

/* Clean up */


+ 1
- 1
test/hsv.c 查看文件

@@ -50,7 +50,7 @@ int main(void)
bitmap, buffer);
cucul_free_bitmap(qq, bitmap);

caca_refresh(kk);
caca_display(kk);

while(!caca_get_event(kk, CACA_EVENT_KEY_PRESS));



+ 1
- 1
test/spritedit.c 查看文件

@@ -108,7 +108,7 @@ int main(int argc, char **argv)
/* Free sprite */
cucul_draw_sprite(qq, 20, 10, sprite, frame);

caca_refresh(kk);
caca_display(kk);
}

/* Clean up */


Loading…
取消
儲存