void GLTexture::DrawFlipped(PixelRect dest, PixelRect src) const { #ifdef HAVE_OES_DRAW_TEXTURE if (OpenGL::oes_draw_texture) { DrawFlippedOES(dest, src); return; } #endif const RasterPoint vertices[] = { dest.GetTopLeft(), dest.GetTopRight(), dest.GetBottomLeft(), dest.GetBottomRight(), }; const ScopeVertexPointer vp(vertices); const PixelSize allocated = GetAllocatedSize(); GLfloat x0 = (GLfloat)src.left / allocated.cx; GLfloat y0 = (GLfloat)src.top / allocated.cy; GLfloat x1 = (GLfloat)src.right / allocated.cx; GLfloat y1 = (GLfloat)src.bottom / allocated.cy; const GLfloat coord[] = { x0, y1, x1, y1, x0, y0, x1, y0, }; #ifdef USE_GLSL glEnableVertexAttribArray(OpenGL::Attribute::TEXCOORD); glVertexAttribPointer(OpenGL::Attribute::TEXCOORD, 2, GL_FLOAT, GL_FALSE, 0, coord); #else glEnableClientState(GL_TEXTURE_COORD_ARRAY); glTexCoordPointer(2, GL_FLOAT, 0, coord); #endif glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); #ifdef USE_GLSL glDisableVertexAttribArray(OpenGL::Attribute::TEXCOORD); OpenGL::solid_shader->Use(); #else glDisableClientState(GL_TEXTURE_COORD_ARRAY); #endif }
void DrawVerticalGradient(Canvas &canvas, const PixelRect &rc, Color top_color, Color bottom_color, Color fallback_color) { #if defined(EYE_CANDY) && defined(ENABLE_OPENGL) const RasterPoint vertices[] = { rc.GetTopLeft(), rc.GetTopRight(), rc.GetBottomLeft(), rc.GetBottomRight(), }; glVertexPointer(2, GL_VALUE, 0, vertices); const Color colors[] = { top_color, top_color, bottom_color, bottom_color, }; glEnableClientState(GL_COLOR_ARRAY); #ifdef HAVE_GLES glColorPointer(4, GL_FIXED, 0, colors); #else glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors); #endif static_assert(ARRAY_SIZE(vertices) == ARRAY_SIZE(colors), "Array size mismatch"); glDrawArrays(GL_TRIANGLE_STRIP, 0, ARRAY_SIZE(vertices)); glDisableClientState(GL_COLOR_ARRAY); #else canvas.DrawFilledRectangle(rc, fallback_color); #endif }
void GLTexture::DrawFlipped(PixelRect dest, PixelRect src) const { #ifdef HAVE_OES_DRAW_TEXTURE if (OpenGL::oes_draw_texture) { DrawFlippedOES(dest, src); return; } #endif const RasterPoint vertices[] = { dest.GetTopLeft(), dest.GetTopRight(), dest.GetBottomLeft(), dest.GetBottomRight(), }; glVertexPointer(2, GL_VALUE, 0, vertices); const PixelSize allocated = GetAllocatedSize(); GLfloat x0 = (GLfloat)src.left / allocated.cx; GLfloat y0 = (GLfloat)src.top / allocated.cy; GLfloat x1 = (GLfloat)src.right / allocated.cx; GLfloat y1 = (GLfloat)src.bottom / allocated.cy; const GLfloat coord[] = { x0, y1, x1, y1, x0, y0, x1, y0, }; glEnableClientState(GL_TEXTURE_COORD_ARRAY); glTexCoordPointer(2, GL_FLOAT, 0, coord); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glDisableClientState(GL_TEXTURE_COORD_ARRAY); }