Beispiel #1
0
int ppm_parser(char *buf,
		size_t len,
		struct fb_image *image,
		struct format *output_format)
{
	int	color_bytes = 0;
	size_t	i = 0;
	size_t	j = 0;
	size_t	size = 0;
	char	red, green, blue;
	unsigned short	*out = NULL;

	if (NULL == (buf = ppm_header(buf, len, image, &color_bytes)))
		return VMM_EFAIL;

	/* Overwritting in the correct format */
	out = (unsigned short*)buf;
	size = image->width * image->height;
	image->depth = output_format->byte_size * 8;

	for (i = 0; (i < size) && (j + 2 < len); ++i) {
		red = buf[j + 2] >> (8 - output_format->red.length);
		green = buf[j + 1] >> (8 - output_format->green.length);
		blue = buf[j] >> (8 - output_format->blue.length);
		out[i] = red << output_format->red.offset |
			green << output_format->green.offset |
			blue << output_format->blue.offset;
		j += 3;
	}
	image->data = buf;

	return VMM_OK;
}
Beispiel #2
0
static int
loadppm_from_file(FILE *rgb, FILE *alpha, struct ppm *ppm) {
	ppm->buffer = NULL;
	ppm->step = 0;
	int rgb_id = 0;
	int alpha_id = 0;
	if (rgb) {
		if (!ppm_header(rgb, ppm)) {
			return 0;
		}
		rgb_id = ppm->type;
		ppm->step += 3;
	}
	if (alpha) {
		if (rgb == NULL) {
			if (!ppm_header(alpha, ppm)) {
				return 0;
			}
		} else {
			struct ppm pgm;
			if (!ppm_header(alpha, &pgm)) {
				return 0;
			}
			if (ppm->depth != pgm.depth || ppm->width != pgm.width || ppm->height != pgm.height) {
				return 0;
			}
			alpha_id = pgm.type;
		}
		ppm->step += 1;
	}
	ppm->buffer = (uint8_t *)malloc(ppm->height * ppm->width * ppm->step);
	if (rgb) {
		if (!ppm_data(ppm, rgb, rgb_id, 0))
			return 0;
	}
	if (alpha) {
		int skip = 0;
		if (rgb) {
			skip = 3;
		}
		if (!ppm_data(ppm, alpha, alpha_id, skip)) 
			return 0;
	}

	return 1;
}