void Canvas::text_clipped(int x, int y, unsigned width, const TCHAR *text) { #ifdef HAVE_GLES assert(x_offset == OpenGL::translate_x); assert(y_offset == OpenGL::translate_y); #endif if (font == NULL) return; GLTexture *texture = TextCache::get(font, COLOR_BLACK, COLOR_WHITE, text); if (texture == NULL) return; GLEnable scope(GL_TEXTURE_2D); texture->bind(); GLLogicOp logic_op(GL_AND_INVERTED); unsigned height = texture->get_height(); if (texture->get_width() < width) width = texture->get_width(); /* cut out the shape in black */ OpenGL::glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); texture->draw(x, y, width, height, 0, 0, width, height); if (text_color != COLOR_BLACK) { /* draw the text color on top */ OpenGL::glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); logic_op.set(GL_OR); text_color.set(); texture->draw(x, y, width, height, 0, 0, width, height); } }
void Canvas::stretch(int dest_x, int dest_y, unsigned dest_width, unsigned dest_height, const GLTexture &texture) { stretch(dest_x, dest_y, dest_width, dest_height, texture, 0, 0, texture.get_width(), texture.get_height()); }
void Canvas::text(int x, int y, const TCHAR *text) { #ifdef HAVE_GLES assert(x_offset == OpenGL::translate_x); assert(y_offset == OpenGL::translate_y); #endif if (font == NULL) return; GLTexture *texture = TextCache::get(font, COLOR_BLACK, COLOR_WHITE, text); if (texture == NULL) return; if (background_mode == OPAQUE) /* draw the opaque background */ fill_rectangle(x, y, x + texture->get_width(), y + texture->get_height(), background_color); GLEnable scope(GL_TEXTURE_2D); texture->bind(); GLLogicOp logic_op(GL_AND_INVERTED); if (background_mode != OPAQUE || background_color != COLOR_BLACK) { /* cut out the shape in black */ OpenGL::glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); texture->draw(x, y); } if (text_color != COLOR_BLACK) { /* draw the text color on top */ OpenGL::glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); logic_op.set(GL_OR); text_color.set(); texture->draw(x, y); } }