1c1a9e6010baceeff78f72ac0692aefc4312d815fBrian Paul/* 2c1a9e6010baceeff78f72ac0692aefc4312d815fBrian Paul * Mesa 3-D graphics library 3bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * 4bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. 5bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * 6c1a9e6010baceeff78f72ac0692aefc4312d815fBrian Paul * Permission is hereby granted, free of charge, to any person obtaining a 7c1a9e6010baceeff78f72ac0692aefc4312d815fBrian Paul * copy of this software and associated documentation files (the "Software"), 8c1a9e6010baceeff78f72ac0692aefc4312d815fBrian Paul * to deal in the Software without restriction, including without limitation 9c1a9e6010baceeff78f72ac0692aefc4312d815fBrian Paul * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10c1a9e6010baceeff78f72ac0692aefc4312d815fBrian Paul * and/or sell copies of the Software, and to permit persons to whom the 11c1a9e6010baceeff78f72ac0692aefc4312d815fBrian Paul * Software is furnished to do so, subject to the following conditions: 12c1a9e6010baceeff78f72ac0692aefc4312d815fBrian Paul * 13c1a9e6010baceeff78f72ac0692aefc4312d815fBrian Paul * The above copyright notice and this permission notice shall be included 14c1a9e6010baceeff78f72ac0692aefc4312d815fBrian Paul * in all copies or substantial portions of the Software. 15c1a9e6010baceeff78f72ac0692aefc4312d815fBrian Paul * 16c1a9e6010baceeff78f72ac0692aefc4312d815fBrian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 17c1a9e6010baceeff78f72ac0692aefc4312d815fBrian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18c1a9e6010baceeff78f72ac0692aefc4312d815fBrian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19c1a9e6010baceeff78f72ac0692aefc4312d815fBrian Paul * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 20c1a9e6010baceeff78f72ac0692aefc4312d815fBrian Paul * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 21c1a9e6010baceeff78f72ac0692aefc4312d815fBrian Paul * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22c1a9e6010baceeff78f72ac0692aefc4312d815fBrian Paul */ 23bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 24bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu/** 25a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu * Code to convert compressed/paletted texture images to ordinary images. 26bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * See the GL_OES_compressed_paletted_texture spec at 27bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * http://khronos.org/registry/gles/extensions/OES/OES_compressed_paletted_texture.txt 28a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu * 29a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu * XXX this makes it impossible to add hardware support... 30bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu */ 31bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 32bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 337179a822628963d8cfa0817cf072c5acb70638a7Kristian Høgsberg#include "glheader.h" 347179a822628963d8cfa0817cf072c5acb70638a7Kristian Høgsberg#include "compiler.h" /* for ASSERT */ 357179a822628963d8cfa0817cf072c5acb70638a7Kristian Høgsberg#include "context.h" 36db61b9ce39bccc43140357652ceb78baaf2aea44Vinson Lee#include "mfeatures.h" 377179a822628963d8cfa0817cf072c5acb70638a7Kristian Høgsberg#include "mtypes.h" 387179a822628963d8cfa0817cf072c5acb70638a7Kristian Høgsberg#include "imports.h" 397179a822628963d8cfa0817cf072c5acb70638a7Kristian Høgsberg#include "pixelstore.h" 40c1a9e6010baceeff78f72ac0692aefc4312d815fBrian Paul#include "texcompress_cpal.h" 417179a822628963d8cfa0817cf072c5acb70638a7Kristian Høgsberg#include "teximage.h" 42bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 437179a822628963d8cfa0817cf072c5acb70638a7Kristian Høgsberg#if FEATURE_ES 44a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu 45bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 46a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wustatic const struct cpal_format_info { 47a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu GLenum cpal_format; 48bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu GLenum format; 49a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu GLenum type; 50bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu GLuint palette_size; 51bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu GLuint size; 52bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu} formats[] = { 53a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu { GL_PALETTE4_RGB8_OES, GL_RGB, GL_UNSIGNED_BYTE, 16, 3 }, 54a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu { GL_PALETTE4_RGBA8_OES, GL_RGBA, GL_UNSIGNED_BYTE, 16, 4 }, 55a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu { GL_PALETTE4_R5_G6_B5_OES, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 16, 2 }, 56a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu { GL_PALETTE4_RGBA4_OES, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, 16, 2 }, 57a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu { GL_PALETTE4_RGB5_A1_OES, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, 16, 2 }, 58a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu { GL_PALETTE8_RGB8_OES, GL_RGB, GL_UNSIGNED_BYTE, 256, 3 }, 59a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu { GL_PALETTE8_RGBA8_OES, GL_RGBA, GL_UNSIGNED_BYTE, 256, 4 }, 60a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu { GL_PALETTE8_R5_G6_B5_OES, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 256, 2 }, 61a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu { GL_PALETTE8_RGBA4_OES, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, 256, 2 }, 62a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu { GL_PALETTE8_RGB5_A1_OES, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, 256, 2 } 63bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu}; 64bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 65bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 66bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu/** 67a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu * Get a color/entry from the palette. 68bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu */ 69a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wustatic GLuint 70a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wuget_palette_entry(const struct cpal_format_info *info, const GLubyte *palette, 71a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu GLuint index, GLubyte *pixel) 72bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu{ 73a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu memcpy(pixel, palette + info->size * index, info->size); 74a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu return info->size; 75bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu} 76bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 77bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 78bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu/** 79a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu * Convert paletted texture to color texture. 80bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu */ 81bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wustatic void 82a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wupaletted_to_color(const struct cpal_format_info *info, const GLubyte *palette, 83a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu const void *indices, GLuint num_pixels, GLubyte *image) 84bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu{ 85a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu GLubyte *pix = image; 86a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu GLuint remain, i; 87bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 88a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu if (info->palette_size == 16) { 89bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu /* 4 bits per index */ 90a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu const GLubyte *ind = (const GLubyte *) indices; 91bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 92bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu /* two pixels per iteration */ 93a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu remain = num_pixels % 2; 94a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu for (i = 0; i < num_pixels / 2; i++) { 95a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu pix += get_palette_entry(info, palette, (ind[i] >> 4) & 0xf, pix); 96a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu pix += get_palette_entry(info, palette, ind[i] & 0xf, pix); 97a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu } 98a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu if (remain) { 99a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu get_palette_entry(info, palette, (ind[i] >> 4) & 0xf, pix); 100bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu } 101bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu } 102bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu else { 103bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu /* 8 bits per index */ 104a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu const GLubyte *ind = (const GLubyte *) indices; 105a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu for (i = 0; i < num_pixels; i++) 106a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu pix += get_palette_entry(info, palette, ind[i], pix); 107bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu } 108bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu} 109bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 110a2cab751beed5d130c4085d4215f8b7ad25d9cb1Ian Romanickunsigned 111a2cab751beed5d130c4085d4215f8b7ad25d9cb1Ian Romanick_mesa_cpal_compressed_size(int level, GLenum internalFormat, 112a2cab751beed5d130c4085d4215f8b7ad25d9cb1Ian Romanick unsigned width, unsigned height) 113a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu{ 114a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu const struct cpal_format_info *info; 115a2cab751beed5d130c4085d4215f8b7ad25d9cb1Ian Romanick const int num_levels = -level + 1; 116a2cab751beed5d130c4085d4215f8b7ad25d9cb1Ian Romanick int lvl; 117a2cab751beed5d130c4085d4215f8b7ad25d9cb1Ian Romanick unsigned w, h, expect_size; 118a2cab751beed5d130c4085d4215f8b7ad25d9cb1Ian Romanick 119a2cab751beed5d130c4085d4215f8b7ad25d9cb1Ian Romanick if (internalFormat < GL_PALETTE4_RGB8_OES 120a2cab751beed5d130c4085d4215f8b7ad25d9cb1Ian Romanick || internalFormat > GL_PALETTE8_RGB5_A1_OES) { 121a2cab751beed5d130c4085d4215f8b7ad25d9cb1Ian Romanick return 0; 122a2cab751beed5d130c4085d4215f8b7ad25d9cb1Ian Romanick } 123a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu 124a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu info = &formats[internalFormat - GL_PALETTE4_RGB8_OES]; 125a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu ASSERT(info->cpal_format == internalFormat); 126a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu 127a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu expect_size = info->palette_size * info->size; 128a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu for (lvl = 0; lvl < num_levels; lvl++) { 129a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu w = width >> lvl; 130a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu if (!w) 131a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu w = 1; 132a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu h = height >> lvl; 133a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu if (!h) 134a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu h = 1; 135a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu 136a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu if (info->palette_size == 16) 137a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu expect_size += (w * h + 1) / 2; 138a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu else 139a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu expect_size += w * h; 140a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu } 141a2cab751beed5d130c4085d4215f8b7ad25d9cb1Ian Romanick 142a2cab751beed5d130c4085d4215f8b7ad25d9cb1Ian Romanick return expect_size; 143a2cab751beed5d130c4085d4215f8b7ad25d9cb1Ian Romanick} 144a2cab751beed5d130c4085d4215f8b7ad25d9cb1Ian Romanick 145b433e7ba073c66d974dfd8a180ab3970acf18105Ian Romanickvoid 146b433e7ba073c66d974dfd8a180ab3970acf18105Ian Romanick_mesa_cpal_compressed_format_type(GLenum internalFormat, GLenum *format, 147b433e7ba073c66d974dfd8a180ab3970acf18105Ian Romanick GLenum *type) 148b433e7ba073c66d974dfd8a180ab3970acf18105Ian Romanick{ 149b433e7ba073c66d974dfd8a180ab3970acf18105Ian Romanick const struct cpal_format_info *info; 150b433e7ba073c66d974dfd8a180ab3970acf18105Ian Romanick 151b433e7ba073c66d974dfd8a180ab3970acf18105Ian Romanick if (internalFormat < GL_PALETTE4_RGB8_OES 152b433e7ba073c66d974dfd8a180ab3970acf18105Ian Romanick || internalFormat > GL_PALETTE8_RGB5_A1_OES) { 153b433e7ba073c66d974dfd8a180ab3970acf18105Ian Romanick return; 154b433e7ba073c66d974dfd8a180ab3970acf18105Ian Romanick } 155b433e7ba073c66d974dfd8a180ab3970acf18105Ian Romanick 156b433e7ba073c66d974dfd8a180ab3970acf18105Ian Romanick info = &formats[internalFormat - GL_PALETTE4_RGB8_OES]; 157b433e7ba073c66d974dfd8a180ab3970acf18105Ian Romanick *format = info->format; 158b433e7ba073c66d974dfd8a180ab3970acf18105Ian Romanick *type = info->type; 159b433e7ba073c66d974dfd8a180ab3970acf18105Ian Romanick} 160b433e7ba073c66d974dfd8a180ab3970acf18105Ian Romanick 161bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu/** 162bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * Convert a call to glCompressedTexImage2D() where internalFormat is a 163bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * compressed palette format into a regular GLubyte/RGBA glTexImage2D() call. 164bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu */ 1657179a822628963d8cfa0817cf072c5acb70638a7Kristian Høgsbergvoid 1667179a822628963d8cfa0817cf072c5acb70638a7Kristian Høgsberg_mesa_cpal_compressed_teximage2d(GLenum target, GLint level, 1677179a822628963d8cfa0817cf072c5acb70638a7Kristian Høgsberg GLenum internalFormat, 1687179a822628963d8cfa0817cf072c5acb70638a7Kristian Høgsberg GLsizei width, GLsizei height, 1697179a822628963d8cfa0817cf072c5acb70638a7Kristian Høgsberg GLsizei imageSize, const void *palette) 170bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu{ 171a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu const struct cpal_format_info *info; 172a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu GLint lvl, num_levels; 173a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu const GLubyte *indices; 174a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu GLint saved_align, align; 1757179a822628963d8cfa0817cf072c5acb70638a7Kristian Høgsberg GET_CURRENT_CONTEXT(ctx); 176bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 17713757f7080426e99511456ea6c44af63b8e7e861Ian Romanick /* By this point, the internalFormat should have been validated. 17813757f7080426e99511456ea6c44af63b8e7e861Ian Romanick */ 17913757f7080426e99511456ea6c44af63b8e7e861Ian Romanick assert(internalFormat >= GL_PALETTE4_RGB8_OES 18013757f7080426e99511456ea6c44af63b8e7e861Ian Romanick && internalFormat <= GL_PALETTE8_RGB5_A1_OES); 181bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 182a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu info = &formats[internalFormat - GL_PALETTE4_RGB8_OES]; 18313757f7080426e99511456ea6c44af63b8e7e861Ian Romanick 184a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu num_levels = -level + 1; 185bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 186bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu /* first image follows the palette */ 187a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu indices = (const GLubyte *) palette + info->palette_size * info->size; 188bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 1897179a822628963d8cfa0817cf072c5acb70638a7Kristian Høgsberg saved_align = ctx->Unpack.Alignment; 190a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu align = saved_align; 191bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 192bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu for (lvl = 0; lvl < num_levels; lvl++) { 193a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu GLsizei w, h; 194a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu GLuint num_texels; 195a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu GLubyte *image = NULL; 196a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu 197a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu w = width >> lvl; 198a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu if (!w) 199a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu w = 1; 200a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu h = height >> lvl; 201a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu if (!h) 202a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu h = 1; 203a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu num_texels = w * h; 204a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu if (w * info->size % align) { 205a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu _mesa_PixelStorei(GL_UNPACK_ALIGNMENT, 1); 206a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu align = 1; 207a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu } 208bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 209a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu /* allocate and fill dest image buffer */ 210a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu if (palette) { 211a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu image = (GLubyte *) malloc(num_texels * info->size); 212a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu paletted_to_color(info, palette, indices, num_texels, image); 213a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu } 214bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 215a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu _mesa_TexImage2D(target, lvl, info->format, w, h, 0, 216a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu info->format, info->type, image); 217a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu if (image) 218a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu free(image); 219bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 220bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu /* advance index pointer to point to next src mipmap */ 221a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu if (info->palette_size == 16) 222a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu indices += (num_texels + 1) / 2; 223bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu else 224a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu indices += num_texels; 225bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu } 226a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu 227a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu if (saved_align != align) 228a316b700effd615fcc895d0a2e015356854c6f44Chia-I Wu _mesa_PixelStorei(GL_UNPACK_ALIGNMENT, saved_align); 229bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu} 230bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 2317179a822628963d8cfa0817cf072c5acb70638a7Kristian Høgsberg#endif 232