• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 #include <GLcommon/TextureUtils.h>
17 #include <GLcommon/GLESmacros.h>
18 #include <GLcommon/GLDispatch.h>
19 #include <GLcommon/GLESvalidate.h>
20 #include <stdio.h>
21 #include <cmath>
22 
getCompressedFormats(int * formats)23 int getCompressedFormats(int* formats){
24     if(formats){
25         //Palette
26         formats[0] = GL_PALETTE4_RGBA8_OES;
27         formats[1] = GL_PALETTE4_RGBA4_OES;
28         formats[2] = GL_PALETTE8_RGBA8_OES;
29         formats[3] = GL_PALETTE8_RGBA4_OES;
30         formats[4] = GL_PALETTE4_RGB8_OES;
31         formats[5] = GL_PALETTE8_RGB8_OES;
32         formats[6] = GL_PALETTE4_RGB5_A1_OES;
33         formats[7] = GL_PALETTE8_RGB5_A1_OES;
34         formats[8] = GL_PALETTE4_R5_G6_B5_OES;
35         formats[9] = GL_PALETTE8_R5_G6_B5_OES;
36         //ETC
37         formats[MAX_SUPPORTED_PALETTE] = GL_ETC1_RGB8_OES;
38     }
39     return MAX_SUPPORTED_PALETTE + MAX_ETC_SUPPORTED;
40 }
41 
doCompressedTexImage2D(GLEScontext * ctx,GLenum target,GLint level,GLenum internalformat,GLsizei width,GLsizei height,GLint border,GLsizei imageSize,const GLvoid * data,void * funcPtr)42 void  doCompressedTexImage2D(GLEScontext * ctx, GLenum target, GLint level,
43                                           GLenum internalformat, GLsizei width,
44                                           GLsizei height, GLint border,
45                                           GLsizei imageSize, const GLvoid* data, void * funcPtr)
46 {
47     /* XXX: This is just a hack to fix the resolve of glTexImage2D problem
48        It will be removed when we'll no longer link against ligGL */
49     typedef void (GLAPIENTRY *glTexImage2DPtr_t ) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
50     glTexImage2DPtr_t glTexImage2DPtr;
51     glTexImage2DPtr =  (glTexImage2DPtr_t)funcPtr;
52 
53     switch (internalformat) {
54         case GL_ETC1_RGB8_OES:
55             {
56                 GLint format = GL_RGB;
57                 GLint type = GL_UNSIGNED_BYTE;
58 
59                 GLsizei compressedSize = etc1_get_encoded_data_size(width, height);
60                 SET_ERROR_IF((compressedSize > imageSize), GL_INVALID_VALUE);
61 
62                 const int32_t align = ctx->getUnpackAlignment()-1;
63                 const int32_t bpr = ((width * 3) + align) & ~align;
64                 const size_t size = bpr * height;
65 
66                 etc1_byte* pOut = new etc1_byte[size];
67                 int res = etc1_decode_image((const etc1_byte*)data, pOut, width, height, 3, bpr);
68                 SET_ERROR_IF(res!=0, GL_INVALID_VALUE);
69                 glTexImage2DPtr(target,level,format,width,height,border,format,type,pOut);
70                 delete [] pOut;
71             }
72             break;
73 
74         case GL_PALETTE4_RGB8_OES:
75         case GL_PALETTE4_RGBA8_OES:
76         case GL_PALETTE4_R5_G6_B5_OES:
77         case GL_PALETTE4_RGBA4_OES:
78         case GL_PALETTE4_RGB5_A1_OES:
79         case GL_PALETTE8_RGB8_OES:
80         case GL_PALETTE8_RGBA8_OES:
81         case GL_PALETTE8_R5_G6_B5_OES:
82         case GL_PALETTE8_RGBA4_OES:
83         case GL_PALETTE8_RGB5_A1_OES:
84             {
85                 SET_ERROR_IF(level > log2(ctx->getMaxTexSize()) ||
86                              border !=0 || level > 0 ||
87                              !GLESvalidate::texImgDim(width,height,ctx->getMaxTexSize()+2),GL_INVALID_VALUE)
88 
89                 int nMipmaps = -level + 1;
90                 GLsizei tmpWidth  = width;
91                 GLsizei tmpHeight = height;
92 
93                 for(int i = 0; i < nMipmaps ; i++)
94                 {
95                    GLenum uncompressedFrmt;
96                    unsigned char* uncompressed = uncompressTexture(internalformat,uncompressedFrmt,width,height,imageSize,data,i);
97                    glTexImage2DPtr(target,i,uncompressedFrmt,tmpWidth,tmpHeight,border,uncompressedFrmt,GL_UNSIGNED_BYTE,uncompressed);
98                    tmpWidth/=2;
99                    tmpHeight/=2;
100                    delete[] uncompressed;
101                 }
102             }
103             break;
104 
105         default:
106             SET_ERROR_IF(1, GL_INVALID_ENUM);
107             break;
108     }
109 }
110