php-internal-docs 8.4.8
Unofficial docs for php/php-src
Loading...
Searching...
No Matches
gd_webp.c
Go to the documentation of this file.
1#include <stdio.h>
2#include <math.h>
3#include <string.h>
4#include <stdlib.h>
5#include "gd.h"
6#include "gd_errors.h"
7#include "gdhelpers.h"
8
9#ifdef HAVE_LIBWEBP
10#include "webp/decode.h"
11#include "webp/encode.h"
12
13#define GD_WEBP_ALLOC_STEP (4*1024)
14
16{
17 gdImagePtr im;
18 gdIOCtx *in = gdNewFileCtx(inFile);
19 if (!in)
20 return 0;
22 in->gd_free(in);
23
24 return im;
25}
26
27
29{
30 gdImagePtr im;
32 if (!in)
33 return 0;
35 in->gd_free(in);
36 return im;
37}
38
40{
41 int width, height;
42 uint8_t *filedata = NULL;
43 uint8_t *argb = NULL;
44 size_t size = 0, n;
45 gdImagePtr im;
46 int x, y;
47 uint8_t *p;
48
49 do {
50 unsigned char *read, *temp;
51
52 temp = gdRealloc(filedata, size+GD_WEBP_ALLOC_STEP);
53 if (temp) {
54 filedata = temp;
55 read = temp + size;
56 } else {
57 if (filedata) {
58 gdFree(filedata);
59 }
60 gd_error("WebP decode: realloc failed");
61 return NULL;
62 }
63
64 n = gdGetBuf(read, GD_WEBP_ALLOC_STEP, infile);
65 if (n>0 && n!=EOF) {
66 size += n;
67 }
68 } while (n>0 && n!=EOF);
69
70 if (WebPGetInfo(filedata,size, &width, &height) == 0) {
71 gd_error("gd-webp cannot get webp info");
72 gdFree(filedata);
73 return NULL;
74 }
75
76 im = gdImageCreateTrueColor(width, height);
77 if (!im) {
78 gdFree(filedata);
79 return NULL;
80 }
81 argb = WebPDecodeARGB(filedata, size, &width, &height);
82 if (!argb) {
83 gd_error("gd-webp cannot allocate temporary buffer");
84 gdFree(filedata);
86 return NULL;
87 }
88 for (y = 0, p = argb; y < height; y++) {
89 for (x = 0; x < width; x++) {
90 register uint8_t a = gdAlphaMax - (*(p++) >> 1);
91 register uint8_t r = *(p++);
92 register uint8_t g = *(p++);
93 register uint8_t b = *(p++);
94 im->tpixels[y][x] = gdTrueColorAlpha(r, g, b, a);
95 }
96 }
97 gdFree(filedata);
98 /* do not use gdFree here, in case gdFree/alloc is mapped to something else than libc */
99 free(argb);
100 im->saveAlphaFlag = 1;
101 return im;
102}
103
104void gdImageWebpCtx (gdImagePtr im, gdIOCtx * outfile, int quality)
105{
106 uint8_t *argb;
107 int x, y;
108 uint8_t *p;
109 uint8_t *out;
110 size_t out_size;
111
112 if (im == NULL) {
113 return;
114 }
115
116 if (!gdImageTrueColor(im)) {
117 gd_error("Palette image not supported by webp");
118 return;
119 }
120
121 if (quality == -1) {
122 quality = 80;
123 }
124
125 if (overflow2(gdImageSX(im), 4)) {
126 return;
127 }
128
129 if (overflow2(gdImageSX(im) * 4, gdImageSY(im))) {
130 return;
131 }
132
133 argb = (uint8_t *)gdMalloc(gdImageSX(im) * 4 * gdImageSY(im));
134 if (!argb) {
135 return;
136 }
137 p = argb;
138 for (y = 0; y < gdImageSY(im); y++) {
139 for (x = 0; x < gdImageSX(im); x++) {
140 register int c;
141 register char a;
142 c = im->tpixels[y][x];
144 if (a == 127) {
145 a = 0;
146 } else {
147 a = 255 - ((a << 1) + (a >> 6));
148 }
149 *(p++) = gdTrueColorGetRed(c);
150 *(p++) = gdTrueColorGetGreen(c);
151 *(p++) = gdTrueColorGetBlue(c);
152 *(p++) = a;
153 }
154 }
155
156 if (quality >= gdWebpLossless) {
157 out_size = WebPEncodeLosslessRGBA(argb, gdImageSX(im), gdImageSY(im), gdImageSX(im) * 4, &out);
158 } else {
159 out_size = WebPEncodeRGBA(argb, gdImageSX(im), gdImageSY(im), gdImageSX(im) * 4, quality, &out);
160 }
161
162 if (out_size == 0) {
163 gd_error("gd-webp encoding failed");
164 goto freeargb;
165 }
166 gdPutBuf(out, out_size, outfile);
167 free(out);
168
169freeargb:
170 gdFree(argb);
171}
172
173void gdImageWebpEx (gdImagePtr im, FILE * outFile, int quality)
174{
175 gdIOCtx *out = gdNewFileCtx(outFile);
176 gdImageWebpCtx(im, out, quality);
177 out->gd_free(out);
178}
179
180void gdImageWebp (gdImagePtr im, FILE * outFile)
181{
182 gdIOCtx *out = gdNewFileCtx(outFile);
183 gdImageWebpCtx(im, out, -1);
184 out->gd_free(out);
185}
186
187void * gdImageWebpPtr (gdImagePtr im, int *size)
188{
189 void *rv;
191 gdImageWebpCtx(im, out, -1);
193 out->gd_free(out);
194
195 return rv;
196}
197
198void * gdImageWebpPtrEx (gdImagePtr im, int *size, int quality)
199{
200 void *rv;
202 gdImageWebpCtx(im, out, quality);
204 out->gd_free(out);
205 return rv;
206}
207#endif /* HAVE_LIBWEBP */
zend_long n
Definition ffi.c:4979
new_type size
Definition ffi.c:4365
int overflow2(int a, int b)
Definition gd_compat.c:10
#define gdTrueColorGetBlue(c)
Definition gd.h:88
void * gdDPExtractData(struct gdIOCtx *ctx, int *size)
Definition gd_io_dp.c:95
#define gdAlphaMax
Definition gd.h:79
#define gdTrueColorGetGreen(c)
Definition gd.h:87
#define gdImageTrueColor(im)
Definition gd.h:766
gdImagePtr gdImageCreateFromWebp(FILE *fd)
#define gdTrueColorGetAlpha(c)
Definition gd.h:85
#define gdWebpLossless
Definition gd.h:633
#define gdImageSY(im)
Definition gd.h:769
#define gdTrueColorGetRed(c)
Definition gd.h:86
#define gdImageSX(im)
Definition gd.h:768
gdImagePtr gdImageCreateFromWebpPtr(int size, void *data)
gdIOCtx * gdNewFileCtx(FILE *)
Definition gd_io_file.c:49
#define gdTrueColorAlpha(r, g, b, a)
Definition gd.h:545
gdIOCtx * gdNewDynamicCtx(int, void *)
Definition gd_io_dp.c:65
void gdImageWebpCtx(gdImagePtr im, gdIOCtx *outfile, int quality)
gdIOCtx * gdNewDynamicCtxEx(int size, void *data, int freeFlag)
Definition gd_io_dp.c:70
gdImagePtr gdImageCreateFromWebpCtx(gdIOCtxPtr in)
gdImage * gdImagePtr
Definition gd.h:248
int gdGetBuf(void *buf, int size, gdIOCtx *ctx)
Definition gd_io.c:188
int gdPutBuf(const void *buf, int size, gdIOCtx *ctx)
Definition gd_io.c:181
#define NULL
Definition gdcache.h:45
#define gdRealloc(ptr, size)
Definition gdhelpers.h:17
#define gdFree(ptr)
Definition gdhelpers.h:19
#define gdMalloc(size)
Definition gdhelpers.h:16
void gdImageDestroy(gdImagePtr im)
Definition gd.c:247
void gd_error(const char *format,...)
Definition gd.c:103
gdImagePtr gdImageCreateTrueColor(int sx, int sy)
Definition gd.c:195
zend_constant * data
zval rv
Definition session.c:1024
p
Definition session.c:1105
void(* gd_free)(struct gdIOCtx *)
Definition gd_io.h:20
int ** tpixels
Definition gd.h:218
int saveAlphaFlag
Definition gd.h:229
$obj a
Definition test.php:84
out($f, $s)