hackthelobby/libcaca/caca/caca_internals.h

283 lines
6.6 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* libcaca Colour ASCII-Art library
* Copyright © 2002—2021 Sam Hocevar <sam@hocevar.net>
* All Rights Reserved
*
* This library is free software. It comes without any warranty, to
* the extent permitted by applicable law. You can redistribute it
* and/or modify it under the terms of the Do What the Fuck You Want
* to Public License, Version 2, as published by Sam Hocevar. See
* http://www.wtfpl.net/ for more details.
*/
#ifndef __CACA_INTERNALS_H__
#define __CACA_INTERNALS_H__
#include "caca_stubs.h"
#include "caca_debug.h"
#include "caca_prof.h"
typedef struct caca_timer caca_timer_t;
typedef struct caca_privevent caca_privevent_t;
#if !defined(_DOXYGEN_SKIP_ME)
# define STAT_VALUES 32
# define EVENTBUF_LEN 10
# define MAX_DIRTY_COUNT 8
#endif
#undef __extern
#if defined CACA_ENABLE_VISIBILITY
# define __extern extern __attribute__((visibility("default")))
#else
# define __extern extern
#endif
struct caca_frame
{
/* Frame size */
int width, height;
/* Cell information */
uint32_t *chars;
uint32_t *attrs;
/* Painting context */
int x, y;
int handlex, handley;
uint32_t curattr;
/* Frame name */
char *name;
};
struct caca_canvas
{
/* XXX: look at caca_set_canvas_boundaries() before adding anything
* to this structure. The function is quite hacky. */
/* Frame information */
int frame, framecount;
struct caca_frame *frames;
/* Canvas management */
int refcount;
int autoinc;
int (*resize_callback)(void *);
void *resize_data;
/* Dirty rectangles */
int ndirty, dirty_disabled;
struct
{
int xmin, ymin, xmax, ymax;
}
dirty[MAX_DIRTY_COUNT + 1];
/* Shortcut to the active frame information */
int width, height;
uint32_t *chars;
uint32_t *attrs;
uint32_t curattr;
/* FIGfont management */
caca_charfont_t *ff;
};
/* Graphics driver */
enum caca_driver
{
CACA_DRIVER_NULL = 0,
CACA_DRIVER_RAW = 1,
#if defined(USE_COCOA)
CACA_DRIVER_COCOA = 2,
#endif
#if defined(USE_CONIO)
CACA_DRIVER_CONIO = 3,
#endif
#if defined(USE_GL)
CACA_DRIVER_GL = 4,
#endif
#if defined(USE_NCURSES)
CACA_DRIVER_NCURSES = 5,
#endif
#if defined(USE_SLANG)
CACA_DRIVER_SLANG = 6,
#endif
#if defined(USE_VGA)
CACA_DRIVER_VGA = 7,
#endif
#if defined(USE_WIN32)
CACA_DRIVER_WIN32 = 8,
#endif
#if defined(USE_X11)
CACA_DRIVER_X11 = 9,
#endif
};
/* Available external drivers */
#if defined(USE_COCOA)
int cocoa_install(caca_display_t *);
#endif
#if defined(USE_CONIO)
int conio_install(caca_display_t *);
#endif
#if defined(USE_GL)
__extern int gl_install(caca_display_t *);
#endif
#if defined(USE_NCURSES)
int ncurses_install(caca_display_t *);
#endif
int null_install(caca_display_t *);
int raw_install(caca_display_t *);
#if defined(USE_SLANG)
int slang_install(caca_display_t *);
#endif
#if defined(USE_VGA)
int vga_install(caca_display_t *);
#endif
#if defined(USE_WIN32)
int win32_install(caca_display_t *);
#endif
#if defined(USE_X11)
__extern int x11_install(caca_display_t *);
#endif
/* Timer structure */
struct caca_timer
{
int last_sec, last_usec;
};
/* Statistic structure for profiling */
struct caca_stat
{
int itable[STAT_VALUES];
int64_t imean;
char *name;
};
/* Private event structure */
struct caca_privevent
{
enum caca_event_type type;
union
{
struct { int x, y, button; } mouse;
struct { int w, h; } resize;
struct { int ch; uint32_t utf32; char utf8[8]; } key;
} data;
};
/* Internal caca display context */
struct caca_display
{
/* A link to our caca canvas */
caca_canvas_t *cv;
int autorelease;
#if defined(USE_PLUGINS)
void *plugin;
#endif
/* Device-specific functions */
struct drv
{
char const * driver;
enum caca_driver id;
struct driver_private *p;
int (* init_graphics) (caca_display_t *);
int (* end_graphics) (caca_display_t *);
int (* set_display_title) (caca_display_t *, char const *);
int (* get_display_width) (caca_display_t const *);
int (* get_display_height) (caca_display_t const *);
void (* display) (caca_display_t *);
void (* handle_resize) (caca_display_t *);
int (* get_event) (caca_display_t *, caca_privevent_t *);
void (* set_mouse) (caca_display_t *, int);
void (* set_cursor) (caca_display_t *, int);
} drv;
/* Mouse position */
struct mouse
{
int x, y;
} mouse;
/* Window resize handling */
struct resize
{
int resized; /* A resize event was requested */
int allow; /* The display driver allows resizing */
int w, h; /* Requested width and height */
} resize;
/* Framerate handling */
int delay, rendertime;
caca_timer_t timer;
#if defined PROF
struct caca_stat display_stat, wait_stat;
struct caca_stat ev_sys_stat, ev_wait_stat;
#endif
int lastticks;
struct events
{
#if defined(USE_SLANG) || defined(USE_NCURSES) || defined(USE_CONIO) || defined(USE_GL)
caca_privevent_t buf[EVENTBUF_LEN];
int queue;
#endif
#if defined(USE_SLANG) || defined(USE_NCURSES)
caca_timer_t key_timer;
int last_key_ticks;
int autorepeat_ticks;
caca_privevent_t last_key_event;
#endif
#if defined(USE_WIN32)
uint8_t not_empty_struct;
#endif
} events;
};
/* Dirty rectangle functions */
extern void _caca_clip_dirty_rect_list(caca_canvas_t *);
/* Colour functions */
extern uint32_t _caca_attr_to_rgb24fg(uint32_t);
extern uint32_t _caca_attr_to_rgb24bg(uint32_t);
/* Frames functions */
extern void _caca_save_frame_info(caca_canvas_t *);
extern void _caca_load_frame_info(caca_canvas_t *);
/* Internal timer functions */
extern void _caca_sleep(int);
extern int _caca_getticks(caca_timer_t *);
/* Internal event functions */
extern void _caca_handle_resize(caca_display_t *);
#if defined(USE_SLANG) || defined(USE_NCURSES) || defined(USE_CONIO) || defined(USE_GL)
/* Expose this with __extern because the GL driver uses it */
__extern void _caca_push_event(caca_display_t *, caca_privevent_t *);
extern int _caca_pop_event(caca_display_t *, caca_privevent_t *);
#endif
/* Internal window functions */
extern void _caca_set_term_title(char const *);
/* Internal memory function */
extern void *_caca_alloc2d(size_t width, size_t height, size_t elem_size);
/* Profiling functions */
#if defined PROF
extern void _caca_dump_stats(void);
extern void _caca_init_stat(struct caca_stat *, char const *, ...);
extern void _caca_fini_stat(struct caca_stat *);
#endif
#undef __extern
#endif /* __CACA_INTERNALS_H__ */