aboutsummaryrefslogtreecommitdiffstats
path: root/w3mimg/fb/fb_w3mimg.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--w3mimg/fb/fb_w3mimg.c202
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;
+}