109    ImGui::SetCurrentContext(
g_ctx);
 
  112    const ImGuiIO& io = ImGui::GetIO();
 
  113    int fb_width = (int)(io.DisplaySize.x * io.DisplayFramebufferScale.x);
 
  114    int fb_height = (int)(io.DisplaySize.y * io.DisplayFramebufferScale.y);
 
  115    if (fb_width == 0 || fb_height == 0)
 
  117    draw_data->ScaleClipRects(io.DisplayFramebufferScale);
 
  120    GLint last_active_texture; glGetIntegerv(GL_ACTIVE_TEXTURE, &last_active_texture);
 
  121    glActiveTexture(GL_TEXTURE0);
 
  122    GLint last_program; glGetIntegerv(GL_CURRENT_PROGRAM, &last_program);
 
  123    GLint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
 
  124    GLint last_array_buffer; glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer);
 
  125    GLint last_element_array_buffer; glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &last_element_array_buffer);
 
  126    GLint last_vertex_array; glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array);
 
  127    GLint last_blend_src_rgb; glGetIntegerv(GL_BLEND_SRC_RGB, &last_blend_src_rgb);
 
  128    GLint last_blend_dst_rgb; glGetIntegerv(GL_BLEND_DST_RGB, &last_blend_dst_rgb);
 
  129    GLint last_blend_src_alpha; glGetIntegerv(GL_BLEND_SRC_ALPHA, &last_blend_src_alpha);
 
  130    GLint last_blend_dst_alpha; glGetIntegerv(GL_BLEND_DST_ALPHA, &last_blend_dst_alpha);
 
  131    GLint last_blend_equation_rgb; glGetIntegerv(GL_BLEND_EQUATION_RGB, &last_blend_equation_rgb);
 
  132    GLint last_blend_equation_alpha; glGetIntegerv(GL_BLEND_EQUATION_ALPHA, &last_blend_equation_alpha);
 
  133    GLint last_viewport[4]; glGetIntegerv(GL_VIEWPORT, last_viewport);
 
  134    GLint last_scissor_box[4]; glGetIntegerv(GL_SCISSOR_BOX, last_scissor_box);
 
  135    GLboolean last_enable_blend = glIsEnabled(GL_BLEND);
 
  136    GLboolean last_enable_cull_face = glIsEnabled(GL_CULL_FACE);
 
  137    GLboolean last_enable_depth_test = glIsEnabled(GL_DEPTH_TEST);
 
  138    GLboolean last_enable_scissor_test = glIsEnabled(GL_SCISSOR_TEST);
 
  142    glBlendEquation(GL_FUNC_ADD);
 
  143    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
  144    glDisable(GL_CULL_FACE);
 
  145    glDisable(GL_DEPTH_TEST);
 
  146    glEnable(GL_SCISSOR_TEST);
 
  149    glViewport(0, 0, (GLsizei)fb_width, (GLsizei)fb_height);
 
  150    const float ortho_projection[4][4] =
 
  152        { 2.0f/io.DisplaySize.x, 0.0f,                   0.0f, 0.0f },
 
  153        { 0.0f,                  2.0f/-io.DisplaySize.y, 0.0f, 0.0f },
 
  154        { 0.0f,                  0.0f,                  -1.0f, 0.0f },
 
  155        {-1.0f,                  1.0f,                   0.0f, 1.0f },
 
  162    for (
int n = 0; n < draw_data->CmdListsCount; n++)
 
  164        const ImDrawList* cmd_list = draw_data->CmdLists[n];
 
  165        const ImDrawIdx* idx_buffer_offset = 0;
 
  168        glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)cmd_list->VtxBuffer.Size * 
sizeof(ImDrawVert), (
const GLvoid*)cmd_list->VtxBuffer.Data, GL_STREAM_DRAW);
 
  171        glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)cmd_list->IdxBuffer.Size * 
sizeof(ImDrawIdx), (
const GLvoid*)cmd_list->IdxBuffer.Data, GL_STREAM_DRAW);
 
  173        for (
int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)
 
  175            const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
 
  176            if (pcmd->UserCallback)
 
  178                pcmd->UserCallback(cmd_list, pcmd);
 
  182                glBindTexture(GL_TEXTURE_2D, (GLuint)(
size_t)pcmd->TextureId);
 
  183                glScissor((
int)pcmd->ClipRect.x, (
int)(fb_height - pcmd->ClipRect.w), (
int)(pcmd->ClipRect.z - pcmd->ClipRect.x), (
int)(pcmd->ClipRect.w - pcmd->ClipRect.y));
 
  184                glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, 
sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer_offset);
 
  186            idx_buffer_offset += pcmd->ElemCount;
 
  191    glUseProgram(last_program);
 
  192    glBindTexture(GL_TEXTURE_2D, last_texture);
 
  193    glActiveTexture(last_active_texture);
 
  194    glBindVertexArray(last_vertex_array);
 
  195    glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);
 
  196    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, last_element_array_buffer);
 
  197    glBlendEquationSeparate(last_blend_equation_rgb, last_blend_equation_alpha);
 
  198    glBlendFuncSeparate(last_blend_src_rgb, last_blend_dst_rgb, last_blend_src_alpha, last_blend_dst_alpha);
 
  199    if (last_enable_blend) glEnable(GL_BLEND); 
else glDisable(GL_BLEND);
 
  200    if (last_enable_cull_face) glEnable(GL_CULL_FACE); 
else glDisable(GL_CULL_FACE);
 
  201    if (last_enable_depth_test) glEnable(GL_DEPTH_TEST); 
else glDisable(GL_DEPTH_TEST);
 
  202    if (last_enable_scissor_test) glEnable(GL_SCISSOR_TEST); 
else glDisable(GL_SCISSOR_TEST);
 
  203    glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3]);
 
  204    glScissor(last_scissor_box[0], last_scissor_box[1], (GLsizei)last_scissor_box[2], (GLsizei)last_scissor_box[3]);
 
 
  239    ImGui::SetCurrentContext(
g_ctx);
 
  242    GLint last_texture, last_array_buffer, last_vertex_array;
 
  243    glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
 
  244    glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer);
 
  245    glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array);
 
  247    const GLchar *vertex_shader =
 
  249        "uniform mat4 ProjMtx;\n" 
  250        "in vec2 Position;\n" 
  253        "out vec2 Frag_UV;\n" 
  254        "out vec4 Frag_Color;\n" 
  258        "   Frag_Color = Color;\n" 
  259        "   gl_Position = ProjMtx * vec4(Position.xy,0,1);\n" 
  262    const GLchar* fragment_shader =
 
  264        "precision mediump float;" 
  265        "uniform sampler2D Texture;\n" 
  267        "in vec4 Frag_Color;\n" 
  268        "out vec4 Out_Color;\n" 
  271        "   Out_Color = Frag_Color * texture( Texture, Frag_UV.st);\n" 
  301#define OFFSETOF(TYPE, ELEMENT) ((size_t)&(((TYPE *)0)->ELEMENT)) 
  310    glBindTexture(GL_TEXTURE_2D, last_texture);
 
  311    glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);
 
  312    glBindVertexArray(last_vertex_array);