diff options
Diffstat (limited to '')
-rw-r--r-- | w3mimg/fb/fb_w3mimg.c | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/w3mimg/fb/fb_w3mimg.c b/w3mimg/fb/fb_w3mimg.c new file mode 100644 index 0000000..b67bad1 --- /dev/null +++ b/w3mimg/fb/fb_w3mimg.c @@ -0,0 +1,202 @@ +/* $Id: fb_w3mimg.c,v 1.13 2003/08/29 15:06:52 ukai Exp $ */ +#include <stdio.h> +#include <stdlib.h> +#include <ctype.h> +#include <string.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> + +#include "w3mimg/fb/fb.h" +#include "w3mimg/fb/fb_img.h" +#include "w3mimg/w3mimg.h" + +static int +w3mfb_init(w3mimg_op * self) +{ + if (self == NULL) + return 0; + return 1; +} + +static int +w3mfb_finish(w3mimg_op * self) +{ + if (self == NULL) + return 0; + return 1; +} + +static int +w3mfb_active(w3mimg_op * self) +{ + if (self == NULL) + return 0; + return 1; +} + +static void +w3mfb_set_background(w3mimg_op * self, char *background) +{ + if (self == NULL) + return; + if (background) { + int r, g, b; + if (sscanf(background, "#%02x%02x%02x", &r, &g, &b) == 3) + fb_image_set_bg(r, g, b); + } +} + +static void +w3mfb_sync(w3mimg_op * self) +{ + return; +} + +static void +w3mfb_close(w3mimg_op * self) +{ + fb_close(); +} + +static int +w3mfb_clear(w3mimg_op * self, int x, int y, int w, int h) +{ + if (self == NULL) + return 0; + fb_image_clear(x, y, w, h); + return 1; +} + +static int +w3mfb_load_image(w3mimg_op * self, W3MImage * img, char *fname, int w, int h) +{ + FB_IMAGE **im; + + if (self == NULL) + return 0; + im = fb_image_load(fname, w, h, self->max_anim); + if (!im) + return 0; + img->pixmap = im; + img->width = im[0]->width; + img->height = im[0]->height; + return 1; +} + +static int +w3mfb_show_image(w3mimg_op * self, W3MImage * img, int sx, int sy, + int sw, int sh, int x, int y) +{ + int i; + FB_IMAGE **frame; +#define WAIT_CNT 4 + + if (self == NULL) + return 0; + + if (img->pixmap == NULL) + return 0; + + frame = (FB_IMAGE **) img->pixmap; + i = frame[0]->id; + fb_image_draw(frame[i], + x + self->offset_x, y + self->offset_y, + sx, sy, (sw ? sw : img->width), (sh ? sh : img->height)); + if (frame[0]->num > 1) { + if (frame[1]->id > WAIT_CNT) { + frame[1]->id = 0; + if (i < frame[0]->num - 1) + frame[0]->id = i + 1; + else + frame[0]->id = 0; + } + frame[1]->id += 1; + } + return 1; +} + +static void +w3mfb_free_image(w3mimg_op * self, W3MImage * img) +{ + if (self == NULL) + return; + if (img && img->pixmap) { + fb_frame_free((FB_IMAGE **) img->pixmap); + img->pixmap = NULL; + img->width = 0; + img->height = 0; + } +} + +static int +w3mfb_get_image_size(w3mimg_op * self, W3MImage * img, + char *fname, int *w, int *h) +{ + int i; + + if (self == NULL) + return 0; + i = get_image_size(fname, w, h); + if (i) + return 0; + return 1; +} + +#ifdef W3MIMGDISPLAY_SETUID +static int +check_tty_console(char *tty) +{ + if (tty == NULL || *tty == '\0') + return 0; + if (strncmp(tty, "/dev/", 5) == 0) + tty += 5; + if (strncmp(tty, "tty", 3) == 0 && isdigit(*(tty + 3))) + return 1; + if (strncmp(tty, "vc/", 3) == 0 && isdigit(*(tty + 3))) + return 1; + return 0; +} +#else +#define check_tty_console(tty) 1 +#endif + +w3mimg_op * +w3mimg_fbopen() +{ + w3mimg_op *wop = NULL; + wop = (w3mimg_op *) malloc(sizeof(w3mimg_op)); + if (wop == NULL) + return NULL; + memset(wop, 0, sizeof(w3mimg_op)); + + if (!check_tty_console(getenv("W3M_TTY")) && strcmp("jfbterm", getenv("TERM")) != 0) { + fprintf(stderr, "w3mimgdisplay/fb: tty is not console\n"); + goto error; + } + + if (fb_open()) + goto error; + + wop->width = fb_width(); + wop->height = fb_height(); + + wop->init = w3mfb_init; + wop->finish = w3mfb_finish; + wop->active = w3mfb_active; + wop->set_background = w3mfb_set_background; + wop->sync = w3mfb_sync; + wop->close = w3mfb_close; + wop->clear = w3mfb_clear; + + wop->load_image = w3mfb_load_image; + wop->show_image = w3mfb_show_image; + wop->free_image = w3mfb_free_image; + wop->get_image_size = w3mfb_get_image_size; + + return wop; + error: + free(wop); + return NULL; +} |