23,217
社区成员




int jnImage::loadFromFile(string filename)
{
clear();
FILE *fp = fopen(filename.c_str(), "rb");
if (NULL == fp)
{
LogFatal(LOG_FILE, "No such File: %s", filename.c_str());
return -1;
}
png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0);
png_infop info_ptr = png_create_info_struct(png_ptr);
setjmp(png_jmpbuf(png_ptr));
png_init_io(png_ptr, fp);
png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_EXPAND, 0);
fclose(fp);
width = png_get_image_width(png_ptr, info_ptr);
height = png_get_image_height(png_ptr, info_ptr);
int color_type = png_get_color_type(png_ptr, info_ptr);
int bys = 0;
switch (color_type)
{
case PNG_COLOR_TYPE_RGB:
alpha = 0;
bys = 3;
break;
case PNG_COLOR_TYPE_RGB_ALPHA:
alpha = 1;
bys = 4;
break;
default:
png_destroy_read_struct(&png_ptr, &info_ptr, 0);
LogFatal(LOG_FILE, "Not support this color type. %s:%d",
filename.c_str(), color_type);
return -2;
}
int size = width * height * bys;
data = (unsigned char*) malloc(size);
png_bytep* row_pointers = png_get_rows(png_ptr, info_ptr);
int pos = 0;
int i,j;
for(i=0; i<height; i++)
{
for(j=0; j<(bys*width); j+=bys)
{
data[pos++] = row_pointers[i][j];
data[pos++] = row_pointers[i][j+1];
data[pos++] = row_pointers[i][j+2];
if (bys == 4)
data[pos++] = row_pointers[i][j+3];
}
}
png_destroy_read_struct(&png_ptr, &info_ptr, 0);
return 0;
}
void jnTexture::addFromFile(string filename)
{
jnImage image;
if (image.loadFromFile(filename) != 0)
return;
glBindTexture(GL_TEXTURE_2D, _array[_count]);
if (image.alpha == 1)
{
_blend = 1;
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.width,
image.height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
image.data);
}
else
{
_blend = 0;
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image.width,
image.height, 0, GL_RGB, GL_UNSIGNED_BYTE,
image.data);
}
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
_count++;
}
3、绘制
[code=C/C++]
void jnRenderable::render(int index)
{
if (_visible == false)
return;
glPushMatrix();
glTranslatef(_position.x, _position.y, 0.0f);
//glRotatef(_rotation, 0, 0, 1);
//glColor4f(sprite->color.r, sprite->color.g, sprite->color.b, sprite->color.a);
_texture->blendBegin();
glEnable(GL_TEXTURE_2D);
GLuint tex = _texture->getTexture(index);
//if (tex == 0)
//{
// LogFatal(LOG_FILE, "tex error ! tex = %d", tex);
// return;
//}
glBindTexture(GL_TEXTURE_2D, tex);
glBegin(GL_QUADS);
{
_texture->render(TEXTURE_LEFT_TOP);
glVertex2i(_size.w/-2, _size.h/2);
_texture->render(TEXTURE_LEFT_BOTTOM);
glVertex2i(_size.w/-2, _size.h/-2);
_texture->render(TEXTURE_RIGHT_BOTTOM);
glVertex2i(_size.w/2, _size.h/-2);
_texture->render(TEXTURE_RIGHT_TOP);
glVertex2i(_size.w/2, _size.h/2);
}
glEnd();
glDisable(GL_TEXTURE_2D);
_texture->blendEnd();
glPopMatrix();
}