w3m

Unnamed repository; edit this file to name it for gitweb.
git clone https://logand.com/git/w3m.git/
Log | Files | Refs | README

fb_w3mimg.c (3812B)


      1 /* $Id$ */
      2 #include <stdio.h>
      3 #include <stdlib.h>
      4 #include <ctype.h>
      5 #include <string.h>
      6 #include <unistd.h>
      7 #include <sys/types.h>
      8 #include <sys/stat.h>
      9 #include <fcntl.h>
     10 
     11 #include "w3mimg/fb/fb.h"
     12 #include "w3mimg/fb/fb_img.h"
     13 #include "w3mimg/w3mimg.h"
     14 
     15 static int
     16 w3mfb_init(w3mimg_op * self)
     17 {
     18     if (self == NULL)
     19 	return 0;
     20     /* XXX */
     21     return 1;
     22 }
     23 
     24 static int
     25 w3mfb_finish(w3mimg_op * self)
     26 {
     27     if (self == NULL)
     28 	return 0;
     29     return 1;
     30 }
     31 
     32 static int
     33 w3mfb_active(w3mimg_op * self)
     34 {
     35     if (self == NULL)
     36 	return 0;
     37     return 1;
     38 }
     39 
     40 static void
     41 w3mfb_set_background(w3mimg_op * self, char *background)
     42 {
     43     if (self == NULL)
     44 	return;
     45     if (background) {
     46 	int r, g, b;
     47 	if (sscanf(background, "#%02x%02x%02x", &r, &g, &b) == 3)
     48 	    fb_image_set_bg(r, g, b);
     49     }
     50 }
     51 
     52 static void
     53 w3mfb_sync(w3mimg_op * self)
     54 {
     55     return;
     56 }
     57 
     58 static void
     59 w3mfb_close(w3mimg_op * self)
     60 {
     61     fb_close();
     62 }
     63 
     64 static int
     65 w3mfb_clear(w3mimg_op * self, int x, int y, int w, int h)
     66 {
     67     if (self == NULL)
     68 	return 0;
     69     fb_image_clear(x, y, w, h);
     70     return 1;
     71 }
     72 
     73 static int
     74 w3mfb_load_image(w3mimg_op * self, W3MImage * img, char *fname, int w, int h)
     75 {
     76     FB_IMAGE **im;
     77 
     78     if (self == NULL)
     79 	return 0;
     80     im = fb_image_load(fname, w, h, self->max_anim);
     81     if (!im)
     82 	return 0;
     83     img->pixmap = im;
     84     img->width = im[0]->width;
     85     img->height = im[0]->height;
     86     return 1;
     87 }
     88 
     89 static int
     90 w3mfb_show_image(w3mimg_op * self, W3MImage * img, int sx, int sy,
     91 		 int sw, int sh, int x, int y)
     92 {
     93     int i;
     94     FB_IMAGE **frame;
     95 #define WAIT_CNT 4
     96 
     97     if (self == NULL)
     98 	return 0;
     99 
    100     if (img->pixmap == NULL)
    101 	return 0;
    102 
    103     frame = (FB_IMAGE **) img->pixmap;
    104     i = frame[0]->id;
    105     fb_image_draw(frame[i],
    106 		  x + self->offset_x, y + self->offset_y,
    107 		  sx, sy, (sw ? sw : img->width), (sh ? sh : img->height));
    108     if (frame[0]->num > 1) {
    109 	if (frame[1]->id > WAIT_CNT) {
    110 	    frame[1]->id = 0;
    111 	    if (i < frame[0]->num - 1)
    112 		frame[0]->id = i + 1;
    113 	    else
    114 		frame[0]->id = 0;
    115 	}
    116 	frame[1]->id += 1;
    117     }
    118     return 1;
    119 }
    120 
    121 static void
    122 w3mfb_free_image(w3mimg_op * self, W3MImage * img)
    123 {
    124     if (self == NULL)
    125 	return;
    126     if (img && img->pixmap) {
    127 	fb_frame_free((FB_IMAGE **) img->pixmap);
    128 	img->pixmap = NULL;
    129 	img->width = 0;
    130 	img->height = 0;
    131     }
    132 }
    133 
    134 static int
    135 w3mfb_get_image_size(w3mimg_op * self, W3MImage * img,
    136 		     char *fname, int *w, int *h)
    137 {
    138     int i;
    139 
    140     if (self == NULL)
    141 	return 0;
    142     i = get_image_size(fname, w, h);
    143     if (i)
    144 	return 0;
    145     return 1;
    146 }
    147 
    148 #ifdef W3MIMGDISPLAY_SETUID
    149 static int
    150 check_tty_console(char *tty)
    151 {
    152     if (tty == NULL || *tty == '\0')
    153 	return 0;
    154     if (strncmp(tty, "/dev/", 5) == 0)
    155 	tty += 5;
    156     if (strncmp(tty, "tty", 3) == 0 && isdigit(*(tty + 3)))
    157 	return 1;
    158     if (strncmp(tty, "vc/", 3) == 0 && isdigit(*(tty + 3)))
    159 	return 1;
    160     return 0;
    161 }
    162 #else
    163 #define check_tty_console(tty)	1
    164 #endif
    165 
    166 w3mimg_op *
    167 w3mimg_fbopen()
    168 {
    169     w3mimg_op *wop = NULL;
    170     wop = (w3mimg_op *) malloc(sizeof(w3mimg_op));
    171     if (wop == NULL)
    172 	return NULL;
    173     memset(wop, 0, sizeof(w3mimg_op));
    174 
    175     if (!check_tty_console(getenv("W3M_TTY")) && strcmp("jfbterm", getenv("TERM")) != 0) {
    176 	fprintf(stderr, "w3mimgdisplay/fb: tty is not console\n");
    177 	goto error;
    178     }
    179 
    180     if (fb_open())
    181 	goto error;
    182 
    183     wop->width = fb_width();
    184     wop->height = fb_height();
    185 
    186     wop->init = w3mfb_init;
    187     wop->finish = w3mfb_finish;
    188     wop->active = w3mfb_active;
    189     wop->set_background = w3mfb_set_background;
    190     wop->sync = w3mfb_sync;
    191     wop->close = w3mfb_close;
    192     wop->clear = w3mfb_clear;
    193 
    194     wop->load_image = w3mfb_load_image;
    195     wop->show_image = w3mfb_show_image;
    196     wop->free_image = w3mfb_free_image;
    197     wop->get_image_size = w3mfb_get_image_size;
    198 
    199     /* XXX */
    200     fb_image_init();
    201 
    202     return wop;
    203   error:
    204     free(wop);
    205     return NULL;
    206 }