+ Correct clipping in ee_putstr() for long strings.
* libee/ee.c:
+ New ee_get_rendertime() call to provide framerate information.
* libee/ee.h:
+ Added const keywords where it was meaningful, despite Slang's blatant
omission of such keywords in its prototypes.
git-svn-id: file:///srv/caca.zoy.org/var/lib/svn/ttyvaders/trunk@180 92316355-f0b4-4df1-b90c-862c8a59935f
master
| @@ -46,7 +46,7 @@ | |||||
| #include "ee_internals.h" | #include "ee_internals.h" | ||||
| /* Global array with color names */ | /* Global array with color names */ | ||||
| char *ee_color_names[16] = | |||||
| const char *ee_color_names[16] = | |||||
| { | { | ||||
| "black", | "black", | ||||
| "blue", | "blue", | ||||
| @@ -66,8 +66,10 @@ char *ee_color_names[16] = | |||||
| "white", | "white", | ||||
| }; | }; | ||||
| static int _ee_delay; | |||||
| static unsigned int _ee_delay; | |||||
| static unsigned int _ee_rendertime; | |||||
| char *_ee_empty_line; | char *_ee_empty_line; | ||||
| char *_ee_scratch_line; | |||||
| #if defined(USE_NCURSES) | #if defined(USE_NCURSES) | ||||
| int _ee_attr[16]; | int _ee_attr[16]; | ||||
| @@ -185,12 +187,15 @@ int ee_init(void) | |||||
| memset(_ee_empty_line, ' ', ee_get_width()); | memset(_ee_empty_line, ' ', ee_get_width()); | ||||
| _ee_empty_line[ee_get_width()] = '\0'; | _ee_empty_line[ee_get_width()] = '\0'; | ||||
| _ee_scratch_line = malloc(ee_get_width() + 1); | |||||
| _ee_delay = 0; | _ee_delay = 0; | ||||
| _ee_rendertime = 0; | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| int ee_get_width(void) | |||||
| unsigned int ee_get_width(void) | |||||
| { | { | ||||
| #if defined(USE_SLANG) | #if defined(USE_SLANG) | ||||
| return SLtt_Screen_Cols; | return SLtt_Screen_Cols; | ||||
| @@ -201,7 +206,7 @@ int ee_get_width(void) | |||||
| #endif | #endif | ||||
| } | } | ||||
| int ee_get_height(void) | |||||
| unsigned int ee_get_height(void) | |||||
| { | { | ||||
| #if defined(USE_SLANG) | #if defined(USE_SLANG) | ||||
| return SLtt_Screen_Rows; | return SLtt_Screen_Rows; | ||||
| @@ -212,11 +217,16 @@ int ee_get_height(void) | |||||
| #endif | #endif | ||||
| } | } | ||||
| void ee_set_delay(int usec) | |||||
| void ee_set_delay(unsigned int usec) | |||||
| { | { | ||||
| _ee_delay = usec; | _ee_delay = usec; | ||||
| } | } | ||||
| unsigned int ee_get_rendertime(void) | |||||
| { | |||||
| return _ee_rendertime; | |||||
| } | |||||
| static unsigned int _ee_getticks(void) | static unsigned int _ee_getticks(void) | ||||
| { | { | ||||
| static unsigned int last_sec = 0, last_usec = 0; | static unsigned int last_sec = 0, last_usec = 0; | ||||
| @@ -239,7 +249,7 @@ static unsigned int _ee_getticks(void) | |||||
| void ee_refresh(void) | void ee_refresh(void) | ||||
| { | { | ||||
| static int lastticks = 0; | |||||
| static unsigned int lastticks = 0; | |||||
| unsigned int ticks = lastticks + _ee_getticks(); | unsigned int ticks = lastticks + _ee_getticks(); | ||||
| #if defined(USE_SLANG) | #if defined(USE_SLANG) | ||||
| @@ -258,6 +268,9 @@ void ee_refresh(void) | |||||
| for(ticks += _ee_getticks(); ticks < _ee_delay; ticks += _ee_getticks()) | for(ticks += _ee_getticks(); ticks < _ee_delay; ticks += _ee_getticks()) | ||||
| usleep(10000); | usleep(10000); | ||||
| /* Update the sliding mean of the render time */ | |||||
| _ee_rendertime = (7 * _ee_rendertime + ticks) / 8; | |||||
| lastticks = ticks - _ee_delay; | lastticks = ticks - _ee_delay; | ||||
| /* If we drifted too much, it's bad, bad, bad. */ | /* If we drifted too much, it's bad, bad, bad. */ | ||||
| @@ -51,7 +51,7 @@ enum ee_colors | |||||
| EE_WHITE = 15 | EE_WHITE = 15 | ||||
| }; | }; | ||||
| extern char *ee_color_names[16]; | |||||
| extern const char *ee_color_names[16]; | |||||
| /* | /* | ||||
| * Types | * Types | ||||
| @@ -62,9 +62,10 @@ struct ee_sprite; | |||||
| * Prototypes | * Prototypes | ||||
| */ | */ | ||||
| int ee_init(void); | int ee_init(void); | ||||
| void ee_set_delay(int); | |||||
| int ee_get_width(void); | |||||
| int ee_get_height(void); | |||||
| void ee_set_delay(unsigned int); | |||||
| unsigned int ee_get_rendertime(void); | |||||
| unsigned int ee_get_width(void); | |||||
| unsigned int ee_get_height(void); | |||||
| void ee_refresh(void); | void ee_refresh(void); | ||||
| void ee_end(void); | void ee_end(void); | ||||
| @@ -73,13 +74,13 @@ char ee_get_key(void); | |||||
| void ee_set_color(int); | void ee_set_color(int); | ||||
| int ee_get_color(void); | int ee_get_color(void); | ||||
| void ee_putchar(int, int, char); | void ee_putchar(int, int, char); | ||||
| void ee_putstr(int, int, char *); | |||||
| void ee_putstr(int, int, const char *); | |||||
| void ee_clear(void); | void ee_clear(void); | ||||
| void ee_draw_line(int, int, int, int, char); | void ee_draw_line(int, int, int, int, char); | ||||
| void ee_draw_polyline(int[], int[], int, char); | |||||
| void ee_draw_polyline(const int[], const int[], int, char); | |||||
| void ee_draw_thin_line(int, int, int, int); | void ee_draw_thin_line(int, int, int, int); | ||||
| void ee_draw_thin_polyline(int[], int[], int); | |||||
| void ee_draw_thin_polyline(const int[], const int[], int); | |||||
| void ee_draw_circle(int, int, int, char); | void ee_draw_circle(int, int, int, char); | ||||
| void ee_draw_ellipse(int, int, int, int, char); | void ee_draw_ellipse(int, int, int, int, char); | ||||
| @@ -32,5 +32,6 @@ extern char *_ee_screen; | |||||
| #endif | #endif | ||||
| extern char *_ee_empty_line; | extern char *_ee_empty_line; | ||||
| extern char *_ee_scratch_line; | |||||
| #endif /* __EE_INTERNALS_H__ */ | #endif /* __EE_INTERNALS_H__ */ | ||||
| @@ -79,11 +79,11 @@ void ee_putchar(int x, int y, char c) | |||||
| #endif | #endif | ||||
| } | } | ||||
| void ee_putstr(int x, int y, char *s) | |||||
| void ee_putstr(int x, int y, const char *s) | |||||
| { | { | ||||
| int len; | int len; | ||||
| if(y < 0 || y >= ee_get_height()) | |||||
| if(y < 0 || y >= ee_get_height() || x >= ee_get_width()) | |||||
| return; | return; | ||||
| len = strlen(s); | len = strlen(s); | ||||
| @@ -97,6 +97,13 @@ void ee_putstr(int x, int y, char *s) | |||||
| x = 0; | x = 0; | ||||
| } | } | ||||
| if(x + len >= ee_get_width()) | |||||
| { | |||||
| memcpy(_ee_scratch_line, s, ee_get_width() - x); | |||||
| _ee_scratch_line[ee_get_width() - x] = '\0'; | |||||
| s = _ee_scratch_line; | |||||
| } | |||||
| #if defined(USE_SLANG) | #if defined(USE_SLANG) | ||||
| SLsmg_gotorc(y, x); | SLsmg_gotorc(y, x); | ||||
| SLsmg_write_string(s); | SLsmg_write_string(s); | ||||
| @@ -68,7 +68,7 @@ void ee_draw_line(int x1, int y1, int x2, int y2, char c) | |||||
| clip_line(&s); | clip_line(&s); | ||||
| } | } | ||||
| void ee_draw_polyline(int x[], int y[], int n, char c) | |||||
| void ee_draw_polyline(const int x[], const int y[], int n, char c) | |||||
| { | { | ||||
| int i; | int i; | ||||
| struct line s; | struct line s; | ||||
| @@ -105,7 +105,7 @@ void ee_draw_thin_line(int x1, int y1, int x2, int y2) | |||||
| clip_line(&s); | clip_line(&s); | ||||
| } | } | ||||
| void ee_draw_thin_polyline(int x[], int y[], int n) | |||||
| void ee_draw_thin_polyline(const int x[], const int y[], int n) | |||||
| { | { | ||||
| int i; | int i; | ||||
| struct line s; | struct line s; | ||||