#include #include #include #include #include #include #include ImFont * g_font_regular; ImFont * g_font_bold; ImFont * g_font_bold_large; struct Markdown : public imgui_md { ImFont * get_font() const override { if (m_is_table_header) { return g_font_bold; } switch (m_hlevel) { case 0: return m_is_strong ? g_font_bold : g_font_regular; case 1: return g_font_bold_large; default: return g_font_bold; } } }; static void glfw_error_callback(int error, const char * description) { fprintf(stderr, "glfw (%d): %s\n", error, description); } static void markdown(const char * str, const char * str_end) { static Markdown s_printer; s_printer.print(str, str_end); } ImVec2 g_window_size; static void resized(GLFWwindow *, int width, int height) { g_window_size.x = static_cast(width); g_window_size.y = static_cast(height); } int main(int, char **) { glfwSetErrorCallback(glfw_error_callback); if (!glfwInit()) return 1; const char * glsl_version = "#version 130"; glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); GLFWwindow * window = glfwCreateWindow(1280, 720, "Markdown", nullptr, nullptr); if (nullptr == window) return 1; glfwMakeContextCurrent(window); glfwSwapInterval(1); glfwSetWindowSizeCallback(window, resized); if (GLEW_OK != glewInit()) return 1; IMGUI_CHECKVERSION(); ImGui::CreateContext(); ImGuiIO & io = ImGui::GetIO(); io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; io.ConfigFlags |= ImGuiConfigFlags_DockingEnable; g_font_regular = io.Fonts->AddFontFromFileTTF("OpenSans-Regular.ttf", 18); g_font_bold = io.Fonts->AddFontFromFileTTF("OpenSans-Bold.ttf", 18); g_font_bold_large = io.Fonts->AddFontFromFileTTF("OpenSans-Bold.ttf", 26); ImGui::StyleColorsDark(); ImGui_ImplGlfw_InitForOpenGL(window, true); ImGui_ImplOpenGL3_Init(glsl_version); while (!glfwWindowShouldClose(window)) { glfwPollEvents(); ImGui_ImplOpenGL3_NewFrame(); ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); ImGui::SetNextWindowPos({0, 0}); ImGui::SetNextWindowSize(g_window_size); ImGui::Begin( "Markdown", nullptr, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoSavedSettings ); static const char * text = "# Hello world!\n" // 15 "Lorem ipsum dolor\n" // 18 33 " * sit\n" // 7 40 " * amet\n"; // 8 48 markdown(text, text + 48); ImGui::End(); ImGui::Render(); int display_w, display_h; glfwGetFramebufferSize(window, &display_w, &display_h); glViewport(0, 0, display_w, display_h); glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT); ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); glfwSwapBuffers(window); } ImGui_ImplOpenGL3_Shutdown(); ImGui_ImplGlfw_Shutdown(); ImGui::DestroyContext(); glfwDestroyWindow(window); glfwTerminate(); }