1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
#include <stdio.h>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <imgui.h>
#include <imgui_impl_glfw.h>
#include <imgui_impl_opengl3.h>
#include <imgui_md.h>
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<float>(width);
g_window_size.y = static_cast<float>(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();
}
|