From a589f12bd225de78216f8813c800d8613c243ad4 Mon Sep 17 00:00:00 2001 From: dragonflylee Date: Tue, 20 May 2025 21:24:57 +0800 Subject: [PATCH] add mupdf demo --- Makefile | 2 +- main.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++- opengl3_loader.h | 4 +++ 3 files changed, 95 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index c817629..fb98d59 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ OBJS = $(SRCS:.c=.o) CC := gcc CFLAGS := -O2 -Wall $(INCLUDES) $(shell pkg-config --cflags glfw3) CXXFLAGS := $(CFLAGS) -std=c++17 -LDFLAGS := $(shell pkg-config glfw3 --libs) -lgdi32 +LDFLAGS := -lmupdf -lmupdf-third $(shell pkg-config glfw3 --libs) -lz -lgdi32 all: $(TARGET) diff --git a/main.c b/main.c index 1d825b0..29452b2 100644 --- a/main.c +++ b/main.c @@ -1,6 +1,7 @@ #include #include +#include #define IMGL3W_IMPL #include "opengl3_loader.h" #define GLFW_INCLUDE_NONE @@ -23,6 +24,48 @@ extern "C" void userAppExit() } #endif +const char *vertexShaderSource = "#version 330 core\n" + "layout (location = 0) in vec3 aPos;\n" + "void main()\n" + "{\n" + " gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n" + "}\0"; + +static const GLfloat vertices[] = { + 0.f, 0.f, + 1.f, 0.f, + 1.f, 1.f, + 0.f, 1.f, +}; + +struct texture +{ + GLuint id; + int x, y, w, h; +}; + +void ui_texture_from_pixmap(struct texture *tex, fz_pixmap *pix) +{ + if (!tex->id) + glGenTextures(1, &tex->id); + glBindTexture(GL_TEXTURE_2D, tex->id); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + + tex->x = pix->x; + tex->y = pix->y; + tex->w = pix->w; + tex->h = pix->h; + + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex->w, tex->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, pix->samples); + glBindTexture(GL_TEXTURE_2D, 0); +} + +void ui_draw_image(struct texture *tex, float x, float y) +{ +} + static void die(const char *msg) { fprintf(stderr, "%s\n", msg); @@ -32,6 +75,13 @@ static void die(const char *msg) // Main code int main(int argc, char *argv[]) { + if (argc < 2) + { + fprintf(stderr, "usage: example input-file\n"); + return 0; + } + char *input = argv[1]; + if (!glfwInit()) die("init glfw failed"); @@ -39,8 +89,40 @@ int main(int argc, char *argv[]) glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); + /* Create a context to hold the exception stack and various caches. */ + fz_document *doc; + fz_context *ctx = fz_new_context(NULL, NULL, FZ_STORE_UNLIMITED); + if (!ctx) + die("cannot create mupdf context"); + + fz_try(ctx) + fz_register_document_handlers(ctx); + fz_catch(ctx) + { + fprintf(stderr, "cannot register document handlers\n"); + fz_drop_context(ctx); + return EXIT_FAILURE; + } + + fz_try(ctx) + doc = fz_open_document(ctx, input); + fz_catch(ctx) + { + fprintf(stderr, "cannot open document\n"); + fz_drop_context(ctx); + return EXIT_FAILURE; + } + + struct texture page_tex = {0}; + int page_count = fz_count_pages(ctx, doc); + printf("page_count %d\n", page_count); + + fz_matrix ctm = fz_scale(1.f, 1.f); + fz_pixmap *pix = fz_new_pixmap_from_page_number(ctx, doc, 0, ctm, fz_device_rgb(ctx), 1); + ui_texture_from_pixmap(&page_tex, pix); + // Create window with graphics context - GLFWwindow *window = glfwCreateWindow(1280, 720, "GLTEXT", NULL, NULL); + GLFWwindow *window = glfwCreateWindow(pix->w, pix->h, "mupdf", NULL, NULL); if (!window) { glfwTerminate(); @@ -58,6 +140,8 @@ int main(int argc, char *argv[]) glfwGetFramebufferSize(window, &fbw, &fbh); glViewport(0, 0, fbw, fbh); + ui_draw_image(&page_tex, pix->w, pix->h); + glfwSwapBuffers(window); glfwWaitEvents(); } @@ -65,5 +149,10 @@ int main(int argc, char *argv[]) glfwDestroyWindow(window); glfwTerminate(); + /* Clean up. */ + fz_drop_pixmap(ctx, pix); + fz_drop_document(ctx, doc); + fz_drop_context(ctx); + return 0; } \ No newline at end of file diff --git a/opengl3_loader.h b/opengl3_loader.h index a4f57cf..0693b86 100644 --- a/opengl3_loader.h +++ b/opengl3_loader.h @@ -151,6 +151,7 @@ typedef khronos_uint8_t GLubyte; #define GL_FALSE 0 #define GL_TRUE 1 #define GL_TRIANGLES 0x0004 +#define GL_TRIANGLE_STRIP 0x0005 #define GL_ONE 1 #define GL_SRC_ALPHA 0x0302 #define GL_ONE_MINUS_SRC_ALPHA 0x0303 @@ -166,18 +167,21 @@ typedef khronos_uint8_t GLubyte; #define GL_SCISSOR_BOX 0x0C10 #define GL_SCISSOR_TEST 0x0C11 #define GL_UNPACK_ROW_LENGTH 0x0CF2 +#define GL_UNPACK_ALIGNMENT 0x0CF5 #define GL_PACK_ALIGNMENT 0x0D05 #define GL_TEXTURE_2D 0x0DE1 #define GL_UNSIGNED_BYTE 0x1401 #define GL_UNSIGNED_SHORT 0x1403 #define GL_UNSIGNED_INT 0x1405 #define GL_FLOAT 0x1406 +#define GL_RGB 0x1907 #define GL_RGBA 0x1908 #define GL_FILL 0x1B02 #define GL_VENDOR 0x1F00 #define GL_RENDERER 0x1F01 #define GL_VERSION 0x1F02 #define GL_EXTENSIONS 0x1F03 +#define GL_NEAREST 0x2600 #define GL_LINEAR 0x2601 #define GL_TEXTURE_MAG_FILTER 0x2800 #define GL_TEXTURE_MIN_FILTER 0x2801