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; }
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; }