optimize... optimize...

texture generation is 850% faster now that.. I err.. bypass libGLU - GLU is
err.. SLOOOOOOW as balls when it comes to mipmap generation


SVN revision: 4677
This commit is contained in:
Carsten Haitzler 2001-04-29 00:48:55 +00:00
parent e960a19634
commit 6cec72cccf
1 changed files with 61 additions and 14 deletions

View File

@ -519,29 +519,76 @@ __evas_gl_texture_new(Evas_GL_Window *w, Imlib_Image im, int ix, int iy, int iw,
} }
} }
#ifdef HAVE_GLU #ifdef HAVE_GLU
if (imlib_image_has_alpha()) /* FIXME: GLU mipmap generation is BLOODY SLOW */
if (0) /* if libGLU is fucking slow piece of shit - do it ourselves */
{ {
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA8, tw, th, GL_RGBA, if (imlib_image_has_alpha())
GL_UNSIGNED_BYTE, data); gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA8, tw, th, GL_RGBA,
} GL_UNSIGNED_BYTE, data);
else else
{ gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB8, tw, th, GL_RGBA,
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB8, tw, th, GL_RGBA, GL_UNSIGNED_BYTE, data);
GL_UNSIGNED_BYTE, data);
} }
#else #else
if (imlib_image_has_alpha()) if (0)
{ {
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, tw, th, 0, if (imlib_image_has_alpha())
GL_RGBA, GL_UNSIGNED_BYTE, data); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, tw, th, 0,
GL_RGBA, GL_UNSIGNED_BYTE, data);
else
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, tw, th, 0,
GL_RGBA, GL_UNSIGNED_BYTE, data);
} }
#endif
else else
{ {
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, tw, th, 0, int mw, mh;
GL_RGBA, GL_UNSIGNED_BYTE, data); int level;
Imlib_Image im1 = NULL, im2 = NULL;
int alpha = 0;
mw = tw;
mh = th;
level = 0;
alpha = imlib_image_has_alpha();
im1 = imlib_create_image_using_data(tw, th, data);
imlib_context_set_image(im1);
imlib_image_set_has_alpha(1);
for (;;)
{
int pw, ph;
DATA32 *idat;
imlib_context_set_image(im1);
idat = imlib_image_get_data_for_reading_only();
if (alpha)
glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA8, mw, mh, 0,
GL_RGBA, GL_UNSIGNED_BYTE, idat);
else
glTexImage2D(GL_TEXTURE_2D, level, GL_RGB8, mw, mh, 0,
GL_RGBA, GL_UNSIGNED_BYTE, idat);
imlib_image_put_back_data(idat);
if ((mw == 1) && (mh == 1)) break;
level++;
pw = mw; ph = mh;
mw >>= 1; if (mw < 1) mw = 1;
mh >>= 1; if (mh < 1) mh = 1;
im2 = imlib_create_cropped_scaled_image(0, 0, pw, ph, mw, mh);
imlib_free_image();
im1 = im2; im2 = NULL;
imlib_context_set_image(im1);
imlib_image_set_has_alpha(1);
}
if (im1)
{
imlib_context_set_image(im1);
imlib_free_image();
im1 = NULL;
}
} }
#endif
free(data); free(data);
imlib_context_set_image(im);
imlib_image_put_back_data(im_data); imlib_image_put_back_data(im_data);
imlib_context_set_image(prev_im); imlib_context_set_image(prev_im);
return tex; return tex;