Skip to content

Commit

Permalink
add luminance alpha support
Browse files Browse the repository at this point in the history
  • Loading branch information
jeffboody committed Jan 27, 2014
1 parent 1a70aaa commit 31c7b83
Show file tree
Hide file tree
Showing 4 changed files with 102 additions and 4 deletions.
6 changes: 6 additions & 0 deletions texgz-convert/texgz-convert.c
Expand Up @@ -64,6 +64,7 @@ static void usage(const char* argv0)
LOGE("RGB-888 - texgz, png, jpg");
LOGE("RGBA-5551 - texgz");
LOGE("LUMINANCE - texgz");
LOGE("LUMINANCE-A - texgz");
LOGE("LUMINANCE-F - texgz");
}

Expand Down Expand Up @@ -142,6 +143,11 @@ int main(int argc, char** argv)
type = TEXGZ_UNSIGNED_BYTE;
format = TEXGZ_LUMINANCE;
}
else if(strcmp(arg_format, "LUMINANCE-A") == 0)
{
type = TEXGZ_UNSIGNED_BYTE;
format = TEXGZ_LUMINANCE_ALPHA;
}
else if(strcmp(arg_format, "LUMINANCE-F") == 0)
{
type = TEXGZ_FLOAT;
Expand Down
6 changes: 6 additions & 0 deletions texgz-plugin.c
Expand Up @@ -155,6 +155,7 @@ static gint texgz_export_dialog(texgz_dialog_t* self)
"RGB-888", 888, NULL,
"RGBA-5551", 5551, NULL,
"LUMINANCE", 8, NULL,
"LUMINANCE-A", 16, NULL,
"LUMINANCE-F", 0xF, NULL,
NULL);
if(radio_format == NULL)
Expand Down Expand Up @@ -256,6 +257,11 @@ static int texgz_export(const gchar* filename,
type = TEXGZ_UNSIGNED_BYTE;
format = TEXGZ_LUMINANCE;
}
else if(dialog->format == 16)
{
type = TEXGZ_UNSIGNED_BYTE;
format = TEXGZ_LUMINANCE_ALPHA;
}
else if(dialog->format == 0xF)
{
type = TEXGZ_FLOAT;
Expand Down
85 changes: 85 additions & 0 deletions texgz_tex.c
Expand Up @@ -283,6 +283,44 @@ static texgz_tex_t* texgz_tex_8to8888(texgz_tex_t* self)
return tex;
}

static texgz_tex_t* texgz_tex_LAto8888(texgz_tex_t* self)
{
assert(self);
LOGD("debug");

if((self->type != TEXGZ_UNSIGNED_BYTE) ||
(self->format != TEXGZ_LUMINANCE_ALPHA))
{
LOGE("invalid type=0x%X, format=0x%X", self->type, self->format);
return NULL;
}

texgz_tex_t* tex = texgz_tex_new(self->width, self->height,
self->stride, self->vstride,
TEXGZ_UNSIGNED_BYTE, TEXGZ_RGBA,
NULL);
if(tex == NULL)
return NULL;

int x, y, idx;
for(y = 0; y < tex->vstride; ++y)
{
for(x = 0; x < tex->stride; ++x)
{
idx = y*tex->stride + x;
unsigned char* src = &self->pixels[2*idx];
unsigned char* dst = &tex->pixels[4*idx];

dst[0] = src[0];
dst[1] = src[0];
dst[2] = src[0];
dst[3] = src[1];
}
}

return tex;
}

static texgz_tex_t* texgz_tex_Fto8888(texgz_tex_t* self)
{
assert(self);
Expand Down Expand Up @@ -515,6 +553,43 @@ static texgz_tex_t* texgz_tex_8888to8(texgz_tex_t* self)
return tex;
}

static texgz_tex_t* texgz_tex_8888toLA(texgz_tex_t* self)
{
assert(self);
LOGD("debug");

if((self->type != TEXGZ_UNSIGNED_BYTE) || (self->format != TEXGZ_RGBA))
{
LOGE("invalid type=0x%X, format=0x%X", self->type, self->format);
return NULL;
}

texgz_tex_t* tex = texgz_tex_new(self->width, self->height,
self->stride, self->vstride,
TEXGZ_UNSIGNED_BYTE,
TEXGZ_LUMINANCE_ALPHA,
NULL);
if(tex == NULL)
return NULL;

int x, y, idx;
for(y = 0; y < tex->vstride; ++y)
{
for(x = 0; x < tex->stride; ++x)
{
idx = y*tex->stride + x;
unsigned char* src = &self->pixels[4*idx];
unsigned char* dst = &tex->pixels[2*idx];

unsigned int luminance = (src[0] + src[1] + src[2])/3;
dst[0] = (unsigned char) luminance;
dst[1] = src[3];
}
}

return tex;
}

static texgz_tex_t* texgz_tex_8888toF(texgz_tex_t* self)
{
assert(self);
Expand Down Expand Up @@ -731,6 +806,9 @@ texgz_tex_t* texgz_tex_new(int width, int height,
; // ok
else if((type == TEXGZ_UNSIGNED_BYTE) && (format == TEXGZ_LUMINANCE))
; // ok
else if((type == TEXGZ_UNSIGNED_BYTE) &&
(format == TEXGZ_LUMINANCE_ALPHA))
; // ok
else if((type == TEXGZ_UNSIGNED_BYTE) && (format == TEXGZ_BGRA))
; // ok
else if((type == TEXGZ_FLOAT) && (format == TEXGZ_LUMINANCE))
Expand Down Expand Up @@ -1187,6 +1265,9 @@ texgz_tex_t* texgz_tex_convertcopy(texgz_tex_t* self, int type, int format)
tmp = texgz_tex_888to8888(self);
else if((self->type == TEXGZ_UNSIGNED_BYTE) && (self->format == TEXGZ_LUMINANCE))
tmp = texgz_tex_8to8888(self);
else if((self->type == TEXGZ_UNSIGNED_BYTE) &&
(self->format == TEXGZ_LUMINANCE_ALPHA))
tmp = texgz_tex_LAto8888(self);
else if((self->type == TEXGZ_FLOAT) && (self->format == TEXGZ_LUMINANCE))
tmp = texgz_tex_Fto8888(self);
else if((self->type == TEXGZ_UNSIGNED_BYTE) && (self->format == TEXGZ_BGRA))
Expand Down Expand Up @@ -1216,6 +1297,9 @@ texgz_tex_t* texgz_tex_convertcopy(texgz_tex_t* self, int type, int format)
tex = texgz_tex_8888to888(tmp);
else if((type == TEXGZ_UNSIGNED_BYTE) && (format == TEXGZ_LUMINANCE))
tex = texgz_tex_8888to8(tmp);
else if((type == TEXGZ_UNSIGNED_BYTE) &&
(format == TEXGZ_LUMINANCE_ALPHA))
tex = texgz_tex_8888toLA(tmp);
else if((type == TEXGZ_FLOAT) && (format == TEXGZ_LUMINANCE))
tex = texgz_tex_8888toF(tmp);
else if((type == TEXGZ_UNSIGNED_BYTE) && (format == TEXGZ_BGRA))
Expand Down Expand Up @@ -1419,6 +1503,7 @@ int texgz_tex_bpp(texgz_tex_t* self)
else if((self->type == TEXGZ_UNSIGNED_BYTE) && (self->format == TEXGZ_RGBA)) bpp = 4;
else if((self->type == TEXGZ_UNSIGNED_BYTE) && (self->format == TEXGZ_BGRA)) bpp = 4;
else if((self->type == TEXGZ_UNSIGNED_BYTE) && (self->format == TEXGZ_LUMINANCE)) bpp = 1;
else if((self->type == TEXGZ_UNSIGNED_BYTE) && (self->format == TEXGZ_LUMINANCE_ALPHA)) bpp = 2;
else if((self->type == TEXGZ_FLOAT) && (self->format == TEXGZ_LUMINANCE)) bpp = 4;
else if((self->type == TEXGZ_UNSIGNED_SHORT_5_6_5) && (self->format == TEXGZ_RGB)) bpp = 2;
else if((self->type == TEXGZ_UNSIGNED_SHORT_4_4_4_4) && (self->format == TEXGZ_RGBA)) bpp = 2;
Expand Down
9 changes: 5 additions & 4 deletions texgz_tex.h
Expand Up @@ -37,10 +37,11 @@
#define TEXGZ_FLOAT 0x1406

// OpenGL ES format
#define TEXGZ_RGB 0x1907
#define TEXGZ_RGBA 0x1908
#define TEXGZ_BGRA 0x80E1
#define TEXGZ_LUMINANCE 0x1909
#define TEXGZ_RGB 0x1907
#define TEXGZ_RGBA 0x1908
#define TEXGZ_BGRA 0x80E1
#define TEXGZ_LUMINANCE 0x1909
#define TEXGZ_LUMINANCE_ALPHA 0x190A

typedef struct
{
Expand Down

0 comments on commit 31c7b83

Please sign in to comment.