nuclear@4: #include nuclear@4: #include nuclear@4: #include "texture.h" nuclear@4: #include "logger.h" nuclear@4: nuclear@4: Texture::Texture() nuclear@4: { nuclear@4: glGenTextures(1, &tex); nuclear@4: glBindTexture(GL_TEXTURE_2D, tex); nuclear@4: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); nuclear@4: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); nuclear@4: nuclear@4: width = height = 0; nuclear@4: } nuclear@4: nuclear@4: Texture::~Texture() nuclear@4: { nuclear@4: if(tex) { nuclear@4: glDeleteTextures(1, &tex); nuclear@4: } nuclear@4: } nuclear@4: nuclear@4: void Texture::set_image(int x, int y, unsigned char *pix) nuclear@4: { nuclear@4: glBindTexture(GL_TEXTURE_2D, tex); nuclear@4: nuclear@4: if(x == width && y == height) { nuclear@4: if(pix) { nuclear@4: glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, x, y, GL_BGRA, GL_UNSIGNED_BYTE, pix); nuclear@4: } nuclear@4: nuclear@4: } else { nuclear@4: width = x; nuclear@4: height = y; nuclear@4: glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, x, y, 0, GL_BGRA, GL_UNSIGNED_BYTE, nuclear@4: pix ? pix : 0); nuclear@4: } nuclear@4: } nuclear@4: nuclear@4: void Texture::set_image(Display *dpy, Pixmap pixmap) nuclear@4: { nuclear@4: Window root_ret; nuclear@4: int x, y; nuclear@4: unsigned int w, h, border, depth; nuclear@4: XGetGeometry(dpy, pixmap, &root_ret, &x, &y, &w, &h, &border, &depth); nuclear@4: nuclear@4: XImage *ximg = XGetImage(dpy, pixmap, 0, 0, w, h, 0xffffffff, ZPixmap); nuclear@4: if(!ximg) { nuclear@4: log_error("XGetImage failed to create an image from the window pixmap\n"); nuclear@4: return; nuclear@4: } nuclear@4: nuclear@4: glBindTexture(GL_TEXTURE_2D, tex); nuclear@4: nuclear@4: if((int)w == width && (int)h == height) { nuclear@4: glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, w, h, GL_BGRA, GL_UNSIGNED_BYTE, ximg->data); nuclear@4: } else { nuclear@4: width = w; nuclear@4: height = h; nuclear@4: glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, ximg->data); nuclear@4: } nuclear@4: } nuclear@4: nuclear@4: int Texture::get_width() const nuclear@4: { nuclear@4: return width; nuclear@4: } nuclear@4: nuclear@4: int Texture::get_height() const nuclear@4: { nuclear@4: return height; nuclear@4: } nuclear@4: nuclear@4: unsigned int Texture::get_id() const nuclear@4: { nuclear@4: return tex; nuclear@4: }