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.patch831
1 files changed, 0 insertions, 831 deletions
diff --git a/debian/patches/400_w3m-img-freebsd.patch b/debian/patches/400_w3m-img-freebsd.patch
deleted file mode 100644
index b6f0677..0000000
--- a/debian/patches/400_w3m-img-freebsd.patch
+++ /dev/null
@@ -1,831 +0,0 @@
-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/acinclude.m4 b/acinclude.m4
-index ec91797..675cabe 100644
---- a/acinclude.m4
-+++ b/acinclude.m4
-@@ -600,7 +600,7 @@ AC_DEFUN([AC_W3M_IMAGE],
- 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/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;
- }