diff lcdemu/ximage.c @ 906:69623c4cbf6c

lcdemu: image conversion implemented for X11 depth 24
author Space Falcon <falcon@ivan.Harhan.ORG>
date Mon, 07 Sep 2015 10:18:39 +0000
parents
children 7a189b7bbd67
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lcdemu/ximage.c	Mon Sep 07 10:18:39 2015 +0000
@@ -0,0 +1,59 @@
+/*
+ * LCDemu based on HECterm by the same author
+ * XImage conversion muck
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <X11/Xlib.h>
+#include <X11/Xresource.h>
+#include <X11/Xutil.h>
+#include "globals.h"
+
+XImage *
+convert_image_depth24(input, npix)
+	uint16_t *input;
+	int npix;
+{
+	uint32_t *imgbuf;
+	int i, in, r, g, b;
+	XImage *img;
+
+	imgbuf = malloc(npix * 4);
+	if (!imgbuf) {
+		perror("malloc");
+		exit(1);
+	}
+	for (i = 0; i < npix; i++) {
+		in = input[i];
+		r = (in & 0xF800) << 8;
+		g = (in & 0x07E0) << 5;
+		b = (in & 0x001F) << 3;
+		imgbuf[i] = r | g | b;
+	}
+	img = XCreateImage(mydisplay, CopyFromParent, display_depth, ZPixmap,
+			   0, (char *) imgbuf, npix, 1, 32, 0);
+	if (!img) {
+		perror("XCreateImage");
+		exit(1);
+	}
+	return(img);
+}
+
+init_image_conversion()
+{
+	display_depth = DefaultDepth(mydisplay, DefaultScreen(mydisplay));
+	switch (display_depth) {
+	case 24:
+		convert_function = convert_image_depth24;
+		break;
+	default:
+		fprintf(stderr,
+"error: fc-ledemu has not been adapted for X11 depth != 24, yours is %d\n",
+			display_depth);
+		exit(1);
+	}
+}