Annotation of embedaddon/php/ext/gd/libgd/gd_webp.c, revision 1.1
1.1 ! misho 1: #include <stdio.h>
! 2: #include <math.h>
! 3: #include <string.h>
! 4: #include <stdlib.h>
! 5: #include "gd.h"
! 6:
! 7:
! 8: #ifdef HAVE_LIBVPX
! 9: #include "webpimg.h"
! 10: #include "gdhelpers.h"
! 11:
! 12: extern void gd_YUV420toRGBA(uint8* Y,
! 13: uint8* U,
! 14: uint8* V,
! 15: gdImagePtr im);
! 16:
! 17: extern void gd_RGBAToYUV420(gdImagePtr im2,
! 18: uint8* Y,
! 19: uint8* U,
! 20: uint8* V);
! 21:
! 22: const char * gdWebpGetVersionString()
! 23: {
! 24: return "not defined";
! 25: }
! 26:
! 27: gdImagePtr gdImageCreateFromWebp (FILE * inFile)
! 28: {
! 29: gdImagePtr im;
! 30: gdIOCtx *in = gdNewFileCtx(inFile);
! 31: im = gdImageCreateFromWebpCtx(in);
! 32: in->gd_free(in);
! 33:
! 34: return im;
! 35: }
! 36:
! 37: gdImagePtr gdImageCreateFromWebpPtr (int size, void *data)
! 38: {
! 39: int width, height, ret;
! 40: unsigned char *Y = NULL;
! 41: unsigned char *U = NULL;
! 42: unsigned char *V = NULL;
! 43: gdImagePtr im;
! 44:
! 45: ret = WebPDecode(data, size, &Y, &U, &V, &width, &height);
! 46: if (ret != webp_success) {
! 47: if (Y) free(Y);
! 48: if (U) free(U);
! 49: if (V) free(V);
! 50: php_gd_error("WebP decode: fail to decode input data");
! 51: return NULL;
! 52: }
! 53: im = gdImageCreateTrueColor(width, height);
! 54: if (!im) {
! 55: return NULL;
! 56: }
! 57: gd_YUV420toRGBA(Y, U, V, im);
! 58: return im;
! 59: }
! 60:
! 61: gdImagePtr gdImageCreateFromWebpCtx (gdIOCtx * infile)
! 62: {
! 63: int width, height, ret;
! 64: unsigned char *filedata;
! 65: unsigned char dummy[1024];
! 66: unsigned char *Y = NULL;
! 67: unsigned char *U = NULL;
! 68: unsigned char *V = NULL;
! 69: size_t size = 0, n;
! 70: gdImagePtr im;
! 71:
! 72: do {
! 73: n = gdGetBuf(dummy, 1024, infile);
! 74: size += n;
! 75: } while (n != EOF);
! 76:
! 77: filedata = gdMalloc(size);
! 78: if (!filedata) {
! 79: php_gd_error("WebP decode: alloc failed");
! 80: return NULL;
! 81: }
! 82: gdGetBuf(filedata, size, infile);
! 83: ret = WebPDecode(filedata, size, &Y, &U, &V, &width, &height);
! 84: gdFree(filedata);
! 85: if (ret != webp_success) {
! 86: if (Y) free(Y);
! 87: if (U) free(U);
! 88: if (V) free(V);
! 89: php_gd_error("WebP decode: fail to decode input data");
! 90: return NULL;
! 91: }
! 92: im = gdImageCreateTrueColor(width, height);
! 93: gd_YUV420toRGBA(Y, U, V, im);
! 94: return im;
! 95: }
! 96:
! 97: void gdImageWebpEx (gdImagePtr im, FILE * outFile, int quantization)
! 98: {
! 99: gdIOCtx *out = gdNewFileCtx(outFile);
! 100: gdImageWebpCtx(im, out, quantization);
! 101: out->gd_free(out);
! 102: }
! 103:
! 104: void gdImageWebp (gdImagePtr im, FILE * outFile)
! 105: {
! 106: gdIOCtx *out = gdNewFileCtx(outFile);
! 107: gdImageWebpCtx(im, out, -1);
! 108: out->gd_free(out);
! 109: }
! 110:
! 111: void * gdImageWebpPtr (gdImagePtr im, int *size)
! 112: {
! 113: void *rv;
! 114: gdIOCtx *out = gdNewDynamicCtx(2048, NULL);
! 115: gdImageWebpCtx(im, out, -1);
! 116: rv = gdDPExtractData(out, size);
! 117: out->gd_free(out);
! 118:
! 119: return rv;
! 120: }
! 121:
! 122: void * gdImageWebpPtrEx (gdImagePtr im, int *size, int quantization)
! 123: {
! 124: void *rv;
! 125: gdIOCtx *out = gdNewDynamicCtx(2048, NULL);
! 126: gdImageWebpCtx(im, out, quantization);
! 127: rv = gdDPExtractData(out, size);
! 128: out->gd_free(out);
! 129: return rv;
! 130: }
! 131:
! 132: /*
! 133: * Maps normalized QP (quality) to VP8 QP
! 134: */
! 135: int mapQualityToVP8QP(int quality) {
! 136: #define MIN_QUALITY 0
! 137: #define MAX_QUALITY 100
! 138: #define MIN_VP8QP 1
! 139: #define MAX_VP8QP 63
! 140: const float scale = MAX_VP8QP - MIN_VP8QP;
! 141: const float vp8qp =
! 142: scale * (MAX_QUALITY - quality) / (MAX_QUALITY - MIN_QUALITY) + MIN_VP8QP;
! 143: if (quality < MIN_QUALITY || quality > MAX_QUALITY) {
! 144: php_gd_error("Wrong quality value %d.", quality);
! 145: return -1;
! 146: }
! 147:
! 148: return (int)(vp8qp + 0.5);
! 149: }
! 150:
! 151: /* This routine is based in part on code from Dale Lutz (Safe Software Inc.)
! 152: * and in part on demo code from Chapter 15 of "PNG: The Definitive Guide"
! 153: * (http://www.cdrom.com/pub/png/pngbook.html).
! 154: */
! 155: void gdImageWebpCtx (gdImagePtr im, gdIOCtx * outfile, int quantization)
! 156: {
! 157: int width = im->sx;
! 158: int height = im->sy;
! 159: int colors = im->colorsTotal;
! 160: int *open = im->open;
! 161:
! 162: int yuv_width, yuv_height, yuv_nbytes, ret;
! 163: int vp8_quality;
! 164: unsigned char *Y = NULL,
! 165: *U = NULL,
! 166: *V = NULL;
! 167: unsigned char *filedata = NULL;
! 168:
! 169: /* Conversion to Y,U,V buffer */
! 170: yuv_width = (width + 1) >> 1;
! 171: yuv_height = (height + 1) >> 1;
! 172: yuv_nbytes = width * height + 2 * yuv_width * yuv_height;
! 173:
! 174: if ((Y = (unsigned char *)gdCalloc(yuv_nbytes, sizeof(unsigned char))) == NULL) {
! 175: php_gd_error("gd-webp error: cannot allocate Y buffer");
! 176: return;
! 177: }
! 178: vp8_quality = mapQualityToVP8QP(quantization);
! 179:
! 180: U = Y + width * height;
! 181: V = U + yuv_width * yuv_height;
! 182: gd_RGBAToYUV420(im, Y, U, V);
! 183:
! 184: /* Encode Y,U,V and write data to file */
! 185: ret = WebPEncode(Y, U, V, width, height, width, yuv_width, yuv_height, yuv_width,
! 186: vp8_quality, &filedata, &yuv_nbytes, NULL);
! 187: gdFree(Y);
! 188:
! 189: if (ret != webp_success) {
! 190: if (filedata) {
! 191: free(filedata);
! 192: }
! 193: php_gd_error("gd-webp error: WebP Encoder failed");
! 194: return;
! 195: }
! 196:
! 197: gdPutBuf (filedata, yuv_nbytes, outfile);
! 198: free(filedata);
! 199: }
! 200:
! 201: #endif /* HAVE_LIBVPX */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>