+ Internally cache screen width and height.
* src/bitmap.c:
+ Added alpha support to caca_draw_bitmap(). For now, we only treat 0%
alpha as fully transparent, and any other value as fully opaque.
+ Slightly tuned colour weights in the renderer.
+ caca_set_bitmap_palette() takes unsigned ints.
* examples/demo.c:
+ Added a crap render demo.
* examples/aafire.c:
+ Set a 20ms delay.
+ Added alpha values to the palette.
* examples/view.c:
+ Draw a gray checkered grid below the image so that transparent images
look a lot nicer.
+ 'f' toggles "fullscreen" mode.
tags/v0.99.beta14
| @@ -95,7 +95,7 @@ initialize (void) | |||
| { | |||
| int i; | |||
| #ifdef LIBCACA | |||
| int r[256], g[256], b[256]; | |||
| int r[256], g[256], b[256], a[256]; | |||
| #endif | |||
| #ifdef LIBCACA | |||
| @@ -104,6 +104,7 @@ initialize (void) | |||
| printf ("Failed to initialize libcaca\n"); | |||
| exit (1); | |||
| } | |||
| caca_set_delay(20000); | |||
| #else | |||
| context = aa_autoinit (&aa_defparams); | |||
| if (context == NULL) | |||
| @@ -121,6 +122,7 @@ initialize (void) | |||
| r[i] = pal[i * 3] * 64; | |||
| g[i] = pal[i * 3 + 1] * 64; | |||
| b[i] = pal[i * 3 + 2] * 64; | |||
| a[i] = 0xfff; | |||
| } | |||
| #else | |||
| aa_setpalette (palette, i, pal[i * 3] * 4, | |||
| @@ -128,14 +130,13 @@ initialize (void) | |||
| #endif | |||
| #ifdef LIBCACA | |||
| caca_bitmap = caca_create_bitmap(8, XSIZ, YSIZ - 4, XSIZ, 0, 0, 0); | |||
| caca_set_bitmap_palette(caca_bitmap, r, g, b); | |||
| caca_bitmap = caca_create_bitmap(8, XSIZ, YSIZ - 2, XSIZ, 0, 0, 0, 0); | |||
| caca_set_bitmap_palette(caca_bitmap, r, g, b, a); | |||
| bitmap = malloc(XSIZ * YSIZ * sizeof(char)); | |||
| caca_set_dithering(CACA_DITHERING_ORDERED8); | |||
| #else | |||
| aa_hidecursor (context); | |||
| #endif | |||
| fprintf(stderr, "%i %i\n", XSIZ, YSIZ); | |||
| } | |||
| static void | |||
| uninitialize (void) | |||
| @@ -40,6 +40,7 @@ static void demo_boxes(void); | |||
| static void demo_ellipses(void); | |||
| static void demo_triangles(void); | |||
| static void demo_sprites(void); | |||
| static void demo_render(void); | |||
| int bounds = 0; | |||
| int outline = 0; | |||
| @@ -130,6 +131,9 @@ int main(int argc, char **argv) | |||
| case 'S': | |||
| if(sprite) | |||
| demo = demo_sprites; | |||
| case 'r': | |||
| case 'R': | |||
| demo = demo_render; | |||
| break; | |||
| } | |||
| @@ -193,8 +197,9 @@ static void display_menu(void) | |||
| caca_putstr(4, 11, "'4': triangles"); | |||
| caca_putstr(4, 12, "'5': ellipses"); | |||
| caca_putstr(4, 13, "'c': colour"); | |||
| caca_putstr(4, 14, "'r': render"); | |||
| if(sprite) | |||
| caca_putstr(4, 14, "'s': sprites"); | |||
| caca_putstr(4, 15, "'s': sprites"); | |||
| caca_putstr(4, 16, "settings:"); | |||
| caca_printf(4, 17, "'o': outline: %s", | |||
| @@ -460,3 +465,103 @@ static void demo_sprites(void) | |||
| caca_rand(0, caca_get_height() - 1), sprite, 0); | |||
| } | |||
| #if 0 | |||
| static void demo_render(void) | |||
| { | |||
| struct caca_bitmap *bitmap; | |||
| //short buffer[256*256]; | |||
| //short *dest = buffer; | |||
| int buffer[256*256]; | |||
| int *dest = buffer; | |||
| int x, y, z; | |||
| static int i = 0; | |||
| i = (i + 1) % 512; | |||
| z = i < 256 ? i : 511 - i; | |||
| for(x = 0; x < 256; x++) | |||
| for(y = 0; y < 256; y++) | |||
| { | |||
| //*dest++ = ((x >> 3) << 11) | ((y >> 2) << 5) | ((z >> 3)); | |||
| *dest++ = (x << 16) | (y << 8) | (z); | |||
| } | |||
| //bitmap = caca_create_bitmap(16, 256, 256, 2 * 256, 0xf800, 0x07e0, 0x001f, 0x0000); | |||
| bitmap = caca_create_bitmap(32, 256, 256, 4 * 256, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000); | |||
| caca_draw_bitmap(0, 0, caca_get_width() - 1, caca_get_height() - 1, | |||
| bitmap, buffer); | |||
| caca_free_bitmap(bitmap); | |||
| } | |||
| #endif | |||
| static void draw_circle(int *buffer, int xo, int yo, int r, int mask, int val); | |||
| static void demo_render(void) | |||
| { | |||
| struct caca_bitmap *bitmap; | |||
| int buffer[256*256]; | |||
| int *dest; | |||
| int x, y, z, t, xo, yo; | |||
| static int i = 0; | |||
| i++; | |||
| dest = buffer; | |||
| for(x = 0; x < 256; x++) | |||
| for(y = 0; y < 256; y++) | |||
| { | |||
| *dest++ = 0; | |||
| } | |||
| /* red */ | |||
| xo = 128 + 48 * sin(0.02 * i); | |||
| yo = 128 + 48 * cos(0.03 * i); | |||
| t = 256 * (2.0 + sin(4 + 0.017 * i)) / 3; | |||
| for(z = 0; z < 240; z++) | |||
| draw_circle(buffer, xo, yo, z, 0x00ff0000, | |||
| ((255 - z) * t / 256) << 16); | |||
| /* green */ | |||
| xo = 128 + 48 * sin(2 + 0.06 * i); | |||
| yo = 128 + 48 * cos(2 + 0.05 * i); | |||
| t = 256 * (2.0 + sin(8 + 0.021 * i)) / 3; | |||
| for(z = 0; z < 240; z++) | |||
| draw_circle(buffer, xo, yo, z, 0x0000ff00, | |||
| ((255 - z) * t / 256) << 8); | |||
| /* blue */ | |||
| xo = 128 + 48 * sin(1 + 0.04 * i); | |||
| yo = 128 + 48 * cos(1 + 0.03 * i); | |||
| t = 256 * (2.0 + sin(3 + 0.033 * i)) / 3; | |||
| for(z = 0; z < 240; z++) | |||
| draw_circle(buffer, xo, yo, z, 0x000000ff, (255 - z) * t / 256); | |||
| bitmap = caca_create_bitmap(32, 256, 256, 4 * 256, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000); | |||
| caca_draw_bitmap(0, 0, caca_get_width() - 1, caca_get_height() - 1, | |||
| bitmap, (char *)buffer); | |||
| caca_free_bitmap(bitmap); | |||
| } | |||
| static void draw_circle(int *buffer, int x, int y, int r, int mask, int val) | |||
| { | |||
| int t, dx, dy; | |||
| #define POINT(X,Y) \ | |||
| buffer[(X) + 256 * (Y)] = (buffer[(X) + 256 * (Y)] & ~mask) | val; | |||
| for(t = 0, dx = 0, dy = r; dx <= dy; dx++) | |||
| { | |||
| POINT(x - dx / 3, y - dy / 3); | |||
| POINT(x + dx / 3, y - dy / 3); | |||
| POINT(x - dx / 3, y + dy / 3); | |||
| POINT(x + dx / 3, y + dy / 3); | |||
| POINT(x - dy / 3, y - dx / 3); | |||
| POINT(x + dy / 3, y - dx / 3); | |||
| POINT(x - dy / 3, y + dx / 3); | |||
| POINT(x + dy / 3, y + dx / 3); | |||
| t += t > 0 ? dx - dy-- : dx; | |||
| } | |||
| } | |||
| @@ -32,23 +32,25 @@ | |||
| #include "caca.h" | |||
| /* Local functions */ | |||
| static void load_image(const char *); | |||
| static void draw_checkers(unsigned int, unsigned int, | |||
| unsigned int, unsigned int); | |||
| /* Local variables */ | |||
| Imlib_Image image = NULL; | |||
| char *pixels = NULL; | |||
| struct caca_bitmap *bitmap = NULL; | |||
| int x, y, w, h; | |||
| const unsigned int rmask = 0x00ff0000, gmask = 0x0000ff00, bmask = 0x000000ff; | |||
| int dithering = CACA_DITHERING_ORDERED4; | |||
| static void load_image(const char *); | |||
| int main(int argc, char **argv) | |||
| { | |||
| int quit = 0, update = 1, help = 0, reload = 0; | |||
| int i, zoom = 0; | |||
| int quit = 0, update = 1, help = 0, reload = 0, fullscreen = 0, zoom = 0; | |||
| int dithering = CACA_DITHERING_ORDERED4; | |||
| char **list = NULL; | |||
| int current = 0, items = 0, opts = 1; | |||
| int i; | |||
| /* Initialise libcaca */ | |||
| if(caca_init()) | |||
| @@ -101,6 +103,11 @@ int main(int argc, char **argv) | |||
| if(items) current = (items + current - 1) % items; | |||
| reload = 1; | |||
| break; | |||
| case CACA_EVENT_KEY_PRESS | 'f': | |||
| case CACA_EVENT_KEY_PRESS | 'F': | |||
| fullscreen = ~fullscreen; | |||
| update = 1; | |||
| break; | |||
| case CACA_EVENT_KEY_PRESS | 'd': | |||
| dithering = (dithering + 1) % 5; | |||
| update = 1; | |||
| @@ -203,6 +210,7 @@ int main(int argc, char **argv) | |||
| int yo = (wh - 1) / 2; | |||
| int xn = (ww - 1) / (2 - zoom); | |||
| int yn = (wh - 1) / (2 - zoom); | |||
| draw_checkers(xo - xn, yo - yn, xo + xn, yo + yn); | |||
| caca_draw_bitmap(xo - xn, yo - yn, xo + xn, yo + yn, | |||
| bitmap, pixels); | |||
| } | |||
| @@ -216,27 +224,40 @@ int main(int argc, char **argv) | |||
| if(xn + x > w) x = w - xn; | |||
| if(yn + y > h) y = h - yn; | |||
| newbitmap = caca_create_bitmap(32, 2 * xn, 2 * yn, 4 * w, | |||
| rmask, gmask, bmask); | |||
| caca_draw_bitmap(0, 0, ww - 1, wh - 1, newbitmap, | |||
| 0x00ff0000, 0x0000ff00, 0x000000ff, | |||
| 0xff000000); | |||
| draw_checkers(0, fullscreen ? 0 : 1, | |||
| ww - 1, fullscreen ? wh - 1 : wh - 2); | |||
| caca_draw_bitmap(0, fullscreen ? 0 : 1, | |||
| ww - 1, fullscreen ? wh - 1 : wh - 2, | |||
| newbitmap, | |||
| pixels + 4 * (x - xn) + 4 * w * (y - yn)); | |||
| caca_free_bitmap(newbitmap); | |||
| } | |||
| else | |||
| { | |||
| caca_draw_bitmap(0, 0, ww - 1, wh - 1, bitmap, pixels); | |||
| draw_checkers(0, fullscreen ? 0 : 1, | |||
| ww - 1, fullscreen ? wh - 1 : wh - 2); | |||
| caca_draw_bitmap(0, fullscreen ? 0 : 1, | |||
| ww - 1, fullscreen ? wh - 1 : wh - 2, | |||
| bitmap, pixels); | |||
| } | |||
| caca_set_color(CACA_COLOR_WHITE, CACA_COLOR_BLUE); | |||
| caca_draw_line(0, 0, ww - 1, 0, ' '); | |||
| caca_draw_line(0, wh - 1, ww - 1, wh - 1, '-'); | |||
| caca_putstr(0, 0, "q:Quit n/p:Next/Prev +/-/x:Zoom " | |||
| "h/j/k/l: Move d:Dithering"); | |||
| caca_putstr(ww - strlen("?:Help"), 0, "?:Help"); | |||
| caca_printf(3, wh - 1, "cacaview %s", VERSION); | |||
| caca_printf(ww / 2 - 5, wh - 1, "(%s dithering)", | |||
| caca_get_dithering_name(dithering)); | |||
| caca_printf(ww - 14, wh - 1, | |||
| "(zoom: %s%i)", zoom > 0 ? "+" : "", zoom); | |||
| if(!fullscreen) | |||
| { | |||
| caca_draw_line(0, 0, ww - 1, 0, ' '); | |||
| caca_draw_line(0, wh - 1, ww - 1, wh - 1, '-'); | |||
| caca_putstr(0, 0, "q:Quit n/p:Next/Prev +/-/x:Zoom " | |||
| "h/j/k/l: Move d:Dithering"); | |||
| caca_putstr(ww - strlen("?:Help"), 0, "?:Help"); | |||
| caca_printf(3, wh - 1, "cacaview %s", VERSION); | |||
| caca_printf(ww / 2 - 5, wh - 1, "(%s dithering)", | |||
| caca_get_dithering_name(dithering)); | |||
| caca_printf(ww - 14, wh - 1, | |||
| "(zoom: %s%i)", zoom > 0 ? "+" : "", zoom); | |||
| } | |||
| if(help) | |||
| { | |||
| @@ -298,7 +319,8 @@ static void load_image(const char *name) | |||
| y = h / 2; | |||
| /* Create the libcaca bitmap */ | |||
| bitmap = caca_create_bitmap(32, w, h, 4 * w, rmask, gmask, bmask); | |||
| bitmap = caca_create_bitmap(32, w, h, 4 * w, 0x00ff0000, 0x0000ff00, | |||
| 0x000000ff, 0xff000000); | |||
| if(!bitmap) | |||
| { | |||
| imlib_free_image(); | |||
| @@ -306,3 +328,19 @@ static void load_image(const char *name) | |||
| } | |||
| } | |||
| static void draw_checkers(unsigned int x1, unsigned int y1, | |||
| unsigned int x2, unsigned int y2) | |||
| { | |||
| unsigned int xn, yn; | |||
| for(yn = y1; yn <= y2; yn++) | |||
| for(xn = x1; xn <= x2; xn++) | |||
| { | |||
| if(((xn / 4) ^ (yn / 2)) & 1) | |||
| caca_set_color(CACA_COLOR_LIGHTGRAY, CACA_COLOR_DARKGRAY); | |||
| else | |||
| caca_set_color(CACA_COLOR_DARKGRAY, CACA_COLOR_LIGHTGRAY); | |||
| caca_putchar(xn, yn, ' '); | |||
| } | |||
| } | |||
| @@ -50,8 +50,9 @@ typedef unsigned int uint32_t; | |||
| static void mask2shift(unsigned int, int *, int *); | |||
| static void get_rgb_default(struct caca_bitmap *, uint8_t *, int, int, | |||
| unsigned int *, unsigned int *, unsigned int *); | |||
| static void get_rgba_default(const struct caca_bitmap *, uint8_t *, int, int, | |||
| unsigned int *, unsigned int *, unsigned int *, | |||
| unsigned int *); | |||
| static void rgb2hsv_default(int, int, int, int *, int *, int *); | |||
| /* Dithering methods */ | |||
| @@ -127,11 +128,11 @@ struct caca_bitmap | |||
| { | |||
| int bpp, palette; | |||
| int w, h, pitch; | |||
| int rmask, gmask, bmask; | |||
| int rright, gright, bright; | |||
| int rleft, gleft, bleft; | |||
| int rmask, gmask, bmask, amask; | |||
| int rright, gright, bright, aright; | |||
| int rleft, gleft, bleft, aleft; | |||
| void (*get_hsv)(struct caca_bitmap *, char *, int, int); | |||
| int red[256], green[256], blue[256]; | |||
| int red[256], green[256], blue[256], alpha[256]; | |||
| }; | |||
| static void mask2shift(unsigned int mask, int *right, int *left) | |||
| @@ -160,7 +161,8 @@ static void mask2shift(unsigned int mask, int *right, int *left) | |||
| } | |||
| struct caca_bitmap *caca_create_bitmap(int bpp, int w, int h, int pitch, | |||
| int rmask, int gmask, int bmask) | |||
| int rmask, int gmask, int bmask, | |||
| int amask) | |||
| { | |||
| struct caca_bitmap *bitmap; | |||
| @@ -182,13 +184,15 @@ struct caca_bitmap *caca_create_bitmap(int bpp, int w, int h, int pitch, | |||
| bitmap->rmask = rmask; | |||
| bitmap->gmask = gmask; | |||
| bitmap->bmask = bmask; | |||
| bitmap->amask = amask; | |||
| /* Load bitmasks */ | |||
| if(rmask || gmask || bmask) | |||
| if(rmask || gmask || bmask || amask) | |||
| { | |||
| mask2shift(rmask, &bitmap->rright, &bitmap->rleft); | |||
| mask2shift(gmask, &bitmap->gright, &bitmap->gleft); | |||
| mask2shift(bmask, &bitmap->bright, &bitmap->bleft); | |||
| mask2shift(amask, &bitmap->aright, &bitmap->aleft); | |||
| } | |||
| /* In 8 bpp mode, default to a grayscale palette */ | |||
| @@ -198,9 +202,10 @@ struct caca_bitmap *caca_create_bitmap(int bpp, int w, int h, int pitch, | |||
| bitmap->palette = 1; | |||
| for(i = 0; i < 256; i++) | |||
| { | |||
| bitmap->red[i] = i * 0x10; | |||
| bitmap->green[i] = i * 0x10; | |||
| bitmap->blue[i] = i * 0x10; | |||
| bitmap->red[i] = i * 0xfff / 256; | |||
| bitmap->green[i] = i * 0xfff / 256; | |||
| bitmap->blue[i] = i * 0xfff / 256; | |||
| bitmap->alpha[i] = 0xfff; | |||
| } | |||
| } | |||
| @@ -208,7 +213,8 @@ struct caca_bitmap *caca_create_bitmap(int bpp, int w, int h, int pitch, | |||
| } | |||
| void caca_set_bitmap_palette(struct caca_bitmap *bitmap, | |||
| int red[], int green[], int blue[]) | |||
| unsigned int red[], unsigned int green[], | |||
| unsigned int blue[], unsigned int alpha[]) | |||
| { | |||
| int i; | |||
| @@ -219,11 +225,13 @@ void caca_set_bitmap_palette(struct caca_bitmap *bitmap, | |||
| { | |||
| if(red[i] >= 0 && red[i] < 0x1000 && | |||
| green[i] >= 0 && green[i] < 0x1000 && | |||
| blue[i] >= 0 && blue[i] < 0x1000) | |||
| blue[i] >= 0 && blue[i] < 0x1000 && | |||
| alpha[i] >= 0 && alpha[i] < 0x1000) | |||
| { | |||
| bitmap->red[i] = red[i]; | |||
| bitmap->green[i] = green[i]; | |||
| bitmap->blue[i] = blue[i]; | |||
| bitmap->alpha[i] = alpha[i]; | |||
| } | |||
| } | |||
| } | |||
| @@ -236,9 +244,9 @@ void caca_free_bitmap(struct caca_bitmap *bitmap) | |||
| free(bitmap); | |||
| } | |||
| static void get_rgb_default(struct caca_bitmap *bitmap, uint8_t *pixels, | |||
| int x, int y, unsigned int *r, | |||
| unsigned int *g, unsigned int *b) | |||
| static void get_rgba_default(const struct caca_bitmap *bitmap, uint8_t *pixels, | |||
| int x, int y, unsigned int *r, unsigned int *g, | |||
| unsigned int *b, unsigned int *a) | |||
| { | |||
| uint32_t bits; | |||
| @@ -254,8 +262,9 @@ static void get_rgb_default(struct caca_bitmap *bitmap, uint8_t *pixels, | |||
| #ifdef HAVE_ENDIAN_H | |||
| if(__BYTE_ORDER == __BIG_ENDIAN) | |||
| #else | |||
| static const uint32_t rmask = 0x12345678; | |||
| if(*(uint8_t *)&rmask == 0x12) | |||
| /* This is compile-time optimised with at least -O1 or -Os */ | |||
| const uint32_t rmask = 0x12345678; | |||
| if(*(const uint8_t *)&rmask == 0x12) | |||
| #endif | |||
| bits = ((uint32_t)pixels[0] << 16) | | |||
| ((uint32_t)pixels[1] << 8) | | |||
| @@ -280,12 +289,14 @@ static void get_rgb_default(struct caca_bitmap *bitmap, uint8_t *pixels, | |||
| *r = bitmap->red[bits]; | |||
| *g = bitmap->green[bits]; | |||
| *b = bitmap->blue[bits]; | |||
| *a = bitmap->alpha[bits]; | |||
| } | |||
| else | |||
| { | |||
| *r = ((bits & bitmap->rmask) >> bitmap->rright) << bitmap->rleft; | |||
| *g = ((bits & bitmap->gmask) >> bitmap->gright) << bitmap->gleft; | |||
| *b = ((bits & bitmap->bmask) >> bitmap->bright) << bitmap->bleft; | |||
| *a = ((bits & bitmap->amask) >> bitmap->aright) << bitmap->aleft; | |||
| } | |||
| } | |||
| @@ -320,7 +331,7 @@ static void rgb2hsv_default(int r, int g, int b, int *hue, int *sat, int *val) | |||
| } | |||
| void caca_draw_bitmap(int x1, int y1, int x2, int y2, | |||
| struct caca_bitmap *bitmap, char *pixels) | |||
| const struct caca_bitmap *bitmap, char *pixels) | |||
| { | |||
| #if !NEW_RENDERER | |||
| static const int white_colors[] = | |||
| @@ -358,18 +369,18 @@ void caca_draw_bitmap(int x1, int y1, int x2, int y2, | |||
| # define DENSITY_CHARS 13 | |||
| static const char density_chars[] = | |||
| " " | |||
| " " | |||
| ".` " | |||
| ",`.'" | |||
| "i:-^" | |||
| "|=+;" | |||
| "ox/\\" | |||
| "<>x%" | |||
| "&$zw" | |||
| "WXKM" | |||
| "#8##" | |||
| "8@8#" | |||
| "@8@8" | |||
| ". " | |||
| ".. " | |||
| "...." | |||
| "::::" | |||
| ";=;=" | |||
| "tftf" | |||
| "%$%$" | |||
| "&KSZ" | |||
| "WXGM" | |||
| "@@@@" | |||
| "8888" | |||
| "####" | |||
| "????"; | |||
| int x, y, w, h, pitch; | |||
| @@ -391,13 +402,13 @@ void caca_draw_bitmap(int x1, int y1, int x2, int y2, | |||
| int tmp = y2; y2 = y1; y1 = tmp; | |||
| } | |||
| for(y = y1 > 0 ? y1 : 0; y <= y2 && y <= (int)caca_get_height(); y++) | |||
| for(y = y1 > 0 ? y1 : 0; y <= y2 && y <= (int)_caca_height; y++) | |||
| for(x = x1 > 0 ? x1 : 0, _init_dither(y); | |||
| x <= x2 && x <= (int)caca_get_width(); | |||
| x <= x2 && x <= (int)_caca_width; | |||
| x++) | |||
| { | |||
| int ch; | |||
| unsigned int r, g, b, R, G, B; | |||
| unsigned int r, g, b, a, R, G, B; | |||
| int hue, sat, val; | |||
| int fromx = w * (x - x1) / (x2 - x1 + 1); | |||
| int fromy = h * (y - y1) / (y2 - y1 + 1); | |||
| @@ -413,18 +424,20 @@ void caca_draw_bitmap(int x1, int y1, int x2, int y2, | |||
| /* First get RGB */ | |||
| R = 0, G = 0, B = 0; | |||
| get_rgb_default(bitmap, pixels, fromx, fromy, &r, &g, &b); | |||
| get_rgba_default(bitmap, pixels, fromx, fromy, &r, &g, &b, &a); | |||
| if(a == 0) | |||
| continue; | |||
| #if 1 | |||
| R += r; G += g; B += b; | |||
| #else | |||
| R += r; G += g; B += b; | |||
| get_rgb_default(bitmap, pixels, fromx - 1, fromy, &r, &g, &b); | |||
| get_rgba_default(bitmap, pixels, fromx - 1, fromy, &r, &g, &b, &a); | |||
| R += r; G += g; B += b; | |||
| get_rgb_default(bitmap, pixels, fromx, fromy - 1, &r, &g, &b); | |||
| get_rgba_default(bitmap, pixels, fromx, fromy - 1, &r, &g, &b, &a); | |||
| R += r; G += g; B += b; | |||
| get_rgb_default(bitmap, pixels, fromx + 1, fromy, &r, &g, &b); | |||
| get_rgba_default(bitmap, pixels, fromx + 1, fromy, &r, &g, &b, &a); | |||
| R += r; G += g; B += b; | |||
| get_rgb_default(bitmap, pixels, fromx, fromy + 1, &r, &g, &b); | |||
| get_rgba_default(bitmap, pixels, fromx, fromy + 1, &r, &g, &b, &a); | |||
| R += r; G += g; B += b; | |||
| R /= 5; G /= 5; B /= 5; | |||
| #endif | |||
| @@ -443,6 +456,7 @@ void caca_draw_bitmap(int x1, int y1, int x2, int y2, | |||
| /* distance to black */ | |||
| distbg = XRATIO * val * val; | |||
| distbg += FUZZINESS * _get_dither() - 0x80 * FUZZINESS; | |||
| distbg = distbg * 2 / 4; | |||
| outbg = CACA_COLOR_BLACK; | |||
| /* distance to 30% */ | |||
| @@ -509,7 +523,7 @@ void caca_draw_bitmap(int x1, int y1, int x2, int y2, | |||
| + YRATIO * (sat - 0x1000) * (sat - 0x1000) | |||
| + HRATIO * (hue - hue2) * (hue - hue2); | |||
| dist += FUZZINESS * _get_dither() - 0x80 * FUZZINESS; | |||
| dist = dist * 3 / 4; | |||
| // dist = dist * 3 / 4; | |||
| if(dist <= distbg) | |||
| { | |||
| outfg = outbg; | |||
| @@ -528,7 +542,8 @@ void caca_draw_bitmap(int x1, int y1, int x2, int y2, | |||
| + YRATIO * (sat - 0x1000) * (sat - 0x1000) | |||
| + HRATIO * (hue - hue2) * (hue - hue2); | |||
| dist += FUZZINESS * _get_dither() - 0x80 * FUZZINESS; | |||
| dist = dist / 2; | |||
| //dist = dist * 3 / 4; | |||
| //dist = dist / 2; | |||
| if(dist <= distbg) | |||
| { | |||
| outfg = outbg; | |||
| @@ -58,8 +58,8 @@ void caca_draw_thin_box(int x1, int y1, int x2, int y2) | |||
| y1 = y2; y2 = tmp; | |||
| } | |||
| xmax = caca_get_width() - 1; | |||
| ymax = caca_get_height() - 1; | |||
| xmax = _caca_width - 1; | |||
| ymax = _caca_height - 1; | |||
| if(x2 < 0 || y2 < 0 || x1 > xmax || y1 > ymax) | |||
| return; | |||
| @@ -111,8 +111,8 @@ void caca_fill_box(int x1, int y1, int x2, int y2, char c) | |||
| y1 = y2; y2 = tmp; | |||
| } | |||
| xmax = caca_get_width() - 1; | |||
| ymax = caca_get_height() - 1; | |||
| xmax = _caca_width - 1; | |||
| ymax = _caca_height - 1; | |||
| if(x2 < 0 || y2 < 0 || x1 > xmax || y1 > ymax) | |||
| return; | |||
| @@ -38,9 +38,6 @@ | |||
| #elif defined(USE_CONIO) | |||
| # include <dos.h> | |||
| # include <conio.h> | |||
| # if defined(SCREENUPDATE_IN_PC_H) | |||
| # include <pc.h> | |||
| # endif | |||
| #else | |||
| # error "no graphics library detected" | |||
| #endif | |||
| @@ -62,7 +59,6 @@ int _caca_attr[16*16]; | |||
| #endif | |||
| #if defined(USE_CONIO) | |||
| static struct text_info ti; | |||
| char *_caca_screen; | |||
| #endif | |||
| @@ -132,24 +128,12 @@ int caca_init(void) | |||
| unsigned int caca_get_width(void) | |||
| { | |||
| #if defined(USE_SLANG) | |||
| return SLtt_Screen_Cols; | |||
| #elif defined(USE_NCURSES) | |||
| return COLS; | |||
| #elif defined(USE_CONIO) | |||
| return ti.screenwidth; | |||
| #endif | |||
| return _caca_width; | |||
| } | |||
| unsigned int caca_get_height(void) | |||
| { | |||
| #if defined(USE_SLANG) | |||
| return SLtt_Screen_Rows; | |||
| #elif defined(USE_NCURSES) | |||
| return LINES; | |||
| #else | |||
| return ti.screenheight; | |||
| #endif | |||
| return _caca_height; | |||
| } | |||
| const char *caca_get_color_name(enum caca_color color) | |||
| @@ -212,7 +196,7 @@ void caca_end(void) | |||
| _wscroll = 1; | |||
| textcolor((enum COLORS)WHITE); | |||
| textbackground((enum COLORS)BLACK); | |||
| gotoxy(caca_get_width(), caca_get_height()); | |||
| gotoxy(_caca_width, _caca_height); | |||
| cputs("\r\n"); | |||
| _setcursortype(_NORMALCURSOR); | |||
| #endif | |||
| @@ -200,21 +200,22 @@ unsigned int caca_sqrt(unsigned int); | |||
| */ | |||
| struct caca_sprite; | |||
| struct caca_sprite * caca_load_sprite(const char *); | |||
| int caca_get_sprite_frames(struct caca_sprite *); | |||
| int caca_get_sprite_width(struct caca_sprite *, int); | |||
| int caca_get_sprite_height(struct caca_sprite *, int); | |||
| int caca_get_sprite_dx(struct caca_sprite *, int); | |||
| int caca_get_sprite_dy(struct caca_sprite *, int); | |||
| void caca_draw_sprite(int, int, struct caca_sprite *, int); | |||
| int caca_get_sprite_frames(const struct caca_sprite *); | |||
| int caca_get_sprite_width(const struct caca_sprite *, int); | |||
| int caca_get_sprite_height(const struct caca_sprite *, int); | |||
| int caca_get_sprite_dx(const struct caca_sprite *, int); | |||
| int caca_get_sprite_dy(const struct caca_sprite *, int); | |||
| void caca_draw_sprite(int, int, const struct caca_sprite *, int); | |||
| void caca_free_sprite(struct caca_sprite *); | |||
| /* | |||
| * Bitmap handling | |||
| */ | |||
| struct caca_bitmap; | |||
| struct caca_bitmap *caca_create_bitmap(int, int, int, int, int, int, int); | |||
| void caca_set_bitmap_palette(struct caca_bitmap *, int[], int[], int[]); | |||
| void caca_draw_bitmap(int, int, int, int, struct caca_bitmap *, char *); | |||
| struct caca_bitmap *caca_create_bitmap(int, int, int, int, int, int, int, int); | |||
| void caca_set_bitmap_palette(struct caca_bitmap *, unsigned int[], | |||
| unsigned int[], unsigned int[], unsigned int[]); | |||
| void caca_draw_bitmap(int, int, int, int, const struct caca_bitmap *, char *); | |||
| void caca_free_bitmap(struct caca_bitmap *); | |||
| #ifdef __cplusplus | |||
| @@ -37,9 +37,13 @@ extern int _caca_attr[]; | |||
| #endif | |||
| #if defined(USE_CONIO) | |||
| extern struct text_info _ti; | |||
| extern char *_caca_screen; | |||
| #endif | |||
| extern unsigned int _caca_width; | |||
| extern unsigned int _caca_height; | |||
| extern char *_caca_empty_line; | |||
| extern char *_caca_scratch_line; | |||
| @@ -191,13 +191,13 @@ static void ellipsepoints(int xo, int yo, int x, int y, char c) | |||
| { | |||
| uint8_t b = 0; | |||
| if(xo + x >= 0 && xo + x < (int)caca_get_width()) | |||
| if(xo + x >= 0 && xo + x < (int)_caca_width) | |||
| b |= 0x1; | |||
| if(xo - x >= 0 && xo - x < (int)caca_get_width()) | |||
| if(xo - x >= 0 && xo - x < (int)_caca_width) | |||
| b |= 0x2; | |||
| if(yo + y >= 0 && yo + y < (int)caca_get_height()) | |||
| if(yo + y >= 0 && yo + y < (int)_caca_height) | |||
| b |= 0x4; | |||
| if(yo - y >= 0 && yo - y < (int)caca_get_height()) | |||
| if(yo - y >= 0 && yo - y < (int)_caca_height) | |||
| b |= 0x8; | |||
| if((b & (0x1|0x4)) == (0x1|0x4)) | |||
| @@ -35,6 +35,9 @@ | |||
| # include <curses.h> | |||
| #elif defined(USE_CONIO) | |||
| # include <conio.h> | |||
| # if defined(SCREENUPDATE_IN_PC_H) | |||
| # include <pc.h> | |||
| # endif | |||
| #else | |||
| # error "no graphics library detected" | |||
| #endif | |||
| @@ -54,6 +57,13 @@ | |||
| #include "caca.h" | |||
| #include "caca_internals.h" | |||
| #ifdef USE_CONIO | |||
| static struct text_info ti; | |||
| #endif | |||
| unsigned int _caca_width; | |||
| unsigned int _caca_height; | |||
| static unsigned int _caca_delay; | |||
| static unsigned int _caca_rendertime; | |||
| @@ -92,8 +102,8 @@ void caca_putchar(int x, int y, char c) | |||
| #if defined(USE_CONIO) | |||
| char *data; | |||
| #endif | |||
| if(x < 0 || x >= (int)caca_get_width() || | |||
| y < 0 || y >= (int)caca_get_height()) | |||
| if(x < 0 || x >= (int)_caca_width || | |||
| y < 0 || y >= (int)_caca_height) | |||
| return; | |||
| #if defined(USE_SLANG) | |||
| @@ -103,7 +113,7 @@ void caca_putchar(int x, int y, char c) | |||
| move(y, x); | |||
| addch(c); | |||
| #elif defined(USE_CONIO) | |||
| data = _caca_screen + 2 * (x + y * caca_get_width()); | |||
| data = _caca_screen + 2 * (x + y * _caca_width); | |||
| data[0] = c; | |||
| data[1] = (_caca_bgcolor << 4) | _caca_fgcolor; | |||
| // gotoxy(x + 1, y + 1); | |||
| @@ -115,7 +125,7 @@ void caca_putstr(int x, int y, const char *s) | |||
| { | |||
| unsigned int len; | |||
| if(y < 0 || y >= (int)caca_get_height() || x >= (int)caca_get_width()) | |||
| if(y < 0 || y >= (int)_caca_height || x >= (int)_caca_width) | |||
| return; | |||
| len = strlen(s); | |||
| @@ -129,10 +139,10 @@ void caca_putstr(int x, int y, const char *s) | |||
| x = 0; | |||
| } | |||
| if(x + len >= caca_get_width()) | |||
| if(x + len >= _caca_width) | |||
| { | |||
| memcpy(_caca_scratch_line, s, caca_get_width() - x); | |||
| _caca_scratch_line[caca_get_width() - x] = '\0'; | |||
| memcpy(_caca_scratch_line, s, _caca_width - x); | |||
| _caca_scratch_line[_caca_width - x] = '\0'; | |||
| s = _caca_scratch_line; | |||
| } | |||
| @@ -143,7 +153,7 @@ void caca_putstr(int x, int y, const char *s) | |||
| move(y, x); | |||
| addstr(s); | |||
| #elif defined(USE_CONIO) | |||
| char *buf = _caca_screen + 2 * (x + y * caca_get_width()); | |||
| char *buf = _caca_screen + 2 * (x + y * _caca_width); | |||
| while(*s) | |||
| { | |||
| *buf++ = *s++; | |||
| @@ -160,19 +170,19 @@ void caca_printf(int x, int y, const char *format, ...) | |||
| char *buf = tmp; | |||
| va_list args; | |||
| if(y < 0 || y >= (int)caca_get_height() || x >= (int)caca_get_width()) | |||
| if(y < 0 || y >= (int)_caca_height || x >= (int)_caca_width) | |||
| return; | |||
| if(caca_get_width() - x + 1 > BUFSIZ) | |||
| buf = malloc(caca_get_width() - x + 1); | |||
| if(_caca_width - x + 1 > BUFSIZ) | |||
| buf = malloc(_caca_width - x + 1); | |||
| va_start(args, format); | |||
| #if defined(HAVE_VSNPRINTF) | |||
| vsnprintf(buf, caca_get_width() - x + 1, format, args); | |||
| vsnprintf(buf, _caca_width - x + 1, format, args); | |||
| #else | |||
| vsprintf(buf, format, args); | |||
| #endif | |||
| buf[caca_get_width() - x] = '\0'; | |||
| buf[_caca_width - x] = '\0'; | |||
| va_end(args); | |||
| caca_putstr(x, y, buf); | |||
| @@ -185,7 +195,7 @@ void caca_clear(void) | |||
| { | |||
| enum caca_color oldfg = caca_get_fg_color(); | |||
| enum caca_color oldbg = caca_get_bg_color(); | |||
| int y = caca_get_height(); | |||
| int y = _caca_height; | |||
| caca_set_color(CACA_COLOR_LIGHTGRAY, CACA_COLOR_BLACK); | |||
| @@ -234,6 +244,9 @@ int _caca_init_graphics(void) | |||
| /* Disable alt charset support so that we get all 256 colour pairs */ | |||
| SLtt_Has_Alt_Charset = 0; | |||
| _caca_width = SLtt_Screen_Cols; | |||
| _caca_height = SLtt_Screen_Rows; | |||
| #elif defined(USE_NCURSES) | |||
| static int curses_colors[] = | |||
| { | |||
| @@ -292,6 +305,9 @@ int _caca_init_graphics(void) | |||
| } | |||
| } | |||
| _caca_width = COLS; | |||
| _caca_height = LINES; | |||
| #elif defined(USE_CONIO) | |||
| gettextinfo(&ti); | |||
| _caca_screen = malloc(2 * ti.screenwidth * ti.screenheight); | |||
| @@ -302,13 +318,15 @@ int _caca_init_graphics(void) | |||
| # else | |||
| /* FIXME */ | |||
| # endif | |||
| _caca_width = ti.screenwidth; | |||
| _caca_height = ti.screenheight; | |||
| #endif | |||
| _caca_empty_line = malloc(caca_get_width() + 1); | |||
| memset(_caca_empty_line, ' ', caca_get_width()); | |||
| _caca_empty_line[caca_get_width()] = '\0'; | |||
| _caca_empty_line = malloc(_caca_width + 1); | |||
| memset(_caca_empty_line, ' ', _caca_width); | |||
| _caca_empty_line[_caca_width] = '\0'; | |||
| _caca_scratch_line = malloc(caca_get_width() + 1); | |||
| _caca_scratch_line = malloc(_caca_width + 1); | |||
| _caca_delay = 0; | |||
| _caca_rendertime = 0; | |||
| @@ -171,7 +171,7 @@ static void clip_line(struct line* s) | |||
| } | |||
| else if(bits1 & (1<<1)) | |||
| { | |||
| int xmax = caca_get_width() - 1; | |||
| int xmax = _caca_width - 1; | |||
| s->y1 = s->y2 - (s->x2 - xmax) * (s->y2 - s->y1) / (s->x2 - s->x1); | |||
| s->x1 = xmax; | |||
| } | |||
| @@ -182,7 +182,7 @@ static void clip_line(struct line* s) | |||
| } | |||
| else if(bits1 & (1<<3)) | |||
| { | |||
| int ymax = caca_get_height() - 1; | |||
| int ymax = _caca_height - 1; | |||
| s->x1 = s->x2 - (s->y2 - ymax) * (s->x2 - s->x1) / (s->y2 - s->y1); | |||
| s->y1 = ymax; | |||
| } | |||
| @@ -203,12 +203,12 @@ static uint8_t clip_bits(int x, int y) | |||
| if(x < 0) | |||
| b |= (1<<0); | |||
| else if(x >= (int)caca_get_width()) | |||
| else if(x >= (int)_caca_width) | |||
| b |= (1<<1); | |||
| if(y < 0) | |||
| b |= (1<<2); | |||
| else if(y >= (int)caca_get_height()) | |||
| else if(y >= (int)_caca_height) | |||
| b |= (1<<3); | |||
| return b; | |||
| @@ -165,7 +165,7 @@ sprite_alloc_failed: | |||
| return NULL; | |||
| } | |||
| int caca_get_sprite_frames(struct caca_sprite *sprite) | |||
| int caca_get_sprite_frames(const struct caca_sprite *sprite) | |||
| { | |||
| if(sprite == NULL) | |||
| return 0; | |||
| @@ -173,7 +173,7 @@ int caca_get_sprite_frames(struct caca_sprite *sprite) | |||
| return sprite->nf; | |||
| } | |||
| int caca_get_sprite_width(struct caca_sprite *sprite, int f) | |||
| int caca_get_sprite_width(const struct caca_sprite *sprite, int f) | |||
| { | |||
| if(sprite == NULL) | |||
| return 0; | |||
| @@ -184,7 +184,7 @@ int caca_get_sprite_width(struct caca_sprite *sprite, int f) | |||
| return sprite->frames[f].w; | |||
| } | |||
| int caca_get_sprite_height(struct caca_sprite *sprite, int f) | |||
| int caca_get_sprite_height(const struct caca_sprite *sprite, int f) | |||
| { | |||
| if(sprite == NULL) | |||
| return 0; | |||
| @@ -195,7 +195,7 @@ int caca_get_sprite_height(struct caca_sprite *sprite, int f) | |||
| return sprite->frames[f].h; | |||
| } | |||
| int caca_get_sprite_dx(struct caca_sprite *sprite, int f) | |||
| int caca_get_sprite_dx(const struct caca_sprite *sprite, int f) | |||
| { | |||
| if(sprite == NULL) | |||
| return 0; | |||
| @@ -206,7 +206,7 @@ int caca_get_sprite_dx(struct caca_sprite *sprite, int f) | |||
| return sprite->frames[f].dx; | |||
| } | |||
| int caca_get_sprite_dy(struct caca_sprite *sprite, int f) | |||
| int caca_get_sprite_dy(const struct caca_sprite *sprite, int f) | |||
| { | |||
| if(sprite == NULL) | |||
| return 0; | |||
| @@ -217,7 +217,7 @@ int caca_get_sprite_dy(struct caca_sprite *sprite, int f) | |||
| return sprite->frames[f].dy; | |||
| } | |||
| void caca_draw_sprite(int x, int y, struct caca_sprite *sprite, int f) | |||
| void caca_draw_sprite(int x, int y, const struct caca_sprite *sprite, int f) | |||
| { | |||
| int i, j; | |||
| enum caca_color oldfg, oldbg; | |||
| @@ -70,8 +70,8 @@ void caca_fill_triangle(int x1, int y1, int x2, int y2, int x3, int y3, char c) | |||
| x2 *= 4; | |||
| x3 *= 4; | |||
| xmax = caca_get_width() - 1; | |||
| ymax = caca_get_height() - 1; | |||
| xmax = _caca_width - 1; | |||
| ymax = _caca_height - 1; | |||
| /* Rasterize our triangle */ | |||
| for(y = y1 < 0 ? 0 : y1; y <= y3 && y <= ymax; y++) | |||