handle images that have alpha vhannel but are arbage (in gl) eg 0 or

something other than 0xff



SVN revision: 45350
This commit is contained in:
Carsten Haitzler 2010-01-20 03:59:32 +00:00
parent a5d8c4f9b8
commit efec562314
9 changed files with 164 additions and 58 deletions

View File

@ -135,6 +135,11 @@ struct _Evas_GL_Context
GLfloat *texuv2;
GLfloat *texuv3;
Eina_Bool line : 1;
Eina_Bool use_vertex : 1;
Eina_Bool use_color : 1;
Eina_Bool use_texuv : 1;
Eina_Bool use_texuv2 : 1;
Eina_Bool use_texuv3 : 1;
} array;
struct {
Eina_Bool size : 1;

View File

@ -228,7 +228,6 @@ evas_gl_common_context_new(void)
glEnableVertexAttribArray(SHAD_VERTEX);
glEnableVertexAttribArray(SHAD_COLOR);
glEnableVertexAttribArray(SHAD_TEXUV);
evas_gl_common_shader_program_init(&(shared->shader.rect),
&(shader_rect_vert_src),
@ -307,9 +306,9 @@ evas_gl_common_context_free(Evas_GL_Context *gc)
}
free(gc->array.vertex);
free(gc->array.color);
free(gc->array.texuv);
if (gc->array.vertex) free(gc->array.vertex);
if (gc->array.color) free(gc->array.color);
if (gc->array.texuv) free(gc->array.texuv);
if (gc->array.texuv2) free(gc->array.texuv2);
if (gc->array.texuv3) free(gc->array.texuv3);
@ -385,16 +384,21 @@ _evas_gl_common_context_array_alloc(Evas_GL_Context *gc)
{
if (gc->array.num <= gc->array.alloc) return;
gc->array.alloc += 6 * 1024;
gc->array.vertex = realloc(gc->array.vertex,
gc->array.alloc * sizeof(GLshort) * 3);
gc->array.color = realloc(gc->array.color,
gc->array.alloc * sizeof(GLubyte) * 4);
gc->array.texuv = realloc(gc->array.texuv,
gc->array.alloc * sizeof(GLfloat) * 2);
gc->array.texuv2 = realloc(gc->array.texuv2,
gc->array.alloc * sizeof(GLfloat) * 2);
gc->array.texuv3 = realloc(gc->array.texuv3,
if (gc->array.use_vertex)
gc->array.vertex = realloc(gc->array.vertex,
gc->array.alloc * sizeof(GLshort) * 3);
if (gc->array.use_color)
gc->array.color = realloc(gc->array.color,
gc->array.alloc * sizeof(GLubyte) * 4);
if (gc->array.use_texuv)
gc->array.texuv = realloc(gc->array.texuv,
gc->array.alloc * sizeof(GLfloat) * 2);
if (gc->array.use_texuv2)
gc->array.texuv2 = realloc(gc->array.texuv2,
gc->array.alloc * sizeof(GLfloat) * 2);
if (gc->array.use_texuv3)
gc->array.texuv3 = realloc(gc->array.texuv3,
gc->array.alloc * sizeof(GLfloat) * 2);
}
void
@ -412,7 +416,7 @@ evas_gl_common_context_line_push(Evas_GL_Context *gc,
if (gc->dc->render_op == EVAS_RENDER_COPY) blend = 0;
gc->shader.cur_tex = 0;
gc->shader.cur_prog = gc->shared->shader.rect.prog;
gc->shader.blend = blend;
gc->shader.blend = 1;
gc->shader.render_op = gc->dc->render_op;
gc->shader.clip = clip;
gc->shader.cx = cx;
@ -421,13 +425,19 @@ evas_gl_common_context_line_push(Evas_GL_Context *gc,
gc->shader.ch = ch;
gc->array.line = 1;
gc->array.use_vertex = 1;
gc->array.use_color = 1;
gc->array.use_texuv = 0;
gc->array.use_texuv2 = 0;
gc->array.use_texuv3 = 0;
pnum = gc->array.num;
nv = pnum * 3; nc = pnum * 4; nu = pnum * 2; nt = pnum * 4;
gc->array.num += 1;
_evas_gl_common_context_array_alloc(gc);
PUSH_VERTEX(x1 , y1 , 0);
PUSH_VERTEX(x2 , y2 , 0);
PUSH_VERTEX(x1, y1, 0);
PUSH_VERTEX(x2, y2, 0);
for (i = 0; i < 2; i++)
{
@ -436,6 +446,11 @@ evas_gl_common_context_line_push(Evas_GL_Context *gc,
shader_array_flush(gc);
gc->array.line = 0;
gc->array.use_vertex = 0;
gc->array.use_color = 0;
gc->array.use_texuv = 0;
gc->array.use_texuv2 = 0;
gc->array.use_texuv3 = 0;
}
void
@ -448,9 +463,12 @@ evas_gl_common_context_rectangle_push(Evas_GL_Context *gc,
if (a < 255) blend = 1;
if (gc->dc->render_op == EVAS_RENDER_COPY) blend = 0;
gc->shader.blend = 1;
if ((gc->shader.cur_tex != 0)
|| (gc->shader.cur_prog != gc->shared->shader.rect.prog)
|| (gc->shader.blend != blend)
// || (gc->shader.blend != blend)
|| (gc->shader.render_op != gc->dc->render_op)
|| (gc->shader.clip != 0)
)
@ -458,10 +476,17 @@ evas_gl_common_context_rectangle_push(Evas_GL_Context *gc,
shader_array_flush(gc);
gc->shader.cur_tex = 0;
gc->shader.cur_prog = gc->shared->shader.rect.prog;
gc->shader.blend = blend;
gc->shader.blend = 1;
gc->shader.render_op = gc->dc->render_op;
gc->shader.clip = 0;
}
gc->array.line = 0;
gc->array.use_vertex = 1;
gc->array.use_color = 1;
gc->array.use_texuv = 0;
gc->array.use_texuv2 = 0;
gc->array.use_texuv3 = 0;
pnum = gc->array.num;
nv = pnum * 3; nc = pnum * 4; nu = pnum * 2; nt = pnum * 4;
@ -476,10 +501,6 @@ evas_gl_common_context_rectangle_push(Evas_GL_Context *gc,
PUSH_VERTEX(x + w, y + h, 0);
PUSH_VERTEX(x , y + h, 0);
for (i = 0; i < 6; i++)
{
PUSH_TEXUV(0.0, 0.0);
}
for (i = 0; i < 6; i++)
{
PUSH_COLOR(r, g, b, a);
@ -494,17 +515,20 @@ evas_gl_common_context_image_push(Evas_GL_Context *gc,
int r, int g, int b, int a,
Eina_Bool smooth)
{
int pnum, nv, nc, nu, nt, i;
int pnum, nv, nc, nu, nu2, nt, i;
GLfloat tx1, tx2, ty1, ty2;
GLfloat bl = 1.0;
Eina_Bool blend = 1;
if (tex->pt->format == GL_RGB) blend = 0;
if (a < 255) blend = 1;
// if (a < 255) blend = 1;
gc->shader.blend = 1;
if ((gc->shader.cur_tex != tex->pt->texture)
|| (gc->shader.cur_prog != gc->shared->shader.img.prog)
|| (gc->shader.smooth != smooth)
|| (gc->shader.blend != blend)
// || (gc->shader.blend != blend)
|| (gc->shader.render_op != gc->dc->render_op)
|| (gc->shader.clip != 0)
)
@ -513,13 +537,20 @@ evas_gl_common_context_image_push(Evas_GL_Context *gc,
gc->shader.cur_tex = tex->pt->texture;
gc->shader.cur_prog = gc->shared->shader.img.prog;
gc->shader.smooth = smooth;
gc->shader.blend = blend;
gc->shader.blend = 1;
gc->shader.render_op = gc->dc->render_op;
gc->shader.clip = 0;
}
}
gc->array.line = 0;
gc->array.use_vertex = 1;
gc->array.use_color = 1;
gc->array.use_texuv = 1;
gc->array.use_texuv2 = 1;
gc->array.use_texuv3 = 0;
pnum = gc->array.num;
nv = pnum * 3; nc = pnum * 4; nu = pnum * 2; nt = pnum * 4;
nv = pnum * 3; nc = pnum * 4; nu = pnum * 2; nu2 = pnum * 2;
nt = pnum * 4;
gc->array.num += 6;
_evas_gl_common_context_array_alloc(gc);
@ -528,6 +559,8 @@ evas_gl_common_context_image_push(Evas_GL_Context *gc,
tx2 = ((double)(tex->x) + sx + sw) / (double)tex->pt->w;
ty2 = ((double)(tex->y) + sy + sh) / (double)tex->pt->h;
if (blend) bl = 0.0;
PUSH_VERTEX(x , y , 0);
PUSH_VERTEX(x + w, y , 0);
PUSH_VERTEX(x , y + h, 0);
@ -536,6 +569,10 @@ evas_gl_common_context_image_push(Evas_GL_Context *gc,
PUSH_TEXUV(tx2, ty1);
PUSH_TEXUV(tx1, ty2);
PUSH_TEXUV2(bl, 0.0);
PUSH_TEXUV2(bl, 0.0);
PUSH_TEXUV2(bl, 0.0);
PUSH_VERTEX(x + w, y , 0);
PUSH_VERTEX(x + w, y + h, 0);
PUSH_VERTEX(x , y + h, 0);
@ -544,6 +581,10 @@ evas_gl_common_context_image_push(Evas_GL_Context *gc,
PUSH_TEXUV(tx2, ty2);
PUSH_TEXUV(tx1, ty2);
PUSH_TEXUV2(bl, 0.0);
PUSH_TEXUV2(bl, 0.0);
PUSH_TEXUV2(bl, 0.0);
for (i = 0; i < 6; i++)
{
PUSH_COLOR(r, g, b, a);
@ -560,10 +601,12 @@ evas_gl_common_context_font_push(Evas_GL_Context *gc,
int pnum, nv, nc, nu, nt, i;
GLfloat tx1, tx2, ty1, ty2;
gc->shader.blend = 1;
if ((gc->shader.cur_tex != tex->pt->texture)
|| (gc->shader.cur_prog != gc->shared->shader.font.prog)
|| (gc->shader.smooth != 0)
|| (gc->shader.blend != 1)
// || (gc->shader.blend != 1)
|| (gc->shader.render_op != gc->dc->render_op)
|| (gc->shader.clip != 0)
)
@ -576,6 +619,12 @@ evas_gl_common_context_font_push(Evas_GL_Context *gc,
gc->shader.render_op = gc->dc->render_op;
gc->shader.clip = 0;
}
gc->array.line = 0;
gc->array.use_vertex = 1;
gc->array.use_color = 1;
gc->array.use_texuv = 1;
gc->array.use_texuv2 = 0;
gc->array.use_texuv3 = 0;
pnum = gc->array.num;
nv = pnum * 3; nc = pnum * 4; nu = pnum * 2; nt = pnum * 4;
@ -633,10 +682,12 @@ evas_gl_common_context_yuv_push(Evas_GL_Context *gc,
if (a < 255) blend = 1;
gc->shader.blend = 1;
if ((gc->shader.cur_tex != tex->pt->texture)
|| (gc->shader.cur_prog != gc->shared->shader.yuv.prog)
|| (gc->shader.smooth != smooth)
|| (gc->shader.blend != blend)
// || (gc->shader.blend != blend)
|| (gc->shader.render_op != gc->dc->render_op)
|| (gc->shader.clip != 0)
)
@ -647,10 +698,16 @@ evas_gl_common_context_yuv_push(Evas_GL_Context *gc,
gc->shader.cur_texv = tex->ptv->texture;
gc->shader.cur_prog = gc->shared->shader.yuv.prog;
gc->shader.smooth = smooth;
gc->shader.blend = blend;
gc->shader.blend = 1;
gc->shader.render_op = gc->dc->render_op;
gc->shader.clip = 0;
}
gc->array.line = 0;
gc->array.use_vertex = 1;
gc->array.use_color = 1;
gc->array.use_texuv = 1;
gc->array.use_texuv2 = 1;
gc->array.use_texuv3 = 1;
pnum = gc->array.num;
nv = pnum * 3; nc = pnum * 4; nu = pnum * 2;
@ -714,23 +771,24 @@ evas_gl_common_context_image_map4_push(Evas_GL_Context *gc,
int r, int g, int b, int a,
Eina_Bool smooth, Eina_Bool tex_only)
{
int pnum, nv, nc, nu, nt, i;
int pnum, nv, nc, nu, nu2, nt, i;
const int points[6] = { 0, 1, 2, 0, 2, 3 };
GLfloat tx[4], ty[4];
GLfloat bl = 1.0;
Eina_Bool blend = 1;
RGBA_Map_Point *pt;
DATA32 cmul;
blend = 1;
gc->shader.blend = 1;
// if (tex->pt->format == GL_RGB) blend = 0;
if (tex->pt->format == GL_RGB) blend = 0;
// if (a < 255) blend = 1;
if ((gc->shader.cur_tex != tex->pt->texture)
|| ((tex_only) && (gc->shader.cur_prog != gc->shared->shader.tex.prog))
|| ((!tex_only) && (gc->shader.cur_prog != gc->shared->shader.img.prog))
|| (gc->shader.smooth != smooth)
|| (gc->shader.blend != blend)
// || (gc->shader.blend != blend)
|| (gc->shader.render_op != gc->dc->render_op)
|| (gc->shader.clip != clip)
|| (gc->shader.cx != cx)
@ -746,7 +804,7 @@ evas_gl_common_context_image_map4_push(Evas_GL_Context *gc,
else
gc->shader.cur_prog =gc->shared->shader.img.prog;
gc->shader.smooth = smooth;
gc->shader.blend = blend;
gc->shader.blend = 1;
gc->shader.render_op = gc->dc->render_op;
gc->shader.clip = clip;
gc->shader.cx = cx;
@ -754,9 +812,16 @@ evas_gl_common_context_image_map4_push(Evas_GL_Context *gc,
gc->shader.cw = cw;
gc->shader.ch = ch;
}
gc->array.line = 0;
gc->array.use_vertex = 1;
gc->array.use_color = 1;
gc->array.use_texuv = 1;
gc->array.use_texuv2 = 1;
gc->array.use_texuv3 = 0;
pnum = gc->array.num;
nv = pnum * 3; nc = pnum * 4; nu = pnum * 2; nt = pnum * 4;
nv = pnum * 3; nc = pnum * 4; nu = pnum * 2; nu2 = pnum * 2;
nt = pnum * 4;
gc->array.num += 6;
_evas_gl_common_context_array_alloc(gc);
@ -767,6 +832,9 @@ evas_gl_common_context_image_map4_push(Evas_GL_Context *gc,
ty[i] = ((double)(tex->y) + (((double)p[i].v) / FP1)) /
(double)tex->pt->h;
}
if (blend) bl = 0.0;
cmul = ARGB_JOIN(a, r, g, b);
for (i = 0; i < 6; i++)
{
@ -778,6 +846,9 @@ evas_gl_common_context_image_map4_push(Evas_GL_Context *gc,
// (p[points[i]].z >> FP));
PUSH_TEXUV(tx[points[i]],
ty[points[i]]);
PUSH_TEXUV2(bl, 0.0);
PUSH_COLOR(R_VAL(&cl),
G_VAL(&cl),
B_VAL(&cl),
@ -895,17 +966,24 @@ shader_array_flush(Evas_GL_Context *gc)
*/
glVertexAttribPointer(SHAD_VERTEX, 3, GL_SHORT, GL_FALSE, 0, gc->array.vertex);
glVertexAttribPointer(SHAD_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, gc->array.color);
glVertexAttribPointer(SHAD_TEXUV, 2, GL_FLOAT, GL_FALSE, 0, gc->array.texuv);
if (gc->array.use_texuv)
{
glEnableVertexAttribArray(SHAD_TEXUV);
glVertexAttribPointer(SHAD_TEXUV, 2, GL_FLOAT, GL_FALSE, 0, gc->array.texuv);
}
else
glDisableVertexAttribArray(SHAD_TEXUV);
if (gc->array.line)
{
glDisableVertexAttribArray(SHAD_TEXUV2);
glDisableVertexAttribArray(SHAD_TEXUV);
glDisableVertexAttribArray(SHAD_TEXUV2);
glDisableVertexAttribArray(SHAD_TEXUV3);
glDrawArrays(GL_LINES, 0, gc->array.num);
}
else
{
if ((gc->array.texuv2) && (gc->array.texuv3))
if ((gc->array.use_texuv2) && (gc->array.use_texuv3))
{
glEnableVertexAttribArray(SHAD_TEXUV2);
glEnableVertexAttribArray(SHAD_TEXUV3);
@ -916,6 +994,11 @@ shader_array_flush(Evas_GL_Context *gc)
glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, gc->shader.cur_texv);
}
else if (gc->array.use_texuv2)
{
glEnableVertexAttribArray(SHAD_TEXUV2);
glVertexAttribPointer(SHAD_TEXUV2, 2, GL_FLOAT, GL_FALSE, 0, gc->array.texuv2);
}
else
{
glDisableVertexAttribArray(SHAD_TEXUV2);
@ -935,9 +1018,9 @@ shader_array_flush(Evas_GL_Context *gc)
gc->shader.current.cw = gc->shader.cw;
gc->shader.current.ch = gc->shader.ch;
free(gc->array.vertex);
free(gc->array.color);
free(gc->array.texuv);
if (gc->array.vertex) free(gc->array.vertex);
if (gc->array.color) free(gc->array.color);
if (gc->array.texuv) free(gc->array.texuv);
if (gc->array.texuv2) free(gc->array.texuv2);
if (gc->array.texuv3) free(gc->array.texuv3);

View File

@ -3,8 +3,8 @@
#if 1
static const GLenum rgba_fmt = GL_RGBA;
static const GLenum rgba_ifmt = GL_RGBA;
static const GLenum rgb_fmt = GL_RGBA;
static const GLenum rgb_ifmt = GL_RGBA;
static const GLenum rgb_fmt = GL_RGB;
static const GLenum rgb_ifmt = GL_RGB;
static const GLenum alpha_fmt = GL_ALPHA;
static const GLenum alpha_ifmt = GL_ALPHA;
static const GLenum lum_fmt = GL_LUMINANCE;
@ -12,8 +12,8 @@ static const GLenum lum_ifmt = GL_LUMINANCE;
#else
static const GLenum rgba_fmt = GL_RGBA;
static const GLenum rgba_ifmt = GL_COMPRESSED_RGBA;
static const GLenum rgb_fmt = GL_RGBA;
static const GLenum rgb_ifmt = GL_COMPRESSED_RGBA;
static const GLenum rgb_fmt = GL_RGB;
static const GLenum rgb_ifmt = GL_COMPRESSED_RGB;
static const GLenum alpha_fmt = GL_ALPHA;
static const GLenum alpha_ifmt = GL_COMPRESSED_ALPHA;
static const GLenum lum_fmt = GL_LUMINANCE;
@ -386,42 +386,48 @@ evas_gl_common_texture_update(Evas_GL_Texture *tex, RGBA_Image *im)
//
_tex_sub_2d(tex->x, tex->y,
im->cache_entry.w, im->cache_entry.h,
tex->pt->format, tex->pt->dataformat,
// tex->pt->format, tex->pt->dataformat,
rgba_fmt, tex->pt->dataformat,
im->image.data);
// |xxx
// |xxx
//
_tex_sub_2d(tex->x - 1, tex->y,
1, im->cache_entry.h,
tex->pt->format, tex->pt->dataformat,
// tex->pt->format, tex->pt->dataformat,
rgba_fmt, tex->pt->dataformat,
im->image.data);
// xxx|
// xxx|
//
_tex_sub_2d(tex->x + im->cache_entry.w, tex->y,
1, im->cache_entry.h,
tex->pt->format, tex->pt->dataformat,
// tex->pt->format, tex->pt->dataformat,
rgba_fmt, tex->pt->dataformat,
im->image.data + (im->cache_entry.w - 1));
// xxx
// xxx
// ---
_tex_sub_2d(tex->x, tex->y + im->cache_entry.h,
im->cache_entry.w, 1,
tex->pt->format, tex->pt->dataformat,
// tex->pt->format, tex->pt->dataformat,
rgba_fmt, tex->pt->dataformat,
im->image.data + ((im->cache_entry.h - 1) * im->cache_entry.w));
// xxx
// xxx
// o
_tex_sub_2d(tex->x - 1, tex->y + im->cache_entry.h,
1, 1,
tex->pt->format, tex->pt->dataformat,
// tex->pt->format, tex->pt->dataformat,
rgba_fmt, tex->pt->dataformat,
im->image.data + ((im->cache_entry.h - 1) * im->cache_entry.w));
// xxx
// xxx
// o
_tex_sub_2d(tex->x + im->cache_entry.w, tex->y + im->cache_entry.h,
1, 1,
tex->pt->format, tex->pt->dataformat,
// tex->pt->format, tex->pt->dataformat,
rgba_fmt, tex->pt->dataformat,
im->image.data + ((im->cache_entry.h - 1) * im->cache_entry.w) + (im->cache_entry.w - 1));
if (tex->pt->texture != tex->gc->shader.cur_tex)
glBindTexture(GL_TEXTURE_2D, tex->gc->shader.cur_tex);

View File

@ -1,5 +1,5 @@
#!/bin/sh
ORIONEXE=/home/raster/Data/orion/orion.exe
ORIONEXE=/home/raster/samsung/build/x1/tools/orion/orion.exe
OPTS="-O --nolodcalc -lp"
function compile()

View File

@ -1,4 +1,4 @@
#!/bin/sh
#!/bin/bash
function compile()
{
F=$1

View File

@ -4,7 +4,10 @@
"uniform sampler2D tex;\n"
"varying vec4 col;\n"
"varying vec2 tex_c;\n"
"varying vec2 tex_c2;\n"
"void main()\n"
"{\n"
" gl_FragColor = texture2D(tex, tex_c.xy).bgra * col;\n"
" vec4 t = texture2D(tex, tex_c.xy).bgra;\n"
" vec4 c = vec4(t.r, t.g, t.b, t.a + tex_c2.x);\n"
" gl_FragColor = c * col;\n"
"}\n"

View File

@ -4,7 +4,10 @@ precision mediump float;
uniform sampler2D tex;
varying vec4 col;
varying vec2 tex_c;
varying vec2 tex_c2;
void main()
{
gl_FragColor = texture2D(tex, tex_c.xy).bgra * col;
vec4 t = texture2D(tex, tex_c.xy).bgra;
vec4 c = vec4(t.r, t.g, t.b, t.a + tex_c2.x);
gl_FragColor = c * col;
}

View File

@ -4,12 +4,15 @@
"attribute vec4 vertex;\n"
"attribute vec4 color;\n"
"attribute vec2 tex_coord;\n"
"attribute vec2 tex_coord2;\n"
"uniform mat4 mvp;\n"
"varying vec4 col;\n"
"varying vec2 tex_c;\n"
"varying vec2 tex_c2;\n"
"void main()\n"
"{\n"
" gl_Position = mvp * vertex;\n"
" col = color;\n"
" tex_c = tex_coord;\n"
" tex_c2 = tex_coord2;\n"
"}\n"

View File

@ -4,12 +4,15 @@ precision mediump float;
attribute vec4 vertex;
attribute vec4 color;
attribute vec2 tex_coord;
attribute vec2 tex_coord2;
uniform mat4 mvp;
varying vec4 col;
varying vec2 tex_c;
varying vec2 tex_c2;
void main()
{
gl_Position = mvp * vertex;
col = color;
tex_c = tex_coord;
tex_c2 = tex_coord2;
}