* Renamed cucul_*_canvas_frame() to cucul_*_frame() because we bloody well
know that a frame belongs to a canvas.
tags/v0.99.beta14
| @@ -472,16 +472,16 @@ int cucul_set_canvas_boundaries(cucul_canvas_t *cv, int x, int y, | |||
| new = cucul_create_canvas(w, h); | |||
| framecount = cucul_get_canvas_frame_count(cv); | |||
| framecount = cucul_get_frame_count(cv); | |||
| saved_f = cv->frame; | |||
| for(f = 0; f < framecount; f++) | |||
| { | |||
| if(f) | |||
| cucul_create_canvas_frame(new, framecount); | |||
| cucul_create_frame(new, framecount); | |||
| cucul_set_canvas_frame(cv, f); | |||
| cucul_set_canvas_frame(new, f); | |||
| cucul_set_frame(cv, f); | |||
| cucul_set_frame(new, f); | |||
| cucul_blit(new, -x, -y, cv, NULL); | |||
| free(cv->frames[f].chars); | |||
| @@ -492,7 +492,7 @@ int cucul_set_canvas_boundaries(cucul_canvas_t *cv, int x, int y, | |||
| memcpy(cv, new, sizeof(cucul_canvas_t)); | |||
| free(new); | |||
| cucul_set_canvas_frame(cv, saved_f); | |||
| cucul_set_frame(cv, saved_f); | |||
| return 0; | |||
| } | |||
| @@ -58,6 +58,7 @@ cucul_canvas_t * cucul_create_canvas(unsigned int width, unsigned int height) | |||
| goto nomem; | |||
| cv->refcount = 0; | |||
| cv->autoinc = 0; | |||
| cv->frame = 0; | |||
| cv->framecount = 1; | |||
| @@ -74,6 +75,7 @@ cucul_canvas_t * cucul_create_canvas(unsigned int width, unsigned int height) | |||
| cv->frames[0].x = cv->frames[0].y = 0; | |||
| cv->frames[0].handlex = cv->frames[0].handley = 0; | |||
| cv->frames[0].curattr = 0; | |||
| cv->frames[0].name = strdup("frame#00000000"); | |||
| _cucul_load_frame_info(cv); | |||
| cucul_set_color_ansi(cv, CUCUL_DEFAULT, CUCUL_TRANSPARENT); | |||
| @@ -81,6 +83,7 @@ cucul_canvas_t * cucul_create_canvas(unsigned int width, unsigned int height) | |||
| if(_cucul_set_canvas_size(cv, width, height) < 0) | |||
| { | |||
| int saved_errno = geterrno(); | |||
| free(cv->frames[0].name); | |||
| free(cv->frames); | |||
| free(cv); | |||
| seterrno(saved_errno); | |||
| @@ -185,6 +188,7 @@ int cucul_free_canvas(cucul_canvas_t *cv) | |||
| { | |||
| free(cv->frames[f].chars); | |||
| free(cv->frames[f].attrs); | |||
| free(cv->frames[f].name); | |||
| } | |||
| free(cv->frames); | |||
| @@ -180,10 +180,12 @@ int cucul_fill_triangle(cucul_canvas_t *, int, int, int, int, int, int, | |||
| * removal, copying etc. | |||
| * | |||
| * @{ */ | |||
| unsigned int cucul_get_canvas_frame_count(cucul_canvas_t *); | |||
| int cucul_set_canvas_frame(cucul_canvas_t *, unsigned int); | |||
| int cucul_create_canvas_frame(cucul_canvas_t *, unsigned int); | |||
| int cucul_free_canvas_frame(cucul_canvas_t *, unsigned int); | |||
| unsigned int cucul_get_frame_count(cucul_canvas_t *); | |||
| int cucul_set_frame(cucul_canvas_t *, unsigned int); | |||
| char const *cucul_get_frame_name(cucul_canvas_t *); | |||
| int cucul_set_frame_name(cucul_canvas_t *, char const *); | |||
| int cucul_create_frame(cucul_canvas_t *, unsigned int); | |||
| int cucul_free_frame(cucul_canvas_t *, unsigned int); | |||
| /* @} */ | |||
| /** \defgroup dither libcucul bitmap dithering | |||
| @@ -264,6 +266,14 @@ char const * const * cucul_get_export_list(void); | |||
| unsigned char) CUCUL_DEPRECATED; | |||
| int cucul_set_truecolor(cucul_canvas_t *, unsigned int, | |||
| unsigned int) CUCUL_DEPRECATED; | |||
| unsigned int cucul_get_canvas_frame_count(cucul_canvas_t *) | |||
| CUCUL_DEPRECATED; | |||
| int cucul_set_canvas_frame(cucul_canvas_t *, | |||
| unsigned int) CUCUL_DEPRECATED; | |||
| int cucul_create_canvas_frame(cucul_canvas_t *, | |||
| unsigned int) CUCUL_DEPRECATED; | |||
| int cucul_free_canvas_frame(cucul_canvas_t *, | |||
| unsigned int) CUCUL_DEPRECATED; | |||
| cucul_buffer_t *cucul_load_memory(void *, | |||
| unsigned long int) CUCUL_DEPRECATED; | |||
| cucul_buffer_t *cucul_load_file(char const *) CUCUL_DEPRECATED; | |||
| @@ -31,6 +31,9 @@ struct cucul_frame | |||
| int x, y; | |||
| int handlex, handley; | |||
| uint32_t curattr; | |||
| /* Frame name */ | |||
| char *name; | |||
| }; | |||
| struct cucul_canvas | |||
| @@ -40,6 +43,7 @@ struct cucul_canvas | |||
| struct cucul_frame *frames; | |||
| unsigned int refcount; | |||
| unsigned int autoinc; | |||
| /* Shortcut to the active frame information */ | |||
| unsigned int width, height; | |||
| @@ -36,7 +36,7 @@ | |||
| * \param cv A libcucul canvas | |||
| * \return The frame count | |||
| */ | |||
| unsigned int cucul_get_canvas_frame_count(cucul_canvas_t *cv) | |||
| unsigned int cucul_get_frame_count(cucul_canvas_t *cv) | |||
| { | |||
| return cv->framecount; | |||
| } | |||
| @@ -53,24 +53,68 @@ unsigned int cucul_get_canvas_frame_count(cucul_canvas_t *cv) | |||
| * - \c EINVAL Requested frame is out of range. | |||
| * | |||
| * \param cv A libcucul canvas | |||
| * \param frame The canvas frame to activate | |||
| * \param id The canvas frame to activate | |||
| * \return 0 in case of success, -1 if an error occurred. | |||
| */ | |||
| int cucul_set_canvas_frame(cucul_canvas_t *cv, unsigned int frame) | |||
| int cucul_set_frame(cucul_canvas_t *cv, unsigned int id) | |||
| { | |||
| if(frame >= cv->framecount) | |||
| if(id >= cv->framecount) | |||
| { | |||
| seterrno(EINVAL); | |||
| return -1; | |||
| } | |||
| _cucul_save_frame_info(cv); | |||
| cv->frame = frame; | |||
| cv->frame = id; | |||
| _cucul_load_frame_info(cv); | |||
| return 0; | |||
| } | |||
| /** \brief Get the current frame's name. | |||
| * | |||
| * Return the current frame's name. The returned string is valid until | |||
| * the frame is deleted or cucul_set_frame_name() is called to change | |||
| * the frame name again. | |||
| * | |||
| * This function never fails. | |||
| * | |||
| * \param cv A libcucul canvas. | |||
| * \return The current frame's name. | |||
| */ | |||
| char const *cucul_get_frame_name(cucul_canvas_t *cv) | |||
| { | |||
| return cv->frames[cv->frame].name; | |||
| } | |||
| /** \brief Set the current frame's name. | |||
| * | |||
| * Set the current frame's name. Upon creation, a frame has a default name | |||
| * of \rc "frame#xxxxxxxx" where \c xxxxxxxx is a self-incrementing | |||
| * hexadecimal number. | |||
| * | |||
| * If an error occurs, -1 is returned and \b errno is set accordingly: | |||
| * - \c ENOMEM Not enough memory to allocate new frame. | |||
| * | |||
| * \param cv A libcucul canvas. | |||
| * \return 0 in case of success, -1 if an error occurred. | |||
| */ | |||
| int cucul_set_frame_name(cucul_canvas_t *cv, char const *name) | |||
| { | |||
| char *newname = strdup(name); | |||
| if(!newname) | |||
| { | |||
| seterrno(ENOMEM); | |||
| return -1; | |||
| } | |||
| free(cv->frames[cv->frame].name); | |||
| cv->frames[cv->frame].name = newname; | |||
| return 0; | |||
| } | |||
| /** \brief Add a frame to a canvas. | |||
| * | |||
| * Create a new frame within the given canvas. Its contents and attributes | |||
| @@ -91,7 +135,7 @@ int cucul_set_canvas_frame(cucul_canvas_t *cv, unsigned int frame) | |||
| * \param id The index where to insert the new frame | |||
| * \return 0 in case of success, -1 if an error occurred. | |||
| */ | |||
| int cucul_create_canvas_frame(cucul_canvas_t *cv, unsigned int id) | |||
| int cucul_create_frame(cucul_canvas_t *cv, unsigned int id) | |||
| { | |||
| unsigned int size = cv->width * cv->height; | |||
| unsigned int f; | |||
| @@ -122,6 +166,9 @@ int cucul_create_canvas_frame(cucul_canvas_t *cv, unsigned int id) | |||
| cv->frames[id].handlex = cv->frames[cv->frame].handlex; | |||
| cv->frames[id].handley = cv->frames[cv->frame].handley; | |||
| cv->frames[id].name = strdup("frame#--------"); | |||
| sprintf(cv->frames[id].name + 6, "%.08x", cv->autoinc++); | |||
| return 0; | |||
| } | |||
| @@ -146,7 +193,7 @@ int cucul_create_canvas_frame(cucul_canvas_t *cv, unsigned int id) | |||
| * \param id The index of the frame to delete | |||
| * \return 0 in case of success, -1 if an error occurred. | |||
| */ | |||
| int cucul_free_canvas_frame(cucul_canvas_t *cv, unsigned int id) | |||
| int cucul_free_frame(cucul_canvas_t *cv, unsigned int id) | |||
| { | |||
| unsigned int f; | |||
| @@ -164,6 +211,7 @@ int cucul_free_canvas_frame(cucul_canvas_t *cv, unsigned int id) | |||
| free(cv->frames[id].chars); | |||
| free(cv->frames[id].attrs); | |||
| free(cv->frames[id].name); | |||
| for(f = id + 1; f < cv->framecount; f++) | |||
| cv->frames[f - 1] = cv->frames[f]; | |||
| @@ -106,6 +106,30 @@ cucul_buffer_t * cucul_export_canvas(cucul_canvas_t *cv, char const *format) | |||
| return ex; | |||
| } | |||
| /* | |||
| * Functions from frame.c | |||
| */ | |||
| unsigned int cucul_get_canvas_frame_count(cucul_canvas_t *cv) | |||
| { | |||
| return cucul_get_frame_count(cv); | |||
| } | |||
| int cucul_set_canvas_frame(cucul_canvas_t *cv, unsigned int id) | |||
| { | |||
| return cucul_set_frame(cv, id); | |||
| } | |||
| int cucul_create_canvas_frame(cucul_canvas_t *cv, unsigned int id) | |||
| { | |||
| return cucul_create_frame(cv, id); | |||
| } | |||
| int cucul_free_canvas_frame(cucul_canvas_t *cv, unsigned int id) | |||
| { | |||
| return cucul_free_frame(cv, id); | |||
| } | |||
| /* | |||
| * Functions from buffer.c | |||
| */ | |||
| @@ -253,19 +253,19 @@ int Cucul::setBoundaries(cucul_canvas_t *, int x, int y, | |||
| unsigned int Cucul::getFrameCount() | |||
| { | |||
| return cucul_get_canvas_frame_count(cv); | |||
| return cucul_get_frame_count(cv); | |||
| } | |||
| int Cucul::setFrame(unsigned int f) | |||
| { | |||
| return cucul_set_canvas_frame(cv, f); | |||
| return cucul_set_frame(cv, f); | |||
| } | |||
| int Cucul::createFrame(unsigned int f) | |||
| { | |||
| return cucul_create_canvas_frame(cv, f); | |||
| return cucul_create_frame(cv, f); | |||
| } | |||
| int Cucul::freeFrame(unsigned int f) | |||
| { | |||
| return cucul_create_canvas_frame(cv, f); | |||
| return cucul_create_frame(cv, f); | |||
| } | |||
| char const *const * Cucul::getImportList(void) | |||
| @@ -16,19 +16,19 @@ | |||
| #if !defined(__KERNEL__) | |||
| # include <stdio.h> | |||
| # include <string.h> | |||
| #endif | |||
| #include "cucul.h" | |||
| #include "caca.h" | |||
| #define ITER 1000 | |||
| #define ITER 128 | |||
| int main(int argc, char *argv[]) | |||
| { | |||
| cucul_canvas_t *cv; | |||
| unsigned int i, w, h; | |||
| unsigned int i, j, w, h; | |||
| /* cucul_create_canvas */ | |||
| fprintf(stderr, "testing cucul_create_canvas()\n"); | |||
| for(i = 0; i < ITER; i++) | |||
| { | |||
| @@ -41,6 +41,22 @@ int main(int argc, char *argv[]) | |||
| cucul_free_canvas(cv); | |||
| } | |||
| fprintf(stderr, "testing cucul_set_frame_name()\n"); | |||
| cv = cucul_create_canvas(1, 1); | |||
| for(i = 0; i < ITER; i++) | |||
| { | |||
| cucul_create_frame(cv, 0); | |||
| for(j = 0; j < ITER; j++) | |||
| { | |||
| char buf[BUFSIZ]; | |||
| w = cucul_rand(1, 1000); | |||
| memset(buf, 'x', w); | |||
| buf[w] = '\0'; | |||
| cucul_set_frame_name(cv, buf); | |||
| } | |||
| } | |||
| cucul_free_canvas(cv); | |||
| fprintf(stderr, "all tests passed\n"); | |||
| return 0; | |||
| } | |||
| @@ -33,7 +33,7 @@ int main(int argc, char *argv[]) | |||
| /* Create a canvas with 200 frames */ | |||
| cv = cucul_create_canvas(0, 0); | |||
| for(frame = 1; frame < 200; frame++) | |||
| cucul_create_canvas_frame(cv, frame); | |||
| cucul_create_frame(cv, frame); | |||
| fprintf(stderr, "canvas created, size is %ix%i\n", | |||
| cucul_get_canvas_width(cv), cucul_get_canvas_height(cv)); | |||
| @@ -47,7 +47,7 @@ int main(int argc, char *argv[]) | |||
| /* Fill the first 16 frames with a different colour */ | |||
| for(frame = 0; frame < 16; frame++) | |||
| { | |||
| cucul_set_canvas_frame(cv, frame); | |||
| cucul_set_frame(cv, frame); | |||
| cucul_set_color_ansi(cv, CUCUL_WHITE, frame); | |||
| cucul_fill_box(cv, 0, 0, 40, 15, ':'); | |||
| cucul_set_color_ansi(cv, CUCUL_WHITE, CUCUL_BLUE); | |||
| @@ -70,7 +70,7 @@ int main(int argc, char *argv[]) | |||
| n = 0; | |||
| while(!caca_get_event(dp, CACA_EVENT_KEY_PRESS, NULL, 0)) | |||
| { | |||
| cucul_set_canvas_frame(cv, n % 16); | |||
| cucul_set_frame(cv, n % 16); | |||
| caca_refresh_display(dp); | |||
| n++; | |||
| } | |||