/** * This saves the image to its specified destination. * @param im A handle to an opened Epeg image. * * This saves the image @p im to its destination specified by * epeg_file_output_set() or epeg_memory_output_set(). The image will be * encoded at the deoded pixel size, using the quality, comment and thumbnail * comment settings set on the image. * * retval 1 - error scale * 2 - error encode * 3 - error decode * 4 - error decode ( setjmp ) */ EAPI int epeg_encode(Epeg_Image *im) { int ret; if ((ret = _epeg_decode(im)) != 0) return (ret == 2 ? 4 : 3); if (_epeg_scale(im) != 0) return 1; if (_epeg_encode(im) != 0) return 2; return 0; }
/** * Get a segment of decoded pixels from an image. * @param im A handle to an opened Epeg image. * @param x Rectangle X. * @param y Rectangle Y. * @param w Rectangle width. * @param h Rectangle height. * @return Pointer to the top left of the requested pixel block. * * Return image pixels in the decoded format from the specified location * rectangle bounded with the box @p x, @p y @p w X @p y. The pixel block is * packed with no row padding, and it organsied from top-left to bottom right, * row by row. You must free the pixel block using epeg_pixels_free() before * you close the image handle, and assume the pixels to be read-only memory. * * On success the pointer is returned, on failure, NULL is returned. Failure * may be because the rectangle is out of the bounds of the image, memory * allocations failed or the image data cannot be decoded. * */ const void * epeg_pixels_get(Epeg_Image *im) { int xx, yy, bpp, w, h; unsigned int *pix, *p; if (!im->pixels) { if (_epeg_decode(im) != 0) return NULL; } if (!im->pixels) return NULL; if ((im->out.w < 1) || (im->out.h < 1)) return NULL; if (_epeg_scale(im) != 0) return NULL; bpp = im->in.jinfo.output_components; w = im->out.w; h = im->out.h; pix = malloc(w * h * 4); if (!pix) return NULL; for (yy = 0; yy < h; yy++) { unsigned char *s; s = im->lines[yy]; p = pix + ((((yy) * w))); for (xx = 0; xx < w; xx++) { p[0] = 0xff000000 | (s[0] << 16) | (s[1] << 8) | (s[2]); p++; s += bpp; } } return pix; }
/** * Get a segment of decoded pixels from an image. * @param im A handle to an opened Epeg image. * @param x Rectangle X. * @param y Rectangle Y. * @param w Rectangle width. * @param h Rectangle height. * @return Pointer to the top left of the requested pixel block. * * Return image pixels in the decoded format from the specified location * rectangle bounded with the box @p x, @p y @p w X @p y. The pixel block is * packed with no row padding, and it organsied from top-left to bottom right, * row by row. You must free the pixel block using epeg_pixels_free() before * you close the image handle, and assume the pixels to be read-only memory. * * On success the pointer is returned, on failure, NULL is returned. Failure * may be because the rectangle is out of the bounds of the image, memory * allocations failed or the image data cannot be decoded. * */ EAPI const void * epeg_pixels_get(Epeg_Image *im, int x, int y, int w, int h) { int xx, yy, ww, hh, bpp, ox, oy, ow, oh, iw, ih; if (!im->pixels) { if (_epeg_decode(im) != 0) { return NULL; } } if (!im->pixels) { return NULL; } if ((im->out.w < 1) || (im->out.h < 1)) { return NULL; } if (_epeg_scale(im) != 0) { return NULL; } bpp = im->in.jinfo.output_components; iw = im->out.w; ih = im->out.h; ow = w; oh = h; ox = 0; oy = 0; if ((x + ow) > iw) { ow = iw - x; } if ((y + oh) > ih) { oh = ih - y; } if (ow < 1) { return NULL; } if (oh < 1) { return NULL; } if (x < 0) { ow += x; ox = -x; } if (y < 0) { oh += y; oy = -y; } if (ow < 1) { return NULL; } if (oh < 1) { return NULL; } ww = x + ox + ow; hh = y + oy + oh; if (im->color_space == EPEG_GRAY8) { unsigned char *pix, *p; pix = malloc(w * h * 1); if (!pix) { return NULL; } for (yy = y + oy; yy < hh; yy++) { unsigned char *s; s = im->lines[yy] + ((x + ox) * bpp); p = pix + ((((yy - y) * w) + ox)); for (xx = x + ox; xx < ww; xx++) { p[0] = s[0]; p++; s += bpp; } } return pix; } else if (im->color_space == EPEG_YUV8) { unsigned char *pix, *p; pix = malloc(w * h * 3); if (!pix) { return NULL; } for (yy = y + oy; yy < hh; yy++) { unsigned char *s; s = im->lines[yy] + ((x + ox) * bpp); p = pix + ((((yy - y) * w) + ox) * 3); for (xx = x + ox; xx < ww; xx++) { p[0] = s[0]; p[1] = s[1]; p[2] = s[2]; p += 3; s += bpp; } } return pix; } else if (im->color_space == EPEG_RGB8) { unsigned char *pix, *p; pix = malloc(w * h * 3); if (!pix) { return NULL; } for (yy = y + oy; yy < hh; yy++) { unsigned char *s; s = im->lines[yy] + ((x + ox) * bpp); p = pix + ((((yy - y) * w) + ox) * 3); for (xx = x + ox; xx < ww; xx++) { p[0] = s[0]; p[1] = s[1]; p[2] = s[2]; p += 3; s += bpp; } } return pix; } else if (im->color_space == EPEG_BGR8) { unsigned char *pix, *p; pix = malloc(w * h * 3); if (!pix) { return NULL; } for (yy = y + oy; yy < hh; yy++) { unsigned char *s; s = im->lines[yy] + ((x + ox) * bpp); p = pix + ((((yy - y) * w) + ox) * 3); for (xx = x + ox; xx < ww; xx++) { p[0] = s[2]; p[1] = s[1]; p[2] = s[0]; p += 3; s += bpp; } } return pix; } else if (im->color_space == EPEG_RGBA8) { unsigned char *pix, *p; pix = malloc(w * h * 4); if (!pix) { return NULL; } for (yy = y + oy; yy < hh; yy++) { unsigned char *s; s = im->lines[yy] + ((x + ox) * bpp); p = pix + ((((yy - y) * w) + ox) * 4); for (xx = x + ox; xx < ww; xx++) { p[0] = s[0]; p[1] = s[1]; p[2] = s[2]; p[3] = 0xff; p += 4; s += bpp; } } return pix; } else if (im->color_space == EPEG_BGRA8) { unsigned char *pix, *p; pix = malloc(w * h * 4); if (!pix) { return NULL; } for (yy = y + oy; yy < hh; yy++) { unsigned char *s; s = im->lines[yy] + ((x + ox) * bpp); p = pix + ((((yy - y) * w) + ox) * 4); for (xx = x + ox; xx < ww; xx++) { p[0] = 0xff; p[1] = s[2]; p[2] = s[1]; p[3] = s[0]; p += 4; s += bpp; } } return pix; } else if (im->color_space == EPEG_ARGB32) { unsigned int *pix, *p; pix = malloc(w * h * 4); if (!pix) { return NULL; } for (yy = y + oy; yy < hh; yy++) { unsigned char *s; s = im->lines[yy] + ((x + ox) * bpp); p = pix + ((((yy - y) * w) + ox)); for (xx = x + ox; xx < ww; xx++) { p[0] = 0xff000000 | (s[0] << 16) | (s[1] << 8) | (s[2]); p++; s += bpp; } } return pix; } else if (im->color_space == EPEG_CMYK) { unsigned char *pix, *p; pix = malloc(w * h * 4); if (!pix) { return NULL; } for (yy = y + oy; yy < hh; yy++) { unsigned char *s; s = im->lines[yy] + ((x + ox) * bpp); p = pix + ((((yy - y) * w) + ox) * 4); for (xx = x + ox; xx < ww; xx++) { p[0] = s[0]; p[1] = s[1]; p[2] = s[2]; p[3] = 0xff; p += 4; s += bpp; } } return pix; } return NULL; }