aboutsummaryrefslogtreecommitdiffstats
path: root/debian/patches/400_w3m-img-freebsd.patch
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--debian/patches/400_w3m-img-freebsd.patch818
1 files changed, 818 insertions, 0 deletions
diff --git a/debian/patches/400_w3m-img-freebsd.patch b/debian/patches/400_w3m-img-freebsd.patch
new file mode 100644
index 0000000..9991b91
--- /dev/null
+++ b/debian/patches/400_w3m-img-freebsd.patch
@@ -0,0 +1,818 @@
+Subject: Support FreeBSD framebuffer
+Author: Yusuke Baba <babayaga1@y8.dion.ne.jp>
+Origin: http://www.ac.auone-net.jp/~baba/w3m-img/index.html
+Bug-FreeBSD: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=122673
+
+diff --git a/configure b/configure
+index 4fdcd8e..2ba82d5 100755
+--- a/configure
++++ b/configure
+@@ -6755,7 +6755,7 @@ $as_echo "$enable_image" >&6; }
+ if test x"$enable_image" = xyes; then
+ enable_image=x11
+ case "`uname -s`" in
+- Linux|linux|LINUX)
++ Linux|linux|LINUX|FreeBSD|freebsd|FREEBSD)
+ if test -c /dev/fb0; then
+ enable_image=x11,fb
+ fi;;
+diff --git a/w3mimg/fb/fb.c b/w3mimg/fb/fb.c
+index cd11128..7b6f23b 100644
+--- a/w3mimg/fb/fb.c
++++ b/w3mimg/fb/fb.c
+@@ -12,12 +12,24 @@
+ #include <errno.h>
+ #include <sys/ioctl.h>
+ #include <sys/mman.h>
++#if defined(__linux__)
+ #include <linux/fb.h>
++#elif defined(__FreeBSD__)
++#include <sys/fbio.h>
++#endif
++#if defined(__FreeBSD__)
++#include <sys/types.h>
++#include <machine/param.h>
++#endif
+
+ #include "fb.h"
+
+ #define FB_ENV "FRAMEBUFFER"
++#if defined(__linux__)
+ #define FB_DEFDEV "/dev/fb0"
++#elif defined(__FreeBSD__)
++#define FB_DEFDEV "/dev/ttyv0"
++#endif
+
+ #define MONO_OFFSET_8BIT 0x40
+ #define COLORS_MONO_8BIT 0x40
+@@ -38,22 +50,65 @@
+
+ #define IMAGE_SIZE_MAX 10000
+
++#if defined(__linux__)
+ static struct fb_cmap *fb_cmap_create(struct fb_fix_screeninfo *,
+ struct fb_var_screeninfo *);
++#elif defined(__FreeBSD__)
++static video_color_palette_t *fb_cmap_create(video_info_t *video_info,
++ video_adapter_info_t *video_adapter_info);
++#endif
++#if defined(__linux__)
+ static void fb_cmap_destroy(struct fb_cmap *cmap);
++#elif defined(__FreeBSD__)
++static void fb_cmap_destroy(video_color_palette_t *cmap);
++#endif
++#if defined(__linux__)
+ static int fb_fscrn_get(int fbfp, struct fb_fix_screeninfo *scinfo);
++#endif
++#if defined(__linux__)
+ static void *fb_mmap(int fbfp, struct fb_fix_screeninfo *scinfo);
++#elif defined(__FreeBSD__)
++static void *fb_mmap(int fbfp, video_adapter_info_t *video_adapter_info);
++#endif
++#if defined(__linux__)
+ static int fb_munmap(void *buf, struct fb_fix_screeninfo *scinfo);
++#elif defined(__FreeBSD__)
++static int fb_munmap(void *buf, video_adapter_info_t *video_adapter_info);
++#endif
++#if defined(__linux__)
+ static int fb_vscrn_get(int fbfp, struct fb_var_screeninfo *scinfo);
++#endif
++#if defined(__linux__)
+ static int fb_cmap_set(int fbfp, struct fb_cmap *cmap);
++#elif defined(__FreeBSD__)
++static int fb_cmap_set(int fbfp, video_color_palette_t *cmap);
++#endif
++#if defined(__linux__)
+ static int fb_cmap_get(int fbfp, struct fb_cmap *cmap);
++#elif defined(__FreeBSD__)
++static int fb_cmap_get(int fbfp, video_color_palette_t *cmap);
++#endif
+ static int fb_cmap_init(void);
+ static int fb_get_cmap_index(int r, int g, int b);
+ static unsigned long fb_get_packed_color(int r, int g, int b);
++#if defined(__FreeBSD__)
++static int fb_video_mode_get(int fbfp, int *video_mode);
++static int fb_video_info_get(int fbfp, video_info_t *video_info);
++static int fb_video_adapter_info_get(int fbfp, video_adapter_info_t *video_adapter_info);
++#endif
+
++#if defined(__linux__)
+ static struct fb_fix_screeninfo fscinfo;
+ static struct fb_var_screeninfo vscinfo;
++#elif defined(__FreeBSD__)
++static video_info_t video_info;
++static video_adapter_info_t video_adapter_info;
++#endif
++#if defined(__linux__)
+ static struct fb_cmap *cmap = NULL, *cmap_org = NULL;
++#elif defined(__FreeBSD__)
++static video_color_palette_t *cmap = NULL, *cmap_org = NULL;
++#endif
+ static int is_open = FALSE;
+ static int fbfp = -1;
+ static size_t pixel_size = 0;
+@@ -63,6 +118,9 @@ int
+ fb_open(void)
+ {
+ char *fbdev = { FB_DEFDEV };
++#if defined(__FreeBSD__)
++ int video_mode;
++#endif
+
+ if (is_open == TRUE)
+ return 1;
+@@ -76,6 +134,7 @@ fb_open(void)
+ goto ERR_END;
+ }
+
++#if defined(__linux__)
+ if (fb_fscrn_get(fbfp, &fscinfo)) {
+ goto ERR_END;
+ }
+@@ -83,22 +142,67 @@ fb_open(void)
+ if (fb_vscrn_get(fbfp, &vscinfo)) {
+ goto ERR_END;
+ }
++#elif defined(__FreeBSD__)
++ if (fb_video_mode_get(fbfp, &video_mode)) {
++ goto ERR_END;
++ }
++ video_info.vi_mode = video_mode;
++
++ if (fb_video_info_get(fbfp, &video_info)) {
++ goto ERR_END;
++ }
+
++ if (fb_video_adapter_info_get(fbfp, &video_adapter_info)) {
++ goto ERR_END;
++ }
++ if (!(video_info.vi_flags & V_INFO_GRAPHICS) ||
++ !(video_info.vi_flags & V_INFO_LINEAR)) {
++ goto ERR_END;
++ }
++#endif
++
++#if defined(__linux__)
+ if ((cmap = fb_cmap_create(&fscinfo, &vscinfo)) == (struct fb_cmap *)-1) {
+ goto ERR_END;
+ }
++#elif defined(__FreeBSD__)
++ if ((cmap = fb_cmap_create(&video_info, &video_adapter_info)) == (video_color_palette_t *)-1) {
++ goto ERR_END;
++ }
++#endif
+
++#if defined(__linux__)
+ if (!(buf = fb_mmap(fbfp, &fscinfo))) {
+ fprintf(stderr, "Can't allocate memory.\n");
+ goto ERR_END;
+ }
++#elif defined(__FreeBSD__)
++ if (!(buf = fb_mmap(fbfp, &video_adapter_info))) {
++ fprintf(stderr, "Can't allocate memory.\n");
++ goto ERR_END;
++ }
++#endif
+
++#if defined(__linux__)
+ if (fscinfo.type != FB_TYPE_PACKED_PIXELS) {
+ fprintf(stderr, "This type of framebuffer is not supported.\n");
+ goto ERR_END;
+ }
++#elif defined(__FreeBSD__)
++ if (!(video_info.vi_mem_model == V_INFO_MM_PACKED ||
++ video_info.vi_mem_model == V_INFO_MM_DIRECT)) {
++ fprintf(stderr, "This type of framebuffer is not supported.\n");
++ goto ERR_END;
++ }
++#endif
+
++#if defined(__linux__)
+ if (fscinfo.visual == FB_VISUAL_PSEUDOCOLOR && vscinfo.bits_per_pixel == 8) {
++#elif defined(__FreeBSD__)
++ if (video_adapter_info.va_flags & V_ADP_PALETTE &&
++ video_info.vi_mem_model == V_INFO_MM_PACKED &&
++ video_info.vi_depth == 8) {
++#endif
+ if (fb_cmap_get(fbfp, cmap)) {
+ fprintf(stderr, "Can't get color map.\n");
+ fb_cmap_destroy(cmap);
+@@ -111,12 +215,20 @@ fb_open(void)
+
+ pixel_size = 1;
+ }
++#if defined(__linux__)
+ else if ((fscinfo.visual == FB_VISUAL_TRUECOLOR ||
+ fscinfo.visual == FB_VISUAL_DIRECTCOLOR) &&
+ (vscinfo.bits_per_pixel == 15 ||
+ vscinfo.bits_per_pixel == 16 ||
+ vscinfo.bits_per_pixel == 24 || vscinfo.bits_per_pixel == 32)) {
+ pixel_size = (vscinfo.bits_per_pixel + 7) / CHAR_BIT;
++#elif defined(__FreeBSD__)
++ else if (video_info.vi_mem_model == V_INFO_MM_DIRECT &&
++ (video_info.vi_depth == 15 ||
++ video_info.vi_depth == 16 ||
++ video_info.vi_depth == 24 || video_info.vi_depth == 32)) {
++ pixel_size = (video_info.vi_depth + 7) / CHAR_BIT;
++#endif
+ }
+ else {
+ fprintf(stderr, "This type of framebuffer is not supported.\n");
+@@ -147,7 +259,11 @@ fb_close(void)
+ cmap = NULL;
+ }
+ if (buf != NULL) {
++#if defined(__linux__)
+ fb_munmap(buf, &fscinfo);
++#elif defined(__FreeBSD__)
++ fb_munmap(buf, &video_adapter_info);
++#endif
+ buf = NULL;
+ }
+
+@@ -259,11 +375,19 @@ fb_image_draw(FB_IMAGE * image, int x, int y, int sx, int sy, int width,
+ if (y + height > fb_height())
+ height = fb_height() - y;
+
++#if defined(__linux__)
+ offset_fb = fscinfo.line_length * y + pixel_size * x;
++#elif defined(__FreeBSD__)
++ offset_fb = video_adapter_info.va_line_width * y + pixel_size * x;
++#endif
+ offset_img = image->rowstride * sy + pixel_size * sx;
+ for (i = 0; i < height; i++) {
+ memcpy(buf + offset_fb, image->data + offset_img, pixel_size * width);
++#if defined(__linux__)
+ offset_fb += fscinfo.line_length;
++#elif defined(__FreeBSD__)
++ offset_fb += video_adapter_info.va_line_width;
++#endif
+ offset_img += image->rowstride;
+ }
+
+@@ -336,7 +460,11 @@ fb_width(void)
+ if (is_open != TRUE)
+ return 0;
+
++#if defined(__linux__)
+ return vscinfo.xres;
++#elif defined(__FreeBSD__)
++ return video_info.vi_width;
++#endif
+ }
+
+ int
+@@ -345,7 +473,11 @@ fb_height(void)
+ if (is_open != TRUE)
+ return 0;
+
++#if defined(__linux__)
+ return vscinfo.yres;
++#elif defined(__FreeBSD__)
++ return video_info.vi_height;
++#endif
+ }
+
+ int
+@@ -369,7 +501,11 @@ fb_clear(int x, int y, int w, int h, int r, int g, int b)
+ h = fb_height() - y;
+
+ if (tmp == NULL) {
++#if defined(__linux__)
+ tmp = malloc(fscinfo.line_length);
++#elif defined(__FreeBSD__)
++ tmp = malloc(video_adapter_info.va_line_width);
++#endif
+ if (tmp == NULL)
+ return 1;
+ }
+@@ -384,10 +520,18 @@ fb_clear(int x, int y, int w, int h, int r, int g, int b)
+ gg = g;
+ bb = b;
+ }
++#if defined(__linux__)
+ offset_fb = fscinfo.line_length * y + pixel_size * x;
++#elif defined(__FreeBSD__)
++ offset_fb = video_adapter_info.va_line_width * y + pixel_size * x;
++#endif
+ for (i = 0; i < h; i++) {
+ memcpy(buf + offset_fb, tmp, pixel_size * w);
++#if defined(__linux__)
+ offset_fb += fscinfo.line_length;
++#elif defined(__FreeBSD__)
++ offset_fb += video_adapter_info.va_line_width;
++#endif
+ }
+ return 0;
+ }
+@@ -400,11 +544,21 @@ fb_get_packed_color(int r, int g, int b)
+ return fb_get_cmap_index(r, g, b);
+ }
+ else {
++#if defined(__linux__)
+ return
+ ((r >> (CHAR_BIT - vscinfo.red.length)) << vscinfo.red.offset) +
+ ((g >> (CHAR_BIT - vscinfo.green.length)) << vscinfo.green.
+ offset) +
+ ((b >> (CHAR_BIT - vscinfo.blue.length)) << vscinfo.blue.offset);
++#elif defined(__FreeBSD__)
++ return
++ ((r >> (CHAR_BIT - video_info.vi_pixel_fsizes[0])) <<
++ video_info.vi_pixel_fields[0]) +
++ ((g >> (CHAR_BIT - video_info.vi_pixel_fsizes[1])) <<
++ video_info.vi_pixel_fields[1]) +
++ ((b >> (CHAR_BIT - video_info.vi_pixel_fsizes[2])) <<
++ video_info.vi_pixel_fields[2]);
++#endif
+ }
+ }
+
+@@ -433,16 +587,31 @@ fb_cmap_init(void)
+ if (cmap == NULL)
+ return 1;
+
++#if defined(__linux__)
+ if (cmap->len < COLOR_OFFSET_8BIT + COLORS_8BIT) {
+ fprintf(stderr, "Can't allocate enough color.\n");
+ return 1;
+ }
++#elif defined(__FreeBSD__)
++ if (cmap->count < COLOR_OFFSET_8BIT + COLORS_8BIT) {
++ fprintf(stderr, "Can't allocate enough color.\n");
++ return 1;
++ }
++#endif
+
+ if (cmap_org == NULL) {
++#if defined(__linux__)
+ if ((cmap_org =
+ fb_cmap_create(&fscinfo, &vscinfo)) == (struct fb_cmap *)-1) {
+ return 1;
+ }
++#elif defined(__FreeBSD__)
++ if ((cmap_org =
++ fb_cmap_create(&video_info, &video_adapter_info)) ==
++ (video_color_palette_t *)-1) {
++ return 1;
++ }
++#endif
+
+ if (fb_cmap_get(fbfp, cmap_org)) {
+ fprintf(stderr, "Can't get color map.\n");
+@@ -452,8 +621,13 @@ fb_cmap_init(void)
+ }
+ }
+
++#if defined(__linux__)
+ cmap->start = MONO_OFFSET_8BIT;
+ cmap->len = COLORS_8BIT + COLORS_MONO_8BIT;
++#elif defined(__FreeBSD__)
++ cmap->index = MONO_OFFSET_8BIT;
++ cmap->count = COLORS_8BIT + COLORS_MONO_8BIT;
++#endif
+
+ for (lp = 0; lp < COLORS_MONO_8BIT; lp++) {
+ int c;
+@@ -506,73 +680,213 @@ fb_cmap_init(void)
+
+ #define LUT_MAX (256)
+
++#if defined(__linux__)
+ static struct fb_cmap *
+ fb_cmap_create(struct fb_fix_screeninfo *fscinfo,
+ struct fb_var_screeninfo *vscinfo)
++#elif defined(__FreeBSD__)
++static video_color_palette_t *
++fb_cmap_create(video_info_t *video_info,
++ video_adapter_info_t *video_adapter_info)
++#endif
+ {
++#if defined(__linux__)
+ struct fb_cmap *cmap;
++#elif defined(__FreeBSD__)
++ video_color_palette_t *cmap;
++#endif
+ int cmaplen = LUT_MAX;
+
+ /* check the existence of colormap */
++#if defined(__linux__)
+ if (fscinfo->visual == FB_VISUAL_MONO01 ||
+ fscinfo->visual == FB_VISUAL_MONO10 ||
+ fscinfo->visual == FB_VISUAL_TRUECOLOR)
+ return NULL;
++#elif defined(__FreeBSD__)
++ if (!(video_adapter_info->va_flags & V_ADP_PALETTE))
++ return NULL;
++#endif
+
++#if defined(__linux__)
+ cmap = (struct fb_cmap *)malloc(sizeof(struct fb_cmap));
++#elif defined(__FreeBSD__)
++ cmap = (video_color_palette_t *)malloc(sizeof(video_color_palette_t));
++#endif
+ if (!cmap) {
+ perror("cmap malloc error\n");
++#if defined(__linux__)
+ return (struct fb_cmap *)-1;
++#elif defined(__FreeBSD__)
++ return (video_color_palette_t *)-1;
++#endif
+ }
++#if defined(__linux__)
+ memset(cmap, 0, sizeof(struct fb_cmap));
++#elif defined(__FreeBSD__)
++ memset(cmap, 0, sizeof(video_color_palette_t));
++#endif
++
++#if defined(__FreeBSD__)
++ if (video_info->vi_mem_model == V_INFO_MM_PACKED) {
++ cmap->red = (u_char *) malloc(sizeof(u_char) * cmaplen);
++ if (!cmap->red) {
++ perror("red lut malloc error\n");
++ return (video_color_palette_t *)-1;
++ }
++ cmap->green = (u_char *) malloc(sizeof(u_char) * cmaplen);
++ if (!cmap->green) {
++ perror("green lut malloc error\n");
++ free(cmap->red);
++ return (video_color_palette_t *)-1;
++ }
++ cmap->blue = (u_char *) malloc(sizeof(u_char) * cmaplen);
++ if (!cmap->blue) {
++ perror("blue lut malloc error\n");
++ free(cmap->red);
++ free(cmap->green);
++ return (video_color_palette_t *)-1;
++ }
++ cmap->transparent = (u_char *) malloc(sizeof(u_char) * cmaplen);
++ if (!cmap->transparent) {
++ perror("transparent lut malloc error\n");
++ free(cmap->red);
++ free(cmap->green);
++ free(cmap->blue);
++ return (video_color_palette_t *)-1;
++ }
++ cmap->count = cmaplen;
++ return cmap;
++ }
++#endif
+
+ /* Allocates memory for a colormap */
++#if defined(__linux__)
+ if (vscinfo->red.length) {
+ cmap->red = (__u16 *) malloc(sizeof(__u16) * cmaplen);
++#elif defined(__FreeBSD__)
++ if (video_info->vi_pixel_fsizes[0]) {
++ cmap->red = (u_char *) malloc(sizeof(u_char) * cmaplen);
++#endif
+ if (!cmap->red) {
+ perror("red lut malloc error\n");
++#if defined(__linux__)
+ return (struct fb_cmap *)-1;
++#elif defined(__FreeBSD__)
++ return (video_color_palette_t *)-1;
++#endif
+ }
+ }
++#if defined(__linux__)
+ if (vscinfo->green.length) {
+ cmap->green = (__u16 *) malloc(sizeof(__u16) * cmaplen);
++#elif defined(__FreeBSD__)
++ if (video_info->vi_pixel_fsizes[1]) {
++ cmap->green = (u_char *) malloc(sizeof(u_char) * cmaplen);
++#endif
+ if (!cmap->green) {
++#if defined(__linux__)
+ if (vscinfo->red.length)
+ free(cmap->red);
++#elif defined(__FreeBSD__)
++ if (video_info->vi_pixel_fsizes[0])
++ free(cmap->red);
++#endif
+ perror("green lut malloc error\n");
++#if defined(__linux__)
+ return (struct fb_cmap *)-1;
++#elif defined(__FreeBSD__)
++ return (video_color_palette_t *)-1;
++#endif
+ }
+ }
++#if defined(__linux__)
+ if (vscinfo->blue.length) {
+ cmap->blue = (__u16 *) malloc(sizeof(__u16) * cmaplen);
++#elif defined(__FreeBSD__)
++ if (video_info->vi_pixel_fsizes[2]) {
++ cmap->blue = (u_char *) malloc(sizeof(u_char) * cmaplen);
++#endif
+ if (!cmap->blue) {
++#if defined(__linux__)
+ if (vscinfo->red.length)
+ free(cmap->red);
++#elif defined(__FreeBSD__)
++ if (video_info->vi_pixel_fsizes[0])
++ free(cmap->red);
++#endif
++#if defined(__linux__)
+ if (vscinfo->green.length)
+ free(cmap->green);
++#elif defined(__FreeBSD__)
++ if (video_info->vi_pixel_fsizes[1])
++ free(cmap->green);
++#endif
+ perror("blue lut malloc error\n");
++#if defined(__linux__)
+ return (struct fb_cmap *)-1;
++#elif defined(__FreeBSD__)
++ return (video_color_palette_t *)-1;
++#endif
+ }
+ }
++#if defined(__linux__)
+ if (vscinfo->transp.length) {
+ cmap->transp = (__u16 *) malloc(sizeof(__u16) * cmaplen);
++#elif defined(__FreeBSD__)
++ if (video_info->vi_pixel_fsizes[3]) {
++ cmap->transparent = (u_char *) malloc(sizeof(u_char) * cmaplen);
++#endif
++#if defined(__linux__)
+ if (!cmap->transp) {
++#elif defined(__FreeBSD__)
++ if (!cmap->transparent) {
++#endif
++#if defined(__linux__)
+ if (vscinfo->red.length)
+ free(cmap->red);
++#elif defined(__FreeBSD__)
++ if (video_info->vi_pixel_fsizes[0])
++ free(cmap->red);
++#endif
++#if defined(__linux__)
+ if (vscinfo->green.length)
+ free(cmap->green);
++#elif defined(__FreeBSD__)
++ if (video_info->vi_pixel_fsizes[1])
++ free(cmap->green);
++#endif
++#if defined(__linux__)
+ if (vscinfo->blue.length)
+ free(cmap->blue);
+ perror("transp lut malloc error\n");
++#elif defined(__FreeBSD__)
++ if (video_info->vi_pixel_fsizes[2])
++ free(cmap->blue);
++ perror("transparent lut malloc error\n");
++#endif
++#if defined(__linux__)
+ return (struct fb_cmap *)-1;
++#elif defined(__FreeBSD__)
++ return (video_color_palette_t *)-1;
++#endif
+ }
+ }
++#if defined(__linux__)
+ cmap->len = cmaplen;
++#elif defined(__FreeBSD__)
++ cmap->count = cmaplen;
++#endif
+ return cmap;
+ }
+
++#if defined(__linux__)
+ static void
+ fb_cmap_destroy(struct fb_cmap *cmap)
++#elif defined(__FreeBSD__)
++static void
++fb_cmap_destroy(video_color_palette_t *cmap)
++#endif
+ {
+ if (cmap->red)
+ free(cmap->red);
+@@ -580,28 +894,57 @@ fb_cmap_destroy(struct fb_cmap *cmap)
+ free(cmap->green);
+ if (cmap->blue)
+ free(cmap->blue);
++#if defined(__linux__)
+ if (cmap->transp)
+ free(cmap->transp);
++#elif defined(__FreeBSD__)
++ if (cmap->transparent)
++ free(cmap->transparent);
++#endif
+ free(cmap);
+ }
+
++#if defined(__linux__)
+ static int
+ fb_cmap_get(int fbfp, struct fb_cmap *cmap)
++#elif defined(__FreeBSD__)
++static int
++fb_cmap_get(int fbfp, video_color_palette_t *cmap)
++#endif
+ {
++#if defined(__linux__)
+ if (ioctl(fbfp, FBIOGETCMAP, cmap)) {
+ perror("ioctl FBIOGETCMAP error\n");
+ return -1;
+ }
++#elif defined(__FreeBSD__)
++ if (ioctl(fbfp, FBIO_GETPALETTE, cmap) == -1) {
++ perror("ioctl FBIO_GETPALETTE error\n");
++ return -1;
++ }
++#endif
+ return 0;
+ }
+
++#if defined(__linux__)
+ static int
+ fb_cmap_set(int fbfp, struct fb_cmap *cmap)
++#elif defined(__FreeBSD__)
++static int
++fb_cmap_set(int fbfp, video_color_palette_t *cmap)
++#endif
+ {
++#if defined(__linux__)
+ if (ioctl(fbfp, FBIOPUTCMAP, cmap)) {
+ perror("ioctl FBIOPUTCMAP error\n");
+ return -1;
+ }
++#elif defined(__FreeBSD__)
++ if (ioctl(fbfp, FBIO_SETPALETTE, cmap) == -1) {
++ perror("ioctl FBIO_SETPALETTE error\n");
++ return -1;
++ }
++#endif
+ return 0;
+ }
+
+@@ -612,10 +955,16 @@ fb_cmap_set(int fbfp, struct fb_cmap *cmap)
+ * fb_munmap() deletes the mappings
+ */
+
++#if defined(__linux__)
+ static void *
+ fb_mmap(int fbfp, struct fb_fix_screeninfo *scinfo)
++#elif defined(__FreeBSD__)
++static void *
++fb_mmap(int fbfp, video_adapter_info_t *video_adapter_info)
++#endif
+ {
+ void *buf;
++#if defined(__linux__)
+ if ((buf = (unsigned char *)
+ mmap(NULL, scinfo->smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fbfp,
+ (off_t) 0))
+@@ -623,13 +972,41 @@ fb_mmap(int fbfp, struct fb_fix_screeninfo *scinfo)
+ perror("mmap error");
+ return NULL;
+ }
++#elif defined(__FreeBSD__)
++ size_t mmap_offset;
++ size_t mmap_length;
++ mmap_offset = (size_t)(video_adapter_info->va_window) & (PAGE_MASK);
++ mmap_length = (size_t)(video_adapter_info->va_window_size +
++ mmap_offset + PAGE_MASK) & (~PAGE_MASK);
++ if ((buf = (unsigned char *)
++ mmap(NULL, mmap_length, PROT_READ | PROT_WRITE, MAP_SHARED, fbfp,
++ (off_t) 0))
++ == MAP_FAILED) {
++ perror("mmap error");
++ return NULL;
++ }
++#endif
+ return buf;
+ }
+
++#if defined(__linux__)
+ static int
+ fb_munmap(void *buf, struct fb_fix_screeninfo *scinfo)
++#elif defined(__FreeBSD__)
++static int
++fb_munmap(void *buf, video_adapter_info_t *video_adapter_info)
++#endif
+ {
++#if defined(__linux__)
+ return munmap(buf, scinfo->smem_len);
++#elif defined(__FreeBSD__)
++ size_t mmap_offset;
++ size_t mmap_length;
++ mmap_offset = (size_t)(video_adapter_info->va_window) & (PAGE_MASK);
++ mmap_length = (size_t)(video_adapter_info->va_window_size +
++ mmap_offset + PAGE_MASK) & (~PAGE_MASK);
++ return munmap((void *)((u_long)buf & (~PAGE_MASK)), mmap_length);
++#endif
+ }
+
+ /*
+@@ -637,6 +1014,7 @@ fb_munmap(void *buf, struct fb_fix_screeninfo *scinfo)
+ *
+ * fb_fscrn_get() get information
+ */
++#if defined(__linux__)
+ static int
+ fb_fscrn_get(int fbfp, struct fb_fix_screeninfo *scinfo)
+ {
+@@ -646,12 +1024,14 @@ fb_fscrn_get(int fbfp, struct fb_fix_screeninfo *scinfo)
+ }
+ return 0;
+ }
++#endif
+
+ /*
+ * (struct fb_var_screeninfo) device independent variable information
+ *
+ * fb_vscrn_get() get information
+ */
++#if defined(__linux__)
+ static int
+ fb_vscrn_get(int fbfp, struct fb_var_screeninfo *scinfo)
+ {
+@@ -661,3 +1041,41 @@ fb_vscrn_get(int fbfp, struct fb_var_screeninfo *scinfo)
+ }
+ return 0;
+ }
++#endif
++
++#if defined(__FreeBSD__)
++static int
++fb_video_mode_get(int fbfp, int *video_mode)
++{
++ if (ioctl(fbfp, FBIO_GETMODE, video_mode) == -1) {
++ perror("ioctl FBIO_GETMODE error\n");
++ return -1;
++ }
++ return 0;
++}
++#endif
++
++#if defined(__FreeBSD__)
++static int
++fb_video_info_get(int fbfp, video_info_t *video_info)
++{
++ if (ioctl(fbfp, FBIO_MODEINFO, video_info) == -1) {
++ perror("ioctl FBIO_MODEINFO error\n");
++ return -1;
++ }
++ return 0;
++}
++#endif
++
++#if defined(__FreeBSD__)
++static int
++fb_video_adapter_info_get(int fbfp, video_adapter_info_t *video_adapter_info)
++{
++ if (ioctl(fbfp, FBIO_ADPINFO, video_adapter_info) == -1) {
++ perror("ioctl FBIO_ADPINFO error\n");
++ return -1;
++ }
++ return 0;
++}
++#endif
++
+diff --git a/w3mimg/fb/fb.h b/w3mimg/fb/fb.h
+index 1138bb0..5d86454 100644
+--- a/w3mimg/fb/fb.h
++++ b/w3mimg/fb/fb.h
+@@ -1,7 +1,11 @@
+ /* $Id: fb.h,v 1.7 2003/07/07 15:48:17 ukai Exp $ */
+ #ifndef fb_header
+ #define fb_header
++#if defined(__linux__)
+ #include <linux/fb.h>
++#elif defined(__FreeBSD__)
++#include <sys/fbio.h>
++#endif
+
+ typedef struct {
+ int num;
+diff --git a/w3mimg/fb/fb_w3mimg.c b/w3mimg/fb/fb_w3mimg.c
+index d3ae5a9..fb323f5 100644
+--- a/w3mimg/fb/fb_w3mimg.c
++++ b/w3mimg/fb/fb_w3mimg.c
+@@ -153,10 +153,15 @@ check_tty_console(char *tty)
+ return 0;
+ if (strncmp(tty, "/dev/", 5) == 0)
+ tty += 5;
++#if defined(__linux__)
+ if (strncmp(tty, "tty", 3) == 0 && isdigit(*(tty + 3)))
+ return 1;
+ if (strncmp(tty, "vc/", 3) == 0 && isdigit(*(tty + 3)))
+ return 1;
++#elif defined(__FreeBSD__)
++ if (strncmp(tty, "ttyv", 4) == 0 && isxdigit(*(tty + 4)))
++ return 1;
++#endif
+ return 0;
+ }
+ #else
+@@ -172,7 +177,9 @@ w3mimg_fbopen()
+ return NULL;
+ memset(wop, 0, sizeof(w3mimg_op));
+
+- if (!check_tty_console(getenv("W3M_TTY")) && strcmp("jfbterm", getenv("TERM")) != 0) {
++ if (!check_tty_console(getenv("W3M_TTY")) &&
++ strcmp("jfbterm", getenv("TERM")) != 0 &&
++ strncmp("jfbterm-", getenv("TERM"), 8) != 0) {
+ fprintf(stderr, "w3mimgdisplay/fb: tty is not console\n");
+ goto error;
+ }