/*************************************************************************** file : guiimage.cpp created : Wed May 1 10:29:28 CEST 2002 copyright : (C) 2001 by Eric Espie email : eric.espie@torcs.org version : $Id: guiimage.cpp,v 1.3 2005/02/01 15:55:55 berniw Exp $ ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ /** @file GUI Images management @author Eric Espie @version $Id: guiimage.cpp,v 1.3 2005/02/01 15:55:55 berniw Exp $ @ingroup gui */ #include #ifdef WIN32 #include #endif #include #include "gui.h" /** Create a new static image. This kind of image is not clickable. @ingroup gui @param scr Screen where to add the label @param x Position of the left of the image on the screen @param y Position of the bottom of the image on the screen @param w Width of the image on the screen @param h Height of the image on the screen @param name Filename on the image (png) @return Image Id
-1 Error @warning the image must be sqare and its size must be a power of 2. */ int GfuiStaticImageCreate(void *scr, int x, int y, int w, int h, char *name) { tGfuiImage *image; tGfuiObject *object; tGfuiScreen *screen = (tGfuiScreen*)scr; object = (tGfuiObject*)calloc(1, sizeof(tGfuiObject)); object->widget = GFUI_IMAGE; object->focusMode = GFUI_FOCUS_NONE; object->visible = 1; object->id = screen->curId++; image = &(object->u.image); image->texture = GfImgReadTex(name); if (!image->texture) { free(object); return -1; } object->xmin = x; object->xmax = x + w; object->ymin = y; object->ymax = y + h; gfuiAddObject(screen, object); return object->id; } /** Replace an image by another one. @ingroup gui @param scr Screen where to add the label @param id Image Id @param name Filename on the image (png) @return none @warning the image must be sqare and its size must be a power of 2. */ void GfuiStaticImageSet(void *scr, int id, char *name) { tGfuiObject *curObject; tGfuiScreen *screen = (tGfuiScreen*)scr; tGfuiImage *image; curObject = screen->objects; if (curObject != NULL) { do { curObject = curObject->next; if (curObject->id == id) { if (curObject->widget == GFUI_IMAGE) { image = &(curObject->u.image); GfImgFreeTex(image->texture); image->texture = GfImgReadTex(name); } return; } } while (curObject != screen->objects); } } void gfuiReleaseImage(tGfuiObject *obj) { tGfuiImage *image; image = &(obj->u.image); GfImgFreeTex(image->texture); free(obj); } void gfuiDrawImage(tGfuiObject *obj) { tGfuiImage *image; image = &(obj->u.image); glEnable(GL_TEXTURE_2D); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glBindTexture(GL_TEXTURE_2D, image->texture); glBegin(GL_TRIANGLE_STRIP); { glColor4f(1.0, 1.0, 1.0, 0.0); glTexCoord2f(0.0, 0.0); glVertex2f(obj->xmin, obj->ymin); glTexCoord2f(0.0, 1.0); glVertex2f(obj->xmin, obj->ymax); glTexCoord2f(1.0, 0.0); glVertex2f(obj->xmax, obj->ymin); glTexCoord2f(1.0, 1.0); glVertex2f(obj->xmax, obj->ymax); } glEnd(); glBindTexture(GL_TEXTURE_2D, 0); glDisable(GL_TEXTURE_2D); }