environment variables handling. Replaced that with three per-bitmap
functions: cucul_set_bitmap_antialias(), cucul_set_bitmap_color() and
cucul_set_bitmap_dithering().
* Added cucul_set_bitmap_brightness() and cucul_set_bitmap_contrast()
prototypes (but did not implement them yet).
* Added cucul_set_bitmap_charset() to choose what characters are going
to be used for the bitmap rendering.
* Removed the now useless cucul_get_feature(), cucul_set_feature() etc.
tags/v0.99.beta14
| @@ -30,8 +30,8 @@ | |||
| * using the conio library, and on Windows systems using either slang or | |||
| * ncurses (through Cygwin emulation) or conio. There is also a native X11 | |||
| * driver, and an OpenGL driver (through freeglut) that does not require a | |||
| * text terminal. For machines without a screen, and with a valid tcp stack, | |||
| * the network driver (BSD sockets) should perfectly fit your needs. | |||
| * text terminal. For machines without a screen, the raw driver can be used | |||
| * to send the output to another machine, using for instance cacaserver. | |||
| * | |||
| * \e libcaca is free software, released under the Do What The Fuck You | |||
| * Want To Public License. This ensures that no one, not even the \e libcaca | |||
| @@ -51,8 +51,8 @@ | |||
| * \section env Environment variables | |||
| * | |||
| * Some environment variables can be used to change the behaviour of | |||
| * \e libcaca or \e libcucul without having to modify the program which | |||
| * uses them. These variables are: | |||
| * \e libcaca without having to modify the program which uses them. These | |||
| * variables are: | |||
| * | |||
| * \li \b CACA_DRIVER: set the backend video driver. In order of preference: | |||
| * - \c conio uses the DOS conio.h interface. | |||
| @@ -60,30 +60,8 @@ | |||
| * - \c slang uses the S-Lang library. | |||
| * - \c x11 uses the native X11 driver. | |||
| * - \c gl uses freeglut and opengl libraries. | |||
| * - \c network uses BSD sockets calls. | |||
| * | |||
| * \li \b CUCUL_BACKGROUND: set the background type. | |||
| * - \c solid uses solid coloured backgrounds for all characters. This | |||
| * feature does not work with all terminal emulators. This is the | |||
| * default choice. | |||
| * - \c black uses only black backgrounds to render characters. | |||
| * | |||
| * \li \b CUCUL_ANTIALIASING: set the antialiasing mode. Antialiasing | |||
| * smoothens the rendered image and avoids the commonly seen staircase | |||
| * effect. | |||
| * - \c none disables antialiasing. | |||
| * - \c prefilter uses a simple prefilter antialiasing method. This is | |||
| * the default choice. | |||
| * | |||
| * \li \b CUCUL_DITHERING: set the dithering mode. Dithering is necessary | |||
| * when rendering a picture that has more colours than the usually | |||
| * available palette. | |||
| * - \c none disables dithering. | |||
| * - \c ordered2 uses a 2x2 Bayer matrix for dithering. | |||
| * - \c ordered4 uses a 4x4 Bayer matrix for dithering. This is the | |||
| * default choice. | |||
| * - \c ordered8 uses a 8x8 Bayer matrix for dithering. | |||
| * - \c random uses random dithering. | |||
| * - \c raw outputs to the standard output instead of rendering the | |||
| * canvas. This is can be used together with cacaserver. | |||
| * | |||
| * \li \b CACA_GEOMETRY: set the video display size. The format of this | |||
| * variable must be XxY, with X and Y being integer values. This option | |||
| @@ -28,8 +28,6 @@ | |||
| #include "cucul.h" | |||
| #include "cucul_internals.h" | |||
| static void cucul_read_environment(cucul_t *); | |||
| /** \brief Initialise a \e libcucul canvas. | |||
| * | |||
| * This function initialises internal \e libcucul structures and the backend | |||
| @@ -48,8 +46,6 @@ cucul_t * cucul_create(unsigned int width, unsigned int height) | |||
| { | |||
| cucul_t *qq = malloc(sizeof(cucul_t)); | |||
| cucul_read_environment(qq); | |||
| qq->refcount = 0; | |||
| qq->fgcolor = CUCUL_COLOR_LIGHTGRAY; | |||
| @@ -201,103 +197,6 @@ char const *cucul_get_color_name(enum cucul_color color) | |||
| return color_names[color]; | |||
| } | |||
| /** \brief Get the current value of a feature. | |||
| * | |||
| * 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. | |||
| * \return The current value of the feature or CUCUL_FEATURE_UNKNOWN if an | |||
| * error occurred.. | |||
| */ | |||
| enum cucul_feature cucul_get_feature(cucul_t *qq, enum cucul_feature feature) | |||
| { | |||
| switch(feature) | |||
| { | |||
| case CUCUL_BACKGROUND: | |||
| return qq->background; | |||
| case CUCUL_ANTIALIASING: | |||
| return qq->antialiasing; | |||
| case CUCUL_DITHERING: | |||
| return qq->dithering; | |||
| default: | |||
| return CUCUL_FEATURE_UNKNOWN; | |||
| } | |||
| } | |||
| /** \brief Set a feature. | |||
| * | |||
| * 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. | |||
| * | |||
| * \param feature The requested feature. | |||
| */ | |||
| void cucul_set_feature(cucul_t *qq, enum cucul_feature feature) | |||
| { | |||
| switch(feature) | |||
| { | |||
| case CUCUL_BACKGROUND: | |||
| feature = CUCUL_BACKGROUND_SOLID; | |||
| case CUCUL_BACKGROUND_BLACK: | |||
| case CUCUL_BACKGROUND_SOLID: | |||
| qq->background = feature; | |||
| break; | |||
| case CUCUL_ANTIALIASING: | |||
| feature = CUCUL_ANTIALIASING_PREFILTER; | |||
| case CUCUL_ANTIALIASING_NONE: | |||
| case CUCUL_ANTIALIASING_PREFILTER: | |||
| qq->antialiasing = feature; | |||
| break; | |||
| case CUCUL_DITHERING: | |||
| feature = CUCUL_DITHERING_FSTEIN; | |||
| case CUCUL_DITHERING_NONE: | |||
| case CUCUL_DITHERING_ORDERED2: | |||
| case CUCUL_DITHERING_ORDERED4: | |||
| case CUCUL_DITHERING_ORDERED8: | |||
| case CUCUL_DITHERING_RANDOM: | |||
| case CUCUL_DITHERING_FSTEIN: | |||
| qq->dithering = feature; | |||
| break; | |||
| case CUCUL_FEATURE_UNKNOWN: | |||
| break; | |||
| } | |||
| } | |||
| /** \brief Translate a feature value into the feature's name. | |||
| * | |||
| * This function translates a cucul_feature enum into a human-readable | |||
| * description string of the associated feature. | |||
| * | |||
| * \param feature The feature value. | |||
| * \return A static string containing the feature's name. | |||
| */ | |||
| char const *cucul_get_feature_name(enum cucul_feature feature) | |||
| { | |||
| switch(feature) | |||
| { | |||
| case CUCUL_BACKGROUND_BLACK: return "black background"; | |||
| case CUCUL_BACKGROUND_SOLID: return "solid background"; | |||
| case CUCUL_ANTIALIASING_NONE: return "no antialiasing"; | |||
| case CUCUL_ANTIALIASING_PREFILTER: return "prefilter antialiasing"; | |||
| case CUCUL_DITHERING_NONE: return "no dithering"; | |||
| case CUCUL_DITHERING_ORDERED2: return "2x2 ordered dithering"; | |||
| case CUCUL_DITHERING_ORDERED4: return "4x4 ordered dithering"; | |||
| case CUCUL_DITHERING_ORDERED8: return "8x8 ordered dithering"; | |||
| case CUCUL_DITHERING_RANDOM: return "random dithering"; | |||
| case CUCUL_DITHERING_FSTEIN: return "Floyd-Steinberg dithering"; | |||
| default: return "unknown"; | |||
| } | |||
| } | |||
| /** \brief Uninitialise \e libcucul. | |||
| * | |||
| * This function frees all resources allocated by cucul_create(). After | |||
| @@ -380,52 +279,6 @@ void cucul_free_export(struct cucul_export *ex) | |||
| * XXX: The following functions are local. | |||
| */ | |||
| static void cucul_read_environment(cucul_t * qq) | |||
| { | |||
| /* FIXME: if strcasecmp isn't available, use strcmp */ | |||
| #if defined(HAVE_GETENV) && defined(HAVE_STRCASECMP) | |||
| char *var; | |||
| #endif | |||
| cucul_set_feature(qq, CUCUL_BACKGROUND); | |||
| cucul_set_feature(qq, CUCUL_ANTIALIASING); | |||
| cucul_set_feature(qq, CUCUL_DITHERING); | |||
| #if defined(HAVE_GETENV) && defined(HAVE_STRCASECMP) | |||
| if((var = getenv("CUCUL_BACKGROUND")) && *var) | |||
| { | |||
| if(!strcasecmp("black", var)) | |||
| cucul_set_feature(qq, CUCUL_BACKGROUND_BLACK); | |||
| else if(!strcasecmp("solid", var)) | |||
| cucul_set_feature(qq, CUCUL_BACKGROUND_SOLID); | |||
| } | |||
| if((var = getenv("CUCUL_ANTIALIASING")) && *var) | |||
| { | |||
| if(!strcasecmp("none", var)) | |||
| cucul_set_feature(qq, CUCUL_ANTIALIASING_NONE); | |||
| else if(!strcasecmp("prefilter", var)) | |||
| cucul_set_feature(qq, CUCUL_ANTIALIASING_PREFILTER); | |||
| } | |||
| if((var = getenv("CUCUL_DITHERING")) && *var) | |||
| { | |||
| if(!strcasecmp("none", var)) | |||
| cucul_set_feature(qq, CUCUL_DITHERING_NONE); | |||
| else if(!strcasecmp("ordered2", var)) | |||
| cucul_set_feature(qq, CUCUL_DITHERING_ORDERED2); | |||
| else if(!strcasecmp("ordered4", var)) | |||
| cucul_set_feature(qq, CUCUL_DITHERING_ORDERED4); | |||
| else if(!strcasecmp("ordered8", var)) | |||
| cucul_set_feature(qq, CUCUL_DITHERING_ORDERED8); | |||
| else if(!strcasecmp("random", var)) | |||
| cucul_set_feature(qq, CUCUL_DITHERING_RANDOM); | |||
| else if(!strcasecmp("fstein", var)) | |||
| cucul_set_feature(qq, CUCUL_DITHERING_FSTEIN); | |||
| } | |||
| #endif | |||
| } | |||
| 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; | |||
| @@ -34,68 +34,27 @@ extern "C" | |||
| */ | |||
| enum cucul_color | |||
| { | |||
| CUCUL_COLOR_BLACK = 0, /**< The colour index for black. */ | |||
| CUCUL_COLOR_BLUE = 1, /**< The colour index for blue. */ | |||
| CUCUL_COLOR_GREEN = 2, /**< The colour index for green. */ | |||
| CUCUL_COLOR_CYAN = 3, /**< The colour index for cyan. */ | |||
| CUCUL_COLOR_RED = 4, /**< The colour index for red. */ | |||
| CUCUL_COLOR_MAGENTA = 5, /**< The colour index for magenta. */ | |||
| CUCUL_COLOR_BROWN = 6, /**< The colour index for brown. */ | |||
| CUCUL_COLOR_LIGHTGRAY = 7, /**< The colour index for light gray. */ | |||
| CUCUL_COLOR_DARKGRAY = 8, /**< The colour index for dark gray. */ | |||
| CUCUL_COLOR_LIGHTBLUE = 9, /**< The colour index for blue. */ | |||
| CUCUL_COLOR_LIGHTGREEN = 10, /**< The colour index for light green. */ | |||
| CUCUL_COLOR_LIGHTCYAN = 11, /**< The colour index for light cyan. */ | |||
| CUCUL_COLOR_LIGHTRED = 12, /**< The colour index for light red. */ | |||
| CUCUL_COLOR_LIGHTMAGENTA = 13, /**< The colour index for light magenta. */ | |||
| CUCUL_COLOR_YELLOW = 14, /**< The colour index for yellow. */ | |||
| CUCUL_COLOR_WHITE = 15 /**< The colour index for white. */ | |||
| CUCUL_COLOR_BLACK = 0x0, /**< The colour index for black. */ | |||
| CUCUL_COLOR_BLUE = 0x1, /**< The colour index for blue. */ | |||
| CUCUL_COLOR_GREEN = 0x2, /**< The colour index for green. */ | |||
| CUCUL_COLOR_CYAN = 0x3, /**< The colour index for cyan. */ | |||
| CUCUL_COLOR_RED = 0x4, /**< The colour index for red. */ | |||
| CUCUL_COLOR_MAGENTA = 0x5, /**< The colour index for magenta. */ | |||
| CUCUL_COLOR_BROWN = 0x6, /**< The colour index for brown. */ | |||
| CUCUL_COLOR_LIGHTGRAY = 0x7, /**< The colour index for light gray. */ | |||
| CUCUL_COLOR_DARKGRAY = 0x8, /**< The colour index for dark gray. */ | |||
| CUCUL_COLOR_LIGHTBLUE = 0x9, /**< The colour index for blue. */ | |||
| CUCUL_COLOR_LIGHTGREEN = 0xa, /**< The colour index for light green. */ | |||
| CUCUL_COLOR_LIGHTCYAN = 0xb, /**< The colour index for light cyan. */ | |||
| CUCUL_COLOR_LIGHTRED = 0xc, /**< The colour index for light red. */ | |||
| CUCUL_COLOR_LIGHTMAGENTA = 0xd, /**< The colour index for light magenta. */ | |||
| CUCUL_COLOR_YELLOW = 0xe, /**< The colour index for yellow. */ | |||
| CUCUL_COLOR_WHITE = 0xf, /**< The colour index for white. */ | |||
| CUCUL_COLOR_TRANSPARENT = 0xfe, /**< The transparent colour. */ | |||
| CUCUL_COLOR_DEFAULT = 0xff, /**< The output driver's default colour. */ | |||
| }; | |||
| /** \brief Internal features. | |||
| * | |||
| * Internal libcaca features such as the rendering method or the dithering | |||
| * mode. | |||
| */ | |||
| enum cucul_feature | |||
| { | |||
| CUCUL_BACKGROUND = 0x10, /**< Properties of background characters. */ | |||
| CUCUL_BACKGROUND_BLACK = 0x11, /**< Draw only black backgrounds. */ | |||
| CUCUL_BACKGROUND_SOLID = 0x12, /**< Draw coloured solid backgorunds. */ | |||
| #define CUCUL_BACKGROUND_MIN 0x11 /**< First background property */ | |||
| #define CUCUL_BACKGROUND_MAX 0x12 /**< Last background property */ | |||
| CUCUL_ANTIALIASING = 0x20, /**< Antialiasing features. */ | |||
| CUCUL_ANTIALIASING_NONE = 0x21, /**< No antialiasing. */ | |||
| CUCUL_ANTIALIASING_PREFILTER = 0x22, /**< Prefilter antialiasing. */ | |||
| #define CUCUL_ANTIALIASING_MIN 0x21 /**< First antialiasing feature. */ | |||
| #define CUCUL_ANTIALIASING_MAX 0x22 /**< Last antialiasing feature. */ | |||
| CUCUL_DITHERING = 0x30, /**< Dithering methods */ | |||
| CUCUL_DITHERING_NONE = 0x31, /**< No dithering. */ | |||
| CUCUL_DITHERING_ORDERED2 = 0x32, /**< Ordered 2x2 Bayer dithering. */ | |||
| CUCUL_DITHERING_ORDERED4 = 0x33, /**< Ordered 4x4 Bayer dithering. */ | |||
| CUCUL_DITHERING_ORDERED8 = 0x34, /**< Ordered 8x8 Bayer dithering. */ | |||
| CUCUL_DITHERING_RANDOM = 0x35, /**< Random dithering. */ | |||
| CUCUL_DITHERING_FSTEIN = 0x36, /**< Floyd-Steinberg dithering. */ | |||
| #define CUCUL_DITHERING_MIN 0x31 /**< First dithering feature. */ | |||
| #define CUCUL_DITHERING_MAX 0x36 /**< Last dithering feature. */ | |||
| CUCUL_FEATURE_UNKNOWN = 0xffff /**< Unknown feature. */ | |||
| }; | |||
| /* | |||
| * Backwards compatibility macros | |||
| */ | |||
| #if !defined(_DOXYGEN_SKIP_ME) | |||
| #define caca_dithering cucul_feature | |||
| #define caca_set_dithering caca_set_feature | |||
| #define caca_get_dithering_name caca_get_feature_name | |||
| #define CACA_DITHER_NONE CUCUL_DITHERING_NONE | |||
| #define CACA_DITHER_ORDERED CUCUL_DITHERING_ORDERED8 | |||
| #define CACA_DITHER_RANDOM CUCUL_DITHERING_RANDOM | |||
| #endif | |||
| typedef struct cucul_context cucul_t; | |||
| /** \defgroup basic Basic functions | |||
| @@ -109,9 +68,6 @@ cucul_t * cucul_load(void *, unsigned int); | |||
| void cucul_set_size(cucul_t *, unsigned int, unsigned int); | |||
| unsigned int cucul_get_width(cucul_t *); | |||
| unsigned int cucul_get_height(cucul_t *); | |||
| enum cucul_feature cucul_get_feature(cucul_t *, enum cucul_feature); | |||
| void cucul_set_feature(cucul_t *, enum cucul_feature); | |||
| char const *cucul_get_feature_name(enum cucul_feature); | |||
| void cucul_free(cucul_t *); | |||
| /* @} */ | |||
| @@ -209,9 +165,21 @@ struct cucul_bitmap *cucul_create_bitmap(unsigned int, unsigned int, | |||
| void cucul_set_bitmap_palette(struct cucul_bitmap *, | |||
| unsigned int r[], unsigned int g[], | |||
| unsigned int b[], unsigned int a[]); | |||
| void cucul_set_bitmap_brightness(struct cucul_bitmap *, float); | |||
| void cucul_set_bitmap_gamma(struct cucul_bitmap *, float); | |||
| void cucul_draw_bitmap(cucul_t *, int, int, int, int, struct cucul_bitmap const *, void *); | |||
| void cucul_set_bitmap_invert(struct cucul_bitmap *, unsigned char); | |||
| void cucul_set_bitmap_contrast(struct cucul_bitmap *, float); | |||
| void cucul_set_bitmap_invert(struct cucul_bitmap *, int); | |||
| void cucul_set_bitmap_antialias(struct cucul_bitmap *, int); | |||
| void cucul_set_bitmap_color(struct cucul_bitmap *, char const *); | |||
| char const * const * cucul_get_bitmap_color_list(struct cucul_bitmap const *); | |||
| void cucul_set_bitmap_charset(struct cucul_bitmap *, char const *); | |||
| char const * const * cucul_get_bitmap_charset_list(struct cucul_bitmap | |||
| const *); | |||
| void cucul_set_bitmap_dithering(struct cucul_bitmap *, char const *); | |||
| char const * const * cucul_get_bitmap_dithering_list(struct cucul_bitmap | |||
| const *); | |||
| void cucul_draw_bitmap(cucul_t *, int, int, int, int, | |||
| struct cucul_bitmap const *, void *); | |||
| void cucul_free_bitmap(struct cucul_bitmap *); | |||
| /* @} */ | |||
| @@ -43,9 +43,6 @@ struct cucul_context | |||
| enum cucul_color fgcolor; | |||
| enum cucul_color bgcolor; | |||
| /* Internal libcucul features */ | |||
| enum cucul_feature background, antialiasing, dithering; | |||
| unsigned int refcount; | |||
| }; | |||
| @@ -100,12 +100,14 @@ int main(int argc, char **argv) | |||
| bounds = (bounds + 1) % 2; | |||
| display_menu(); | |||
| break; | |||
| #if 0 | |||
| case 'd': | |||
| case 'D': | |||
| dithering = (dithering + 1) % 5; | |||
| cucul_set_feature(qq, dithering); | |||
| display_menu(); | |||
| break; | |||
| #endif | |||
| case 'c': | |||
| demo = demo_color; | |||
| break; | |||
| @@ -217,8 +219,8 @@ static void display_menu(void) | |||
| outline == 0 ? "none" : outline == 1 ? "solid" : "thin"); | |||
| cucul_printf(qq, 4, 18, "'b': drawing boundaries: %s", | |||
| bounds == 0 ? "screen" : "infinite"); | |||
| cucul_printf(qq, 4, 19, "'d': dithering (%s)", | |||
| cucul_get_feature_name(dithering)); | |||
| //cucul_printf(qq, 4, 19, "'d': dithering (%s)", | |||
| // cucul_get_feature_name(dithering)); | |||
| cucul_putstr(qq, 4, yo - 2, "'q': quit"); | |||