1 | // Copyright 2012 Google Inc. All Rights Reserved.  |
2 | //  |
3 | // Use of this source code is governed by a BSD-style license  |
4 | // that can be found in the COPYING file in the root of the source  |
5 | // tree. An additional intellectual property rights grant can be found  |
6 | // in the file PATENTS. All contributing project authors may  |
7 | // be found in the AUTHORS file in the root of the source tree.  |
8 | // -----------------------------------------------------------------------------  |
9 | //  |
10 | // Data-types common to the mux and demux libraries.  |
11 | //  |
12 | // Author: Urvang (urvang@google.com)  |
13 |   |
14 | #ifndef WEBP_WEBP_MUX_TYPES_H_  |
15 | #define WEBP_WEBP_MUX_TYPES_H_  |
16 |   |
17 | #include <string.h> // memset()  |
18 | #include "./types.h"  |
19 |   |
20 | #ifdef __cplusplus  |
21 | extern "C" {  |
22 | #endif  |
23 |   |
24 | // Note: forward declaring enumerations is not allowed in (strict) C and C++,  |
25 | // the types are left here for reference.  |
26 | // typedef enum WebPFeatureFlags WebPFeatureFlags;  |
27 | // typedef enum WebPMuxAnimDispose WebPMuxAnimDispose;  |
28 | // typedef enum WebPMuxAnimBlend WebPMuxAnimBlend;  |
29 | typedef struct WebPData WebPData;  |
30 |   |
31 | // VP8X Feature Flags.  |
32 | typedef enum WebPFeatureFlags {  |
33 | ANIMATION_FLAG = 0x00000002,  |
34 | XMP_FLAG = 0x00000004,  |
35 | EXIF_FLAG = 0x00000008,  |
36 | ALPHA_FLAG = 0x00000010,  |
37 | ICCP_FLAG = 0x00000020,  |
38 |   |
39 | ALL_VALID_FLAGS = 0x0000003e  |
40 | } WebPFeatureFlags;  |
41 |   |
42 | // Dispose method (animation only). Indicates how the area used by the current  |
43 | // frame is to be treated before rendering the next frame on the canvas.  |
44 | typedef enum WebPMuxAnimDispose {  |
45 | WEBP_MUX_DISPOSE_NONE, // Do not dispose.  |
46 | WEBP_MUX_DISPOSE_BACKGROUND // Dispose to background color.  |
47 | } WebPMuxAnimDispose;  |
48 |   |
49 | // Blend operation (animation only). Indicates how transparent pixels of the  |
50 | // current frame are blended with those of the previous canvas.  |
51 | typedef enum WebPMuxAnimBlend {  |
52 | WEBP_MUX_BLEND, // Blend.  |
53 | WEBP_MUX_NO_BLEND // Do not blend.  |
54 | } WebPMuxAnimBlend;  |
55 |   |
56 | // Data type used to describe 'raw' data, e.g., chunk data  |
57 | // (ICC profile, metadata) and WebP compressed image data.  |
58 | // 'bytes' memory must be allocated using WebPMalloc() and such.  |
59 | struct WebPData {  |
60 | const uint8_t* bytes;  |
61 | size_t size;  |
62 | };  |
63 |   |
64 | // Initializes the contents of the 'webp_data' object with default values.  |
65 | static WEBP_INLINE void WebPDataInit(WebPData* webp_data) {  |
66 | if (webp_data != NULL) {  |
67 | memset(webp_data, 0, sizeof(*webp_data));  |
68 | }  |
69 | }  |
70 |   |
71 | // Clears the contents of the 'webp_data' object by calling WebPFree().  |
72 | // Does not deallocate the object itself.  |
73 | static WEBP_INLINE void WebPDataClear(WebPData* webp_data) {  |
74 | if (webp_data != NULL) {  |
75 | WebPFree((void*)webp_data->bytes);  |
76 | WebPDataInit(webp_data);  |
77 | }  |
78 | }  |
79 |   |
80 | // Allocates necessary storage for 'dst' and copies the contents of 'src'.  |
81 | // Returns true on success.  |
82 | static WEBP_INLINE int WebPDataCopy(const WebPData* src, WebPData* dst) {  |
83 | if (src == NULL || dst == NULL) return 0;  |
84 | WebPDataInit(dst);  |
85 | if (src->bytes != NULL && src->size != 0) {  |
86 | dst->bytes = (uint8_t*)WebPMalloc(src->size);  |
87 | if (dst->bytes == NULL) return 0;  |
88 | memcpy((void*)dst->bytes, src->bytes, src->size);  |
89 | dst->size = src->size;  |
90 | }  |
91 | return 1;  |
92 | }  |
93 |   |
94 | #ifdef __cplusplus  |
95 | } // extern "C"  |
96 | #endif  |
97 |   |
98 | #endif // WEBP_WEBP_MUX_TYPES_H_  |
99 | |