Browse Source

* Introduce cucul_get_canvas_chars() and cucul_get_canvas_attrs() to avoid

direct cv->chars and cv->attrs access by display drivers.
tags/v0.99.beta14
Sam Hocevar sam 17 years ago
parent
commit
07b9891afa
14 changed files with 214 additions and 145 deletions
  1. +2
    -3
      caca/caca.c
  2. +21
    -18
      caca/driver_cocoa.m
  3. +11
    -10
      caca/driver_conio.c
  4. +14
    -11
      caca/driver_gl.c
  5. +14
    -12
      caca/driver_ncurses.c
  6. +3
    -3
      caca/driver_raw.c
  7. +18
    -15
      caca/driver_slang.c
  8. +13
    -12
      caca/driver_vga.c
  9. +28
    -23
      caca/driver_win32.c
  10. +37
    -28
      caca/driver_x11.c
  11. +10
    -7
      caca/event.c
  12. +3
    -3
      caca/graphics.c
  13. +38
    -0
      cucul/cucul.c
  14. +2
    -0
      cucul/cucul.h

+ 2
- 3
caca/caca.c View File

@@ -33,7 +33,6 @@
#endif #endif


#include "cucul.h" #include "cucul.h"
#include "cucul_internals.h"
#include "caca.h" #include "caca.h"
#include "caca_internals.h" #include "caca_internals.h"


@@ -129,8 +128,8 @@ caca_display_t * caca_create_display(cucul_canvas_t *cv)
dp->lastticks = 0; dp->lastticks = 0;


/* Mouse position */ /* Mouse position */
dp->mouse.x = dp->cv->width / 2;
dp->mouse.y = dp->cv->height / 2;
dp->mouse.x = cucul_get_canvas_width(dp->cv) / 2;
dp->mouse.y = cucul_get_canvas_height(dp->cv) / 2;


/* Resize events */ /* Resize events */
dp->resize.resized = 0; dp->resize.resized = 0;


+ 21
- 18
caca/driver_cocoa.m View File

@@ -23,10 +23,9 @@


#import <Cocoa/Cocoa.h> #import <Cocoa/Cocoa.h>


#include "cucul.h"
#include "caca.h" #include "caca.h"
#include "caca_internals.h" #include "caca_internals.h"
#include "cucul.h"
#include "cucul_internals.h"


//#define COCOA_DEBUG //#define COCOA_DEBUG


@@ -196,13 +195,14 @@ static BOOL s_quitting = NO;


- (void)resizeIfNeeded:(caca_display_t *)dp - (void)resizeIfNeeded:(caca_display_t *)dp
{ {
if( _w != dp->cv->width || _h != dp->cv->height
|| !_attrs || !_bkg_rects || !_bkg_colors)
if(_w != cucul_get_canvas_width(dp->cv)
|| _h != cucul_get_canvas_height(dp->cv)
|| !_attrs || !_bkg_rects || !_bkg_colors)
{ {
debug_log(@"%s resize to %ux%u", _cmd, _w, _h); debug_log(@"%s resize to %ux%u", _cmd, _w, _h);
_w = dp->cv->width;
_h = dp->cv->height;
_w = cucul_get_canvas_width(dp->cv);
_h = cucul_get_canvas_height(dp->cv);


if(_attrs) if(_attrs)
free(_attrs); free(_attrs);
@@ -216,8 +216,8 @@ static BOOL s_quitting = NO;
free(_bkg_colors); free(_bkg_colors);
_bkg_colors = malloc(_w * _h * sizeof(NSColor*)); _bkg_colors = malloc(_w * _h * sizeof(NSColor*));


[[self window] setContentSize: NSMakeSize(dp->cv->width * _font_rect.size.width,
dp->cv->height * _font_rect.size.height)];
[[self window] setContentSize: NSMakeSize(cucul_get_canvas_width(dp->cv) * _font_rect.size.width,
cucul_get_canvas_height(dp->cv) * _font_rect.size.height)];
} }
} }


@@ -228,8 +228,10 @@ static BOOL s_quitting = NO;
if(_attrs) if(_attrs)
{ {
_chars = _attrs + _w * _h; _chars = _attrs + _w * _h;
memcpy(_attrs, dp->cv->attrs, _w * _h * sizeof(uint32_t));
memcpy(_chars, dp->cv->chars, _w * _h * sizeof(uint32_t));
memcpy(_attrs, cucul_get_canvas_attrs(dp->cv),
_w * _h * sizeof(uint32_t));
memcpy(_chars, cucul_get_canvas_chars(dp->cv),
_w * _h * sizeof(uint32_t));


[self setNeedsDisplay:TRUE]; [self setNeedsDisplay:TRUE];
} }
@@ -570,8 +572,8 @@ static void create_first_window(caca_display_t *dp)
NSFont* font = [NSFont fontWithName:@"Monaco" size:10]; NSFont* font = [NSFont fontWithName:@"Monaco" size:10];
NSRect fontRect = [font boundingRectForFont]; NSRect fontRect = [font boundingRectForFont];
fontRect = NSMakeRect(0, 0, ceilf(fontRect.size.width), ceilf(fontRect.size.height)); fontRect = NSMakeRect(0, 0, ceilf(fontRect.size.width), ceilf(fontRect.size.height));
NSRect windowRect = NSMakeRect(20, 20, dp->cv->width * fontRect.size.width,
dp->cv->height * fontRect.size.height);
NSRect windowRect = NSMakeRect(20, 20, cucul_get_canvas_width(dp->cv) * fontRect.size.width,
cucul_get_canvas_height(dp->cv) * fontRect.size.height);
convert_NSRect(&windowRect); convert_NSRect(&windowRect);


CacaView* view = [[CacaView alloc] initWithFrame:windowRect]; CacaView* view = [[CacaView alloc] initWithFrame:windowRect];
@@ -824,8 +826,10 @@ static BOOL handle_mouse_event(caca_display_t *dp, struct caca_event *ev,


static int cocoa_init_graphics(caca_display_t *dp) static int cocoa_init_graphics(caca_display_t *dp)
{ {
debug_log(@"%s dp->cv: %ux%u", __PRETTY_FUNCTION__,
dp->cv->width, dp->cv->height);
unsigned int width = cucul_get_canvas_width(dp->cv);
unsigned int height = cucul_get_canvas_height(dp->cv);

debug_log(@"%s dp->cv: %ux%u", __PRETTY_FUNCTION__, width, height);


NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];


@@ -833,7 +837,6 @@ static int cocoa_init_graphics(caca_display_t *dp)
if(dp->drv.p == NULL) if(dp->drv.p == NULL)
return -1; return -1;


unsigned int width = dp->cv->width, height = dp->cv->height;
dp->resize.allow = 1; dp->resize.allow = 1;
cucul_set_canvas_size(dp->cv, width ? width : 80, height ? height : 32); cucul_set_canvas_size(dp->cv, width ? width : 80, height ? height : 32);
dp->resize.allow = 0; dp->resize.allow = 0;
@@ -855,7 +858,7 @@ static int cocoa_init_graphics(caca_display_t *dp)
static int cocoa_end_graphics(caca_display_t *dp) static int cocoa_end_graphics(caca_display_t *dp)
{ {
debug_log(@"%s dp->cv: %ux%u", __PRETTY_FUNCTION__, debug_log(@"%s dp->cv: %ux%u", __PRETTY_FUNCTION__,
dp->cv->width, dp->cv->height);
cucul_get_canvas_width(dp->cv), cucul_get_canvas_height(dp->cv));


NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
[dp->drv.p->window close]; [dp->drv.p->window close];
@@ -955,8 +958,8 @@ static int cocoa_get_event(caca_display_t *dp, struct caca_event *ev)
static void cocoa_handle_resize(caca_display_t *dp) static void cocoa_handle_resize(caca_display_t *dp)
{ {
debug_log(@"%s", __PRETTY_FUNCTION__); debug_log(@"%s", __PRETTY_FUNCTION__);
dp->resize.w = dp->cv->width;
dp->resize.h = dp->cv->height;
dp->resize.w = cucul_get_canvas_width(dp->cv);
dp->resize.h = cucul_get_canvas_height(dp->cv);
} }


static int cocoa_set_display_title(caca_display_t *dp, char const *title) static int cocoa_set_display_title(caca_display_t *dp, char const *title)


+ 11
- 10
caca/driver_conio.c View File

@@ -29,10 +29,9 @@


#include <stdlib.h> #include <stdlib.h>


#include "cucul.h"
#include "caca.h" #include "caca.h"
#include "caca_internals.h" #include "caca_internals.h"
#include "cucul.h"
#include "cucul_internals.h"


struct driver_private struct driver_private
{ {
@@ -71,7 +70,7 @@ static int conio_end_graphics(caca_display_t *dp)
_wscroll = 1; _wscroll = 1;
textcolor((enum COLORS)WHITE); textcolor((enum COLORS)WHITE);
textbackground((enum COLORS)BLACK); textbackground((enum COLORS)BLACK);
gotoxy(dp->cv->width, dp->cv->height);
gotoxy(cucul_get_canvas_width(dp->cv), cucul_get_canvas_height(dp->cv));
cputs("\r\n"); cputs("\r\n");
_setcursortype(_NORMALCURSOR); _setcursortype(_NORMALCURSOR);


@@ -89,23 +88,25 @@ static int conio_set_display_title(caca_display_t *dp, char const *title)
static unsigned int conio_get_display_width(caca_display_t const *dp) static unsigned int conio_get_display_width(caca_display_t const *dp)
{ {
/* Fallback to a 6x10 font */ /* Fallback to a 6x10 font */
return dp->cv->width * 6;
return cucul_get_canvas_width(dp->cv) * 6;
} }


static unsigned int conio_get_display_height(caca_display_t const *dp) static unsigned int conio_get_display_height(caca_display_t const *dp)
{ {
/* Fallback to a 6x10 font */ /* Fallback to a 6x10 font */
return dp->cv->height * 10;
return cucul_get_canvas_height(dp->cv) * 10;
} }


static void conio_display(caca_display_t *dp) static void conio_display(caca_display_t *dp)
{ {
char *screen = dp->drv.p->screen; char *screen = dp->drv.p->screen;
uint32_t *attrs = dp->cv->attrs;
uint32_t *chars = dp->cv->chars;
uint32_t const *chars = (uint32_t const *)cucul_get_canvas_chars(dp->cv);
uint32_t const *attrs = (uint32_t const *)cucul_get_canvas_attrs(dp->cv);
unsigned int width = cucul_get_canvas_width(dp->cv);
unsigned int height = cucul_get_canvas_height(dp->cv);
unsigned int n; unsigned int n;


for(n = dp->cv->height * dp->cv->width; n--; )
for(n = height * width; n--; )
{ {
char ch = cucul_utf32_to_cp437(*chars++); char ch = cucul_utf32_to_cp437(*chars++);
if(n && *chars == CUCUL_MAGIC_FULLWIDTH) if(n && *chars == CUCUL_MAGIC_FULLWIDTH)
@@ -129,8 +130,8 @@ static void conio_display(caca_display_t *dp)
static void conio_handle_resize(caca_display_t *dp) static void conio_handle_resize(caca_display_t *dp)
{ {
/* We know nothing about our window */ /* We know nothing about our window */
dp->resize.w = dp->cv->width;
dp->resize.h = dp->cv->height;
dp->resize.w = cucul_get_canvas_width(dp->cv);
dp->resize.h = cucul_get_canvas_height(dp->cv);
} }


static int conio_get_event(caca_display_t *dp, caca_privevent_t *ev) static int conio_get_event(caca_display_t *dp, caca_privevent_t *ev)


+ 14
- 11
caca/driver_gl.c View File

@@ -36,11 +36,10 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>


#include "caca.h"
#include "caca_internals.h"
#include "cucul.h" #include "cucul.h"
#include "cucul_internals.h" #include "cucul_internals.h"

#include "caca.h"
#include "caca_internals.h"


/* /*
* Global variables * Global variables
@@ -89,7 +88,8 @@ static int gl_init_graphics(caca_display_t *dp)
char const *geometry; char const *geometry;
char *argv[2] = { "", NULL }; char *argv[2] = { "", NULL };
char const * const * fonts; char const * const * fonts;
unsigned int width = dp->cv->width, height = dp->cv->height;
unsigned int width = cucul_get_canvas_width(dp->cv);
unsigned int height = cucul_get_canvas_height(dp->cv);
int argc = 1; int argc = 1;


dp->drv.p = malloc(sizeof(struct driver_private)); dp->drv.p = malloc(sizeof(struct driver_private));
@@ -123,8 +123,8 @@ static int gl_init_graphics(caca_display_t *dp)
dp->drv.p->font_width = cucul_get_font_width(dp->drv.p->f); dp->drv.p->font_width = cucul_get_font_width(dp->drv.p->f);
dp->drv.p->font_height = cucul_get_font_height(dp->drv.p->f); dp->drv.p->font_height = cucul_get_font_height(dp->drv.p->f);


dp->drv.p->width = dp->cv->width * dp->drv.p->font_width;
dp->drv.p->height = dp->cv->height * dp->drv.p->font_height;
dp->drv.p->width = cucul_get_canvas_width(dp->cv) * dp->drv.p->font_width;
dp->drv.p->height = cucul_get_canvas_height(dp->cv) * dp->drv.p->font_height;


#ifdef HAVE_GLUTCLOSEFUNC #ifdef HAVE_GLUTCLOSEFUNC
dp->drv.p->close = 0; dp->drv.p->close = 0;
@@ -211,6 +211,9 @@ static unsigned int gl_get_display_height(caca_display_t const *dp)


static void gl_display(caca_display_t *dp) static void gl_display(caca_display_t *dp)
{ {
uint32_t const *cvchars = (uint32_t const *)cucul_get_canvas_chars(dp->cv);
uint32_t const *cvattrs = (uint32_t const *)cucul_get_canvas_attrs(dp->cv);
unsigned int width = cucul_get_canvas_width(dp->cv);
unsigned int x, y, line; unsigned int x, y, line;


glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
@@ -219,7 +222,7 @@ static void gl_display(caca_display_t *dp)
line = 0; line = 0;
for(y = 0; y < dp->drv.p->height; y += dp->drv.p->font_height) for(y = 0; y < dp->drv.p->height; y += dp->drv.p->font_height)
{ {
uint32_t *attrs = dp->cv->attrs + line * dp->cv->width;
uint32_t const *attrs = cvattrs + line * width;


/* FIXME: optimise using stride */ /* FIXME: optimise using stride */
for(x = 0; x < dp->drv.p->width; x += dp->drv.p->font_width) for(x = 0; x < dp->drv.p->width; x += dp->drv.p->font_width)
@@ -249,8 +252,8 @@ static void gl_display(caca_display_t *dp)
line = 0; line = 0;
for(y = 0; y < dp->drv.p->height; y += dp->drv.p->font_height, line++) for(y = 0; y < dp->drv.p->height; y += dp->drv.p->font_height, line++)
{ {
uint32_t *attrs = dp->cv->attrs + line * dp->cv->width;
uint32_t *chars = dp->cv->chars + line * dp->cv->width;
uint32_t const *attrs = cvattrs + line * width;
uint32_t const *chars = cvchars + line * width;


for(x = 0; x < dp->drv.p->width; x += dp->drv.p->font_width, attrs++) for(x = 0; x < dp->drv.p->width; x += dp->drv.p->font_width, attrs++)
{ {
@@ -344,8 +347,8 @@ static int gl_get_event(caca_display_t *dp, caca_privevent_t *ev)
if(dp->resize.resized) if(dp->resize.resized)
{ {
ev->type = CACA_EVENT_RESIZE; ev->type = CACA_EVENT_RESIZE;
ev->data.resize.w = dp->cv->width;
ev->data.resize.h = dp->cv->height;
ev->data.resize.w = cucul_get_canvas_width(dp->cv);
ev->data.resize.h = cucul_get_canvas_height(dp->cv);
return 1; return 1;
} }




+ 14
- 12
caca/driver_ncurses.c View File

@@ -51,10 +51,9 @@
# include <termios.h> # include <termios.h>
#endif #endif


#include "cucul.h"
#include "caca.h" #include "caca.h"
#include "caca_internals.h" #include "caca_internals.h"
#include "cucul.h"
#include "cucul_internals.h"


/* /*
* Emulation for missing ACS_* in older curses * Emulation for missing ACS_* in older curses
@@ -331,27 +330,30 @@ static int ncurses_set_display_title(caca_display_t *dp, char const *title)
static unsigned int ncurses_get_display_width(caca_display_t const *dp) static unsigned int ncurses_get_display_width(caca_display_t const *dp)
{ {
/* Fallback to a 6x10 font */ /* Fallback to a 6x10 font */
return dp->cv->width * 6;
return cucul_get_canvas_width(dp->cv) * 6;
} }


static unsigned int ncurses_get_display_height(caca_display_t const *dp) static unsigned int ncurses_get_display_height(caca_display_t const *dp)
{ {
/* Fallback to a 6x10 font */ /* Fallback to a 6x10 font */
return dp->cv->height * 10;
return cucul_get_canvas_height(dp->cv) * 10;
} }


static void ncurses_display(caca_display_t *dp) static void ncurses_display(caca_display_t *dp)
{ {
uint32_t const *cvchars = (uint32_t const *)cucul_get_canvas_chars(dp->cv);
uint32_t const *cvattrs = (uint32_t const *)cucul_get_canvas_attrs(dp->cv);
unsigned int width = cucul_get_canvas_width(dp->cv);
unsigned int height = cucul_get_canvas_height(dp->cv);
int x, y; int x, y;
uint32_t *attrs = dp->cv->attrs;
uint32_t *chars = dp->cv->chars;
for(y = 0; y < (int)dp->cv->height; y++)

for(y = 0; y < (int)height; y++)
{ {
move(y, 0); move(y, 0);
for(x = dp->cv->width; x--; )
for(x = width; x--; )
{ {
attrset(dp->drv.p->attr[cucul_attr_to_ansi(*attrs++)]);
ncurses_write_utf32(*chars++);
attrset(dp->drv.p->attr[cucul_attr_to_ansi(*cvattrs++)]);
ncurses_write_utf32(*cvchars++);
} }
} }
@@ -382,8 +384,8 @@ static void ncurses_handle_resize(caca_display_t *dp)
#endif #endif


/* Fallback */ /* Fallback */
dp->resize.w = dp->cv->width;
dp->resize.h = dp->cv->height;
dp->resize.w = cucul_get_canvas_width(dp->cv);
dp->resize.h = cucul_get_canvas_height(dp->cv);
} }


static int ncurses_get_event(caca_display_t *dp, caca_privevent_t *ev) static int ncurses_get_event(caca_display_t *dp, caca_privevent_t *ev)


+ 3
- 3
caca/driver_raw.c View File

@@ -24,14 +24,14 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>


#include "cucul.h"
#include "caca.h" #include "caca.h"
#include "caca_internals.h" #include "caca_internals.h"
#include "cucul.h"
#include "cucul_internals.h"


static int raw_init_graphics(caca_display_t *dp) static int raw_init_graphics(caca_display_t *dp)
{ {
unsigned int width = dp->cv->width, height = dp->cv->height;
unsigned int width = cucul_get_canvas_width(dp->cv);
unsigned int height = cucul_get_canvas_height(dp->cv);
char const *geometry; char const *geometry;


#if defined(HAVE_GETENV) #if defined(HAVE_GETENV)


+ 18
- 15
caca/driver_slang.c View File

@@ -34,10 +34,9 @@
# include <signal.h> # include <signal.h>
#endif #endif


#include "cucul.h"
#include "caca.h" #include "caca.h"
#include "caca_internals.h" #include "caca_internals.h"
#include "cucul.h"
#include "cucul_internals.h"


/* /*
* Global variables * Global variables
@@ -198,26 +197,29 @@ static int slang_set_display_title(caca_display_t *dp, char const *title)
static unsigned int slang_get_display_width(caca_display_t const *dp) static unsigned int slang_get_display_width(caca_display_t const *dp)
{ {
/* Fallback to a 6x10 font */ /* Fallback to a 6x10 font */
return dp->cv->width * 6;
return cucul_get_canvas_width(dp->cv) * 6;
} }


static unsigned int slang_get_display_height(caca_display_t const *dp) static unsigned int slang_get_display_height(caca_display_t const *dp)
{ {
/* Fallback to a 6x10 font */ /* Fallback to a 6x10 font */
return dp->cv->height * 10;
return cucul_get_canvas_height(dp->cv) * 10;
} }


static void slang_display(caca_display_t *dp) static void slang_display(caca_display_t *dp)
{ {
uint32_t const *cvchars = (uint32_t const *)cucul_get_canvas_chars(dp->cv);
uint32_t const *cvattrs = (uint32_t const *)cucul_get_canvas_attrs(dp->cv);
unsigned int width = cucul_get_canvas_width(dp->cv);
unsigned int height = cucul_get_canvas_height(dp->cv);
int x, y; int x, y;
uint32_t *attrs = dp->cv->attrs;
uint32_t *chars = dp->cv->chars;
for(y = 0; y < (int)dp->cv->height; y++)

for(y = 0; y < (int)height; y++)
{ {
SLsmg_gotorc(y, 0); SLsmg_gotorc(y, 0);
for(x = dp->cv->width; x--; )
for(x = width; x--; )
{ {
uint32_t ch = *chars++;
uint32_t ch = *cvchars++;


#if defined(OPTIMISE_SLANG_PALETTE) #if defined(OPTIMISE_SLANG_PALETTE)
/* If foreground == background, just don't use this colour /* If foreground == background, just don't use this colour
@@ -226,8 +228,8 @@ static void slang_display(caca_display_t *dp)
* here for, and in cases where SLang does not render * here for, and in cases where SLang does not render
* bright backgrounds, it's just fucked up. */ * bright backgrounds, it's just fucked up. */
#if 0 #if 0
uint8_t fgcolor = cucul_attr_to_ansi_fg(*attrs);
uint8_t bgcolor = cucul_attr_to_ansi_bg(*attrs);
uint8_t fgcolor = cucul_attr_to_ansi_fg(*cvattrs);
uint8_t bgcolor = cucul_attr_to_ansi_bg(*cvattrs);


if(fgcolor >= 0x10) if(fgcolor >= 0x10)
fgcolor = CUCUL_LIGHTGRAY; fgcolor = CUCUL_LIGHTGRAY;
@@ -246,16 +248,16 @@ static void slang_display(caca_display_t *dp)
fgcolor = CUCUL_WHITE; fgcolor = CUCUL_WHITE;
SLsmg_set_color(slang_assoc[fgcolor + 16 * bgcolor]); SLsmg_set_color(slang_assoc[fgcolor + 16 * bgcolor]);
SLsmg_write_char(' '); SLsmg_write_char(' ');
attrs++;
cvattrs++;
} }
else else
#endif #endif
{ {
SLsmg_set_color(slang_assoc[cucul_attr_to_ansi(*attrs++)]);
SLsmg_set_color(slang_assoc[cucul_attr_to_ansi(*cvattrs++)]);
slang_write_utf32(ch); slang_write_utf32(ch);
} }
#else #else
SLsmg_set_color(cucul_attr_to_ansi(*attrs++));
SLsmg_set_color(cucul_attr_to_ansi(*cvattrs++));
slang_write_utf32(ch); slang_write_utf32(ch);
#endif #endif
} }
@@ -270,7 +272,8 @@ static void slang_handle_resize(caca_display_t *dp)
dp->resize.w = SLtt_Screen_Cols; dp->resize.w = SLtt_Screen_Cols;
dp->resize.h = SLtt_Screen_Rows; dp->resize.h = SLtt_Screen_Rows;


if(dp->resize.w != dp->cv->width || dp->resize.h != dp->cv->height)
if(dp->resize.w != cucul_get_canvas_width(dp->cv)
|| dp->resize.h != cucul_get_canvas_height(dp->cv))
SLsmg_reinit_smg(); SLsmg_reinit_smg();
} }




+ 13
- 12
caca/driver_vga.c View File

@@ -21,10 +21,9 @@


#if defined(USE_VGA) #if defined(USE_VGA)


#include "cucul.h"
#include "caca.h" #include "caca.h"
#include "caca_internals.h" #include "caca_internals.h"
#include "cucul.h"
#include "cucul_internals.h"


/* Address of the VGA screen */ /* Address of the VGA screen */
#define VGA_SCREEN ((char *)(intptr_t)0x000b8000) #define VGA_SCREEN ((char *)(intptr_t)0x000b8000)
@@ -118,31 +117,33 @@ static unsigned int vga_get_display_height(caca_display_t const *dp)
static void vga_display(caca_display_t *dp) static void vga_display(caca_display_t *dp)
{ {
char *screen = (char *)(intptr_t)0x000b8000; char *screen = (char *)(intptr_t)0x000b8000;
uint32_t *attrs = dp->cv->attrs;
uint32_t *chars = dp->cv->chars;
uint32_t const *cvchars = (uint32_t const *)cucul_get_canvas_chars(dp->cv);
uint32_t const *cvattrs = (uint32_t const *)cucul_get_canvas_attrs(dp->cv);
unsigned int width = cucul_get_canvas_width(dp->cv);
unsigned int height = cucul_get_canvas_height(dp->cv);
int n; int n;


for(n = dp->cv->height * dp->cv->width; n--; )
for(n = height * width; n--; )
{ {
char ch = cucul_utf32_to_cp437(*chars++);
if(n && *chars == CUCUL_MAGIC_FULLWIDTH)
char ch = cucul_utf32_to_cp437(*cvchars++);
if(n && *cvchars == CUCUL_MAGIC_FULLWIDTH)
{ {
*screen++ = '['; *screen++ = '[';
*screen++ = cucul_attr_to_ansi(*attrs++);
*screen++ = cucul_attr_to_ansi(*cvattrs++);
ch = ']'; ch = ']';
chars++;
cvchars++;
n--; n--;
} }
*screen++ = ch; *screen++ = ch;
*screen++ = cucul_attr_to_ansi(*attrs++);
*screen++ = cucul_attr_to_ansi(*cvattrs++);
} }
} }


static void vga_handle_resize(caca_display_t *dp) static void vga_handle_resize(caca_display_t *dp)
{ {
/* We know nothing about our window */ /* We know nothing about our window */
dp->resize.w = dp->cv->width;
dp->resize.h = dp->cv->height;
dp->resize.w = cucul_get_canvas_width(dp->cv);
dp->resize.h = cucul_get_canvas_height(dp->cv);
} }


static int vga_get_event(caca_display_t *dp, caca_privevent_t *ev) static int vga_get_event(caca_display_t *dp, caca_privevent_t *ev)


+ 28
- 23
caca/driver_win32.c View File

@@ -26,10 +26,9 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>


#include "cucul.h"
#include "caca.h" #include "caca.h"
#include "caca_internals.h" #include "caca_internals.h"
#include "cucul.h"
#include "cucul_internals.h"


/* /*
* Global variables * Global variables
@@ -84,6 +83,8 @@ struct driver_private


static int win32_init_graphics(caca_display_t *dp) static int win32_init_graphics(caca_display_t *dp)
{ {
unsigned int width = cucul_get_canvas_width(dp->cv);
unsigned int height = cucul_get_canvas_height(dp->cv);
CONSOLE_SCREEN_BUFFER_INFO csbi; CONSOLE_SCREEN_BUFFER_INFO csbi;
SMALL_RECT rect; SMALL_RECT rect;
COORD size; COORD size;
@@ -113,13 +114,13 @@ static int win32_init_graphics(caca_display_t *dp)
return -1; return -1;


/* Set the new console size */ /* Set the new console size */
size.X = dp->cv->width ? dp->cv->width : 80;
size.Y = dp->cv->height ? dp->cv->height : 25;
size.X = width ? width : 80;
size.Y = height ? height : 25;
SetConsoleScreenBufferSize(dp->drv.p->screen, size); SetConsoleScreenBufferSize(dp->drv.p->screen, size);


rect.Left = rect.Top = 0; rect.Left = rect.Top = 0;
rect.Right = dp->cv->width - 1;
rect.Bottom = dp->cv->height - 1;
rect.Right = size.X - 1;
rect.Bottom = size.Y - 1;
SetConsoleWindowInfo(dp->drv.p->screen, TRUE, &rect); SetConsoleWindowInfo(dp->drv.p->screen, TRUE, &rect);


/* Report our new size to libcucul */ /* Report our new size to libcucul */
@@ -130,6 +131,8 @@ static int win32_init_graphics(caca_display_t *dp)
cucul_set_canvas_size(dp->cv, cucul_set_canvas_size(dp->cv,
csbi.srWindow.Right - csbi.srWindow.Left + 1, csbi.srWindow.Right - csbi.srWindow.Left + 1,
csbi.srWindow.Bottom - csbi.srWindow.Top + 1); csbi.srWindow.Bottom - csbi.srWindow.Top + 1);
width = cucul_get_canvas_width(dp->cv);
height = cucul_get_canvas_height(dp->cv);
dp->resize.allow = 0; dp->resize.allow = 0;


SetConsoleMode(dp->drv.p->screen, 0); SetConsoleMode(dp->drv.p->screen, 0);
@@ -141,7 +144,7 @@ static int win32_init_graphics(caca_display_t *dp)


SetConsoleActiveScreenBuffer(dp->drv.p->screen); SetConsoleActiveScreenBuffer(dp->drv.p->screen);


dp->drv.p->buffer = malloc(dp->cv->width * dp->cv->height
dp->drv.p->buffer = malloc(width * height
* sizeof(CHAR_INFO)); * sizeof(CHAR_INFO));
if(dp->drv.p->buffer == NULL) if(dp->drv.p->buffer == NULL)
return -1; return -1;
@@ -178,7 +181,7 @@ static unsigned int win32_get_display_width(caca_display_t const *dp)
/* FIXME */ /* FIXME */


/* Fallback to a 6x10 font */ /* Fallback to a 6x10 font */
return dp->cv->width * 6;
return cucul_get_canvas_width(dp->cv) * 6;
} }


static unsigned int win32_get_display_height(caca_display_t const *dp) static unsigned int win32_get_display_height(caca_display_t const *dp)
@@ -186,7 +189,7 @@ static unsigned int win32_get_display_height(caca_display_t const *dp)
/* FIXME */ /* FIXME */


/* Fallback to a 6x10 font */ /* Fallback to a 6x10 font */
return dp->cv->height * 10;
return cucul_get_canvas_height(dp->cv) * 10;
} }


static void win32_display(caca_display_t *dp) static void win32_display(caca_display_t *dp)
@@ -194,16 +197,18 @@ static void win32_display(caca_display_t *dp)
COORD size, pos; COORD size, pos;
SMALL_RECT rect; SMALL_RECT rect;
CHAR_INFO *buffer = dp->drv.p->buffer; CHAR_INFO *buffer = dp->drv.p->buffer;
uint32_t *attrs = dp->cv->attrs;
uint32_t *chars = dp->cv->chars;
uint32_t const *cvchars = (uint32_t const *)cucul_get_canvas_chars(dp->cv);
uint32_t const *cvattrs = (uint32_t const *)cucul_get_canvas_attrs(dp->cv);
unsigned int width = cucul_get_canvas_width(dp->cv);
unsigned int height = cucul_get_canvas_height(dp->cv);
unsigned int n; unsigned int n;


/* Render everything to our screen buffer */ /* Render everything to our screen buffer */
for(n = dp->cv->height * dp->cv->width; n--; )
for(n = height * width; n--; )
{ {
uint32_t ch = *chars++;
uint8_t fg = cucul_attr_to_ansi_fg(*attrs);
uint8_t bg = cucul_attr_to_ansi_bg(*attrs);
uint32_t ch = *cvchars++;
uint8_t fg = cucul_attr_to_ansi_fg(*cvattrs);
uint8_t bg = cucul_attr_to_ansi_bg(*cvattrs);


#if 0 #if 0
if(ch > 0x00000020 && ch < 0x00000080) if(ch > 0x00000020 && ch < 0x00000080)
@@ -211,7 +216,7 @@ static void win32_display(caca_display_t *dp)
else else
dp->drv.p->buffer[i].Char.AsciiChar = ' '; dp->drv.p->buffer[i].Char.AsciiChar = ' ';
#else #else
if(n && *chars == CUCUL_MAGIC_FULLWIDTH)
if(n && *cvchars == CUCUL_MAGIC_FULLWIDTH)
; ;
else if(ch > 0x00000020 && ch < 0x00010000) else if(ch > 0x00000020 && ch < 0x00010000)
buffer->Char.UnicodeChar = (uint16_t)ch; buffer->Char.UnicodeChar = (uint16_t)ch;
@@ -221,17 +226,17 @@ static void win32_display(caca_display_t *dp)


buffer->Attributes = win32_fg_palette[fg < 0x10 ? fg : CUCUL_LIGHTGRAY] buffer->Attributes = win32_fg_palette[fg < 0x10 ? fg : CUCUL_LIGHTGRAY]
| win32_bg_palette[bg < 0x10 ? bg : CUCUL_BLACK]; | win32_bg_palette[bg < 0x10 ? bg : CUCUL_BLACK];
attrs++;
cvattrs++;
buffer++; buffer++;
} }


/* Blit the screen buffer */ /* Blit the screen buffer */
size.X = dp->cv->width;
size.Y = dp->cv->height;
size.X = width;
size.Y = height;
pos.X = pos.Y = 0; pos.X = pos.Y = 0;
rect.Left = rect.Top = 0; rect.Left = rect.Top = 0;
rect.Right = dp->cv->width - 1;
rect.Bottom = dp->cv->height - 1;
rect.Right = width - 1;
rect.Bottom = height - 1;
#if 0 #if 0
WriteConsoleOutput(dp->drv.p->screen, dp->drv.p->buffer, size, pos, &rect); WriteConsoleOutput(dp->drv.p->screen, dp->drv.p->buffer, size, pos, &rect);
#else #else
@@ -242,8 +247,8 @@ static void win32_display(caca_display_t *dp)
static void win32_handle_resize(caca_display_t *dp) static void win32_handle_resize(caca_display_t *dp)
{ {
/* FIXME: I don't know what to do here. */ /* FIXME: I don't know what to do here. */
dp->resize.w = dp->cv->width;
dp->resize.h = dp->cv->height;
dp->resize.w = cucul_get_canvas_width(dp->cv);
dp->resize.h = cucul_get_canvas_height(dp->cv);
} }


static int win32_get_event(caca_display_t *dp, caca_privevent_t *ev) static int win32_get_event(caca_display_t *dp, caca_privevent_t *ev)


+ 37
- 28
caca/driver_x11.c View File

@@ -33,10 +33,10 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>


#include "caca.h"
#include "caca_internals.h"
#include "cucul.h" #include "cucul.h"
#include "cucul_internals.h" #include "cucul_internals.h"
#include "caca.h"
#include "caca_internals.h"


/* /*
* Local functions * Local functions
@@ -77,7 +77,8 @@ static int x11_init_graphics(caca_display_t *dp)
int (*old_error_handler)(Display *, XErrorEvent *); int (*old_error_handler)(Display *, XErrorEvent *);
char const *fonts[] = { NULL, "8x13bold", "fixed" }, **parser; char const *fonts[] = { NULL, "8x13bold", "fixed" }, **parser;
char const *geometry; char const *geometry;
unsigned int width = dp->cv->width, height = dp->cv->height;
unsigned int width = cucul_get_canvas_width(dp->cv);
unsigned int height = cucul_get_canvas_height(dp->cv);
int i; int i;


dp->drv.p = malloc(sizeof(struct driver_private)); dp->drv.p = malloc(sizeof(struct driver_private));
@@ -90,6 +91,8 @@ static int x11_init_graphics(caca_display_t *dp)


dp->resize.allow = 1; dp->resize.allow = 1;
cucul_set_canvas_size(dp->cv, width ? width : 80, height ? height : 32); cucul_set_canvas_size(dp->cv, width ? width : 80, height ? height : 32);
width = cucul_get_canvas_width(dp->cv);
height = cucul_get_canvas_height(dp->cv);
dp->resize.allow = 0; dp->resize.allow = 0;


dp->drv.p->dpy = XOpenDisplay(NULL); dp->drv.p->dpy = XOpenDisplay(NULL);
@@ -192,8 +195,8 @@ static int x11_init_graphics(caca_display_t *dp)


dp->drv.p->window = dp->drv.p->window =
XCreateWindow(dp->drv.p->dpy, DefaultRootWindow(dp->drv.p->dpy), 0, 0, XCreateWindow(dp->drv.p->dpy, DefaultRootWindow(dp->drv.p->dpy), 0, 0,
dp->cv->width * dp->drv.p->font_width,
dp->cv->height * dp->drv.p->font_height,
width * dp->drv.p->font_width,
height * dp->drv.p->font_height,
0, 0, InputOutput, 0, 0, 0, InputOutput, 0,
CWBackingStore | CWBackPixel | CWEventMask, CWBackingStore | CWBackPixel | CWEventMask,
&x11_winattr); &x11_winattr);
@@ -240,10 +243,10 @@ static int x11_init_graphics(caca_display_t *dp)
XSync(dp->drv.p->dpy, False); XSync(dp->drv.p->dpy, False);


dp->drv.p->pixmap = XCreatePixmap(dp->drv.p->dpy, dp->drv.p->window, dp->drv.p->pixmap = XCreatePixmap(dp->drv.p->dpy, dp->drv.p->window,
dp->cv->width * dp->drv.p->font_width,
dp->cv->height * dp->drv.p->font_height,
DefaultDepth(dp->drv.p->dpy,
DefaultScreen(dp->drv.p->dpy)));
width * dp->drv.p->font_width,
height * dp->drv.p->font_height,
DefaultDepth(dp->drv.p->dpy,
DefaultScreen(dp->drv.p->dpy)));
dp->drv.p->pointer = None; dp->drv.p->pointer = None;


dp->drv.p->cursor_flags = 0; dp->drv.p->cursor_flags = 0;
@@ -278,29 +281,33 @@ static int x11_set_display_title(caca_display_t *dp, char const *title)


static unsigned int x11_get_display_width(caca_display_t const *dp) static unsigned int x11_get_display_width(caca_display_t const *dp)
{ {
return dp->cv->width * dp->drv.p->font_width;
return cucul_get_canvas_width(dp->cv) * dp->drv.p->font_width;
} }


static unsigned int x11_get_display_height(caca_display_t const *dp) static unsigned int x11_get_display_height(caca_display_t const *dp)
{ {
return dp->cv->height * dp->drv.p->font_height;
return cucul_get_canvas_height(dp->cv) * dp->drv.p->font_height;
} }


static void x11_display(caca_display_t *dp) static void x11_display(caca_display_t *dp)
{ {
uint32_t const *cvchars = (uint32_t const *)cucul_get_canvas_chars(dp->cv);
uint32_t const *cvattrs = (uint32_t const *)cucul_get_canvas_attrs(dp->cv);
unsigned int width = cucul_get_canvas_width(dp->cv);
unsigned int height = cucul_get_canvas_height(dp->cv);
unsigned int x, y, len; unsigned int x, y, len;


/* First draw the background colours. Splitting the process in two /* First draw the background colours. Splitting the process in two
* loops like this is actually slightly faster. */ * loops like this is actually slightly faster. */
for(y = 0; y < dp->cv->height; y++)
for(y = 0; y < height; y++)
{ {
for(x = 0; x < dp->cv->width; x += len)
for(x = 0; x < width; x += len)
{ {
uint32_t *attrs = dp->cv->attrs + x + y * dp->cv->width;
uint32_t const *attrs = cvattrs + x + y * width;
uint16_t bg = _cucul_attr_to_rgb12bg(*attrs); uint16_t bg = _cucul_attr_to_rgb12bg(*attrs);


len = 1; len = 1;
while(x + len < dp->cv->width
while(x + len < width
&& _cucul_attr_to_rgb12bg(attrs[len]) == bg) && _cucul_attr_to_rgb12bg(attrs[len]) == bg)
len++; len++;


@@ -315,14 +322,14 @@ static void x11_display(caca_display_t *dp)
} }


/* Then print the foreground characters */ /* Then print the foreground characters */
for(y = 0; y < dp->cv->height; y++)
for(y = 0; y < height; y++)
{ {
unsigned int yoff = (y + 1) * dp->drv.p->font_height unsigned int yoff = (y + 1) * dp->drv.p->font_height
- dp->drv.p->font_offset; - dp->drv.p->font_offset;
uint32_t *chars = dp->cv->chars + y * dp->cv->width;
uint32_t *attrs = dp->cv->attrs + y * dp->cv->width;
uint32_t const *chars = cvchars + y * width;
uint32_t const *attrs = cvattrs + y * width;


for(x = 0; x < dp->cv->width; x++, chars++, attrs++)
for(x = 0; x < width; x++, chars++, attrs++)
{ {
XSetForeground(dp->drv.p->dpy, dp->drv.p->gc, XSetForeground(dp->drv.p->dpy, dp->drv.p->gc,
dp->drv.p->colors[_cucul_attr_to_rgb12fg(*attrs)]); dp->drv.p->colors[_cucul_attr_to_rgb12fg(*attrs)]);
@@ -348,8 +355,8 @@ static void x11_display(caca_display_t *dp)


XCopyArea(dp->drv.p->dpy, dp->drv.p->pixmap, dp->drv.p->window, XCopyArea(dp->drv.p->dpy, dp->drv.p->pixmap, dp->drv.p->window,
dp->drv.p->gc, 0, 0, dp->drv.p->gc, 0, 0,
dp->cv->width * dp->drv.p->font_width,
dp->cv->height * dp->drv.p->font_height,
width * dp->drv.p->font_width,
height * dp->drv.p->font_height,
0, 0); 0, 0);
XFlush(dp->drv.p->dpy); XFlush(dp->drv.p->dpy);
} }
@@ -373,6 +380,8 @@ static void x11_handle_resize(caca_display_t *dp)


static int x11_get_event(caca_display_t *dp, caca_privevent_t *ev) static int x11_get_event(caca_display_t *dp, caca_privevent_t *ev)
{ {
unsigned int width = cucul_get_canvas_width(dp->cv);
unsigned int height = cucul_get_canvas_height(dp->cv);
XEvent xevent; XEvent xevent;
char key; char key;


@@ -386,8 +395,8 @@ static int x11_get_event(caca_display_t *dp, caca_privevent_t *ev)
{ {
XCopyArea(dp->drv.p->dpy, dp->drv.p->pixmap, XCopyArea(dp->drv.p->dpy, dp->drv.p->pixmap,
dp->drv.p->window, dp->drv.p->gc, 0, 0, dp->drv.p->window, dp->drv.p->gc, 0, 0,
dp->cv->width * dp->drv.p->font_width,
dp->cv->height * dp->drv.p->font_height, 0, 0);
width * dp->drv.p->font_width,
height * dp->drv.p->font_height, 0, 0);
continue; continue;
} }


@@ -401,7 +410,7 @@ static int x11_get_event(caca_display_t *dp, caca_privevent_t *ev)
h = (xevent.xconfigure.height + dp->drv.p->font_height / 3) h = (xevent.xconfigure.height + dp->drv.p->font_height / 3)
/ dp->drv.p->font_height; / dp->drv.p->font_height;


if(!w || !h || (w == dp->cv->width && h == dp->cv->height))
if(!w || !h || (w == width && h == height))
continue; continue;


dp->resize.w = w; dp->resize.w = w;
@@ -417,10 +426,10 @@ static int x11_get_event(caca_display_t *dp, caca_privevent_t *ev)
unsigned int newx = xevent.xmotion.x / dp->drv.p->font_width; unsigned int newx = xevent.xmotion.x / dp->drv.p->font_width;
unsigned int newy = xevent.xmotion.y / dp->drv.p->font_height; unsigned int newy = xevent.xmotion.y / dp->drv.p->font_height;


if(newx >= dp->cv->width)
newx = dp->cv->width - 1;
if(newy >= dp->cv->height)
newy = dp->cv->height - 1;
if(newx >= width)
newx = width - 1;
if(newy >= height)
newy = height - 1;


if(dp->mouse.x == newx && dp->mouse.y == newy) if(dp->mouse.x == newx && dp->mouse.y == newy)
continue; continue;


+ 10
- 7
caca/event.c View File

@@ -25,7 +25,6 @@
#endif #endif


#include "cucul.h" #include "cucul.h"
#include "cucul_internals.h"
#include "caca.h" #include "caca.h"
#include "caca_internals.h" #include "caca_internals.h"


@@ -131,8 +130,10 @@ int caca_get_event(caca_display_t *dp, unsigned int event_mask,
*/ */
unsigned int caca_get_mouse_x(caca_display_t const *dp) unsigned int caca_get_mouse_x(caca_display_t const *dp)
{ {
if(dp->mouse.x >= dp->cv->width)
return dp->cv->width - 1;
unsigned int width = cucul_get_canvas_width(dp->cv);

if(dp->mouse.x >= width)
return width - 1;


return dp->mouse.x; return dp->mouse.x;
} }
@@ -151,8 +152,10 @@ unsigned int caca_get_mouse_x(caca_display_t const *dp)
*/ */
unsigned int caca_get_mouse_y(caca_display_t const *dp) unsigned int caca_get_mouse_y(caca_display_t const *dp)
{ {
if(dp->mouse.y >= dp->cv->height)
return dp->cv->height - 1;
unsigned int height = cucul_get_canvas_height(dp->cv);

if(dp->mouse.y >= height)
return height - 1;


return dp->mouse.y; return dp->mouse.y;
} }
@@ -333,8 +336,8 @@ static int _get_next_event(caca_display_t *dp, caca_privevent_t *ev)
dp->resize.resized = 0; dp->resize.resized = 0;
_caca_handle_resize(dp); _caca_handle_resize(dp);
ev->type = CACA_EVENT_RESIZE; ev->type = CACA_EVENT_RESIZE;
ev->data.resize.w = dp->cv->width;
ev->data.resize.h = dp->cv->height;
ev->data.resize.w = cucul_get_canvas_width(dp->cv);
ev->data.resize.h = cucul_get_canvas_height(dp->cv);
return 1; return 1;
} }




+ 3
- 3
caca/graphics.c View File

@@ -25,10 +25,9 @@
# include <string.h> # include <string.h>
#endif #endif


#include "cucul.h"
#include "caca.h" #include "caca.h"
#include "caca_internals.h" #include "caca_internals.h"
#include "cucul.h"
#include "cucul_internals.h"


/** \brief Set the display title. /** \brief Set the display title.
* *
@@ -237,7 +236,8 @@ void _caca_handle_resize(caca_display_t *dp)
dp->drv.handle_resize(dp); dp->drv.handle_resize(dp);


/* Tell libcucul we changed size */ /* Tell libcucul we changed size */
if(dp->resize.w != dp->cv->width || dp->resize.h != dp->cv->height)
if(dp->resize.w != cucul_get_canvas_width(dp->cv)
|| dp->resize.h != cucul_get_canvas_height(dp->cv))
{ {
dp->resize.allow = 1; dp->resize.allow = 1;
cucul_set_canvas_size(dp->cv, dp->resize.w, dp->resize.h); cucul_set_canvas_size(dp->cv, dp->resize.w, dp->resize.h);


+ 38
- 0
cucul/cucul.c View File

@@ -237,6 +237,44 @@ unsigned int cucul_get_canvas_height(cucul_canvas_t const *cv)
return cv->height; return cv->height;
} }


/** \brief Get the canvas character array.
*
* Return the current canvas' internal character array. The array elements
* consist in native endian 32-bit Unicode values as returned by
* cucul_get_char().
*
* This function is only useful for display drivers such as the \e libcaca
* library.
*
* This function never fails.
*
* \param cv A libcucul canvas.
* \return The canvas character array.
*/
unsigned char const * cucul_get_canvas_chars(cucul_canvas_t const *cv)
{
return (unsigned char const *)cv->chars;
}

/** \brief Get the canvas attribute array.
*
* Returns the current canvas' internal attribute array. The array elements
* consist in native endian 32-bit attribute values as returned by
* cucul_get_attr().
*
* This function is only useful for display drivers such as the \e libcaca
* library.
*
* This function never fails.
*
* \param cv A libcucul canvas.
* \return The canvas attribute array.
*/
unsigned char const * cucul_get_canvas_attrs(cucul_canvas_t const *cv)
{
return (unsigned char const *)cv->attrs;
}

/** \brief Uninitialise \e libcucul. /** \brief Uninitialise \e libcucul.
* *
* Free all resources allocated by cucul_create_canvas(). After * Free all resources allocated by cucul_create_canvas(). After


+ 2
- 0
cucul/cucul.h View File

@@ -90,6 +90,8 @@ __extern int cucul_set_canvas_size(cucul_canvas_t *, unsigned int,
unsigned int); unsigned int);
__extern unsigned int cucul_get_canvas_width(cucul_canvas_t const *); __extern unsigned int cucul_get_canvas_width(cucul_canvas_t const *);
__extern unsigned int cucul_get_canvas_height(cucul_canvas_t const *); __extern unsigned int cucul_get_canvas_height(cucul_canvas_t const *);
__extern unsigned char const * cucul_get_canvas_chars(cucul_canvas_t const *);
__extern unsigned char const * cucul_get_canvas_attrs(cucul_canvas_t const *);
__extern int cucul_free_canvas(cucul_canvas_t *); __extern int cucul_free_canvas(cucul_canvas_t *);
__extern int cucul_rand(int, int); __extern int cucul_rand(int, int);
/* @} */ /* @} */


Loading…
Cancel
Save