add mupdf demo
This commit is contained in:
2
Makefile
2
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)
|
||||
|
||||
|
||||
91
main.c
91
main.c
@@ -1,6 +1,7 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <mupdf/fitz.h>
|
||||
#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;
|
||||
}
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user