view lcdemu/ximage.c @ 90:8dc062c6359b

target-utils/libc: memcpy16 and memcpy32 optimized variants implemented
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 28 Oct 2016 23:02:44 +0000
parents e7502631a0f9
children
line wrap: on
line source

/*
 * 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-lcdemu has not been adapted for X11 depth != 24, yours is %d\n",
			display_depth);
		exit(1);
	}
}