• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2009 Google Inc.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #pragma once
16 
17 #define MAX_ETC_SUPPORTED 12
18 
19 #define ETC1_ENCODED_BLOCK_SIZE 8
20 #define ETC1_DECODED_BLOCK_SIZE 48
21 #define ETC2_DECODED_RGB8A1_BLOCK_SIZE 64
22 #define EAC_ENCODE_ALPHA_BLOCK_SIZE 8
23 #define EAC_DECODED_ALPHA_BLOCK_SIZE 16
24 #define EAC_ENCODE_R11_BLOCK_SIZE 8
25 #define EAC_DECODED_R11_BLOCK_SIZE 64
26 #define EAC_DECODED_RG11_BLOCK_SIZE (EAC_DECODED_R11_BLOCK_SIZE*2)
27 
28 #ifndef ETC1_RGB8_OES
29 #define ETC1_RGB8_OES 0x8D64
30 #endif
31 
32 typedef unsigned char etc1_byte;
33 typedef int etc1_bool;
34 typedef unsigned int etc1_uint32;
35 
36 enum ETC2ImageFormat {
37 	EtcRGB8, EtcRGBA8, EtcR11, EtcSignedR11, EtcRG11, EtcSignedRG11, EtcRGB8A1
38 };
39 
40 #ifdef __cplusplus
41 extern "C" {
42 #endif
43 
44 // Encode a block of pixels.
45 //
46 // pIn is a pointer to a ETC_DECODED_BLOCK_SIZE array of bytes that represent a
47 // 4 x 4 square of 3-byte pixels in form R, G, B. Byte (3 * (x + 4 * y) is the R
48 // value of pixel (x, y).
49 //
50 // validPixelMask is a 16-bit mask where bit (1 << (x + y * 4)) indicates whether
51 // the corresponding (x,y) pixel is valid. Invalid pixel color values are ignored when compressing.
52 //
53 // pOut is an ETC1 compressed version of the data.
54 
55 void etc1_encode_block(const etc1_byte* pIn, etc1_uint32 validPixelMask, etc1_byte* pOut);
56 
57 // Decode a block of rgb pixels.
58 //
59 // pIn is an ETC2 compressed version of the data.
60 //
61 // pOut is a pointer to a ETC_DECODED_BLOCK_SIZE array of bytes that represent a
62 // 4 x 4 square of 3-byte pixels in form R, G, B. Byte (3 * (x + 4 * y) is the R
63 // value of pixel (x, y).
64 
65 void etc2_decode_rgb_block(const etc1_byte* pIn, bool isPunchthroughAlpha, etc1_byte* pOut);
66 
67 // Decode a block of single channel pixels
68 // This is used when decoding the alpha channel of RGBA8_ETC2_EAC format, or
69 // when decoding R11_EAC format
70 // decodedElementBytes: number of bits per element after decoding.
71 // For RGBA8_ETC2_EAC it must be 1, for R11_EAC it must be 2
72 
73 void eac_decode_single_channel_block(const etc1_byte* pIn,
74 									 int decodedElementBytes, bool isSigned,
75 									 etc1_byte* pOut);
76 
77 // Return the size of the encoded image data (does not include size of PKM header).
78 
79 etc1_uint32 etc1_get_encoded_data_size(etc1_uint32 width, etc1_uint32 height);
80 
81 etc1_uint32 etc_get_encoded_data_size(ETC2ImageFormat format, etc1_uint32 width,
82 								      etc1_uint32 height);
83 etc1_uint32 etc_get_decoded_pixel_size(ETC2ImageFormat format);
84 
85 // Encode an entire image.
86 // pIn - pointer to the image data. Formatted such that
87 //       pixel (x,y) is at pIn + pixelSize * x + stride * y;
88 // pOut - pointer to encoded data. Must be large enough to store entire encoded image.
89 // pixelSize can be 2 or 3. 2 is an GL_UNSIGNED_SHORT_5_6_5 image, 3 is a GL_BYTE RGB image.
90 // returns non-zero if there is an error.
91 
92 int etc1_encode_image(const etc1_byte* pIn, etc1_uint32 width, etc1_uint32 height,
93         etc1_uint32 pixelSize, etc1_uint32 stride, etc1_byte* pOut);
94 
95 // Decode an entire image.
96 // pIn - pointer to encoded data.
97 // pOut - pointer to the image data. Will be written such that
98 //        pixel (x,y) is at pIn + pixelSize * x + stride * y. Must be
99 //        large enough to store entire image.
100 //        (pixelSize=3 for rgb images, pixelSize=4 for images with alpha channel)
101 // returns non-zero if there is an error.
102 
103 int etc2_decode_image(const etc1_byte* pIn, ETC2ImageFormat format,
104         etc1_byte* pOut,
105         etc1_uint32 width, etc1_uint32 height,
106         etc1_uint32 stride);
107 
108 // Size of a PKM header, in bytes.
109 
110 #define ETC_PKM_HEADER_SIZE 16
111 
112 // Format a PKM header
113 
114 void etc1_pkm_format_header(etc1_byte* pHeader, etc1_uint32 width, etc1_uint32 height);
115 
116 // Check if a PKM header is correctly formatted.
117 
118 etc1_bool etc1_pkm_is_valid(const etc1_byte* pHeader);
119 
120 // Read the image width from a PKM header
121 
122 etc1_uint32 etc1_pkm_get_width(const etc1_byte* pHeader);
123 
124 // Read the image height from a PKM header
125 
126 etc1_uint32 etc1_pkm_get_height(const etc1_byte* pHeader);
127 
128 #ifdef __cplusplus
129 }
130 #endif
131