Add pdfio
This commit is contained in:
@@ -1,3 +1,12 @@
|
||||
/*
|
||||
@todo: pdf files
|
||||
@todo: config with preload_files, initial_query, style
|
||||
@todo: help menu and config menu
|
||||
|
||||
@todo: check for number of cores before creating threads
|
||||
@todo:
|
||||
*/
|
||||
|
||||
#define BASIC_IMPL
|
||||
#include "../basic/basic.h"
|
||||
#include "../basic/filesystem.h"
|
||||
@@ -18,6 +27,66 @@ WorkQueue MainWorkQueue;
|
||||
#include "loading_thread.cpp"
|
||||
#include "searching_thread.cpp"
|
||||
|
||||
#include <pdfio.h>
|
||||
|
||||
#if 0
|
||||
extern "C" void OutputDebugStringA(const char *);
|
||||
void Printf(const char *string, ...) {
|
||||
Scratch scratch;
|
||||
STRING_FORMAT(scratch, string, result);
|
||||
OutputDebugStringA(result.data);
|
||||
}
|
||||
#else
|
||||
#define Printf(...) (0)
|
||||
#endif
|
||||
|
||||
void TestPdfio() {
|
||||
const char *filename = "C:/Users/Karol/Desktop/Hegels-Logic.pdf";
|
||||
pdfio_file_t *file = pdfioFileOpen(filename, NULL, NULL, NULL, NULL);
|
||||
Assert(file);
|
||||
defer { pdfioFileClose(file); };
|
||||
|
||||
char buffer[1024];
|
||||
size_t page_count = pdfioFileGetNumPages(file);
|
||||
Printf("%s: %u pages\n", filename, (unsigned)page_count);
|
||||
for (size_t page_i = 0; page_i < page_count; page_i += 1) {
|
||||
pdfio_obj_t *obj = pdfioFileGetPage(file, page_i);
|
||||
if (obj == NULL) continue;
|
||||
|
||||
if (page_i > 110) __debugbreak();
|
||||
|
||||
size_t num_streams = pdfioPageGetNumStreams(obj);
|
||||
Printf("%s: page%u=%p, num_streams=%u\n", filename, (unsigned)page_i, obj, (unsigned)num_streams);
|
||||
for (size_t stream_i = 0; stream_i < num_streams; stream_i += 1) {
|
||||
pdfio_stream_t *st = pdfioPageOpenStream(obj, stream_i, true);
|
||||
if (st == NULL) continue;
|
||||
Printf("%s: page%u st%u=%p\n", filename, (unsigned)page_i, (unsigned)stream_i, st);
|
||||
defer { pdfioStreamClose(st); };
|
||||
|
||||
bool first = true;
|
||||
while (pdfioStreamGetToken(st, buffer, sizeof(buffer))) {
|
||||
if (buffer[0] == '(') {
|
||||
if (first) {
|
||||
first = false;
|
||||
} else {
|
||||
Printf(" ");
|
||||
}
|
||||
|
||||
Printf("%s", buffer + 1);
|
||||
} else if (!strcmp(buffer, "Td") || !strcmp(buffer, "TD") || !strcmp(buffer, "T*") || !strcmp(buffer, "\'") || !strcmp(buffer, "\"")) {
|
||||
Printf("\n");
|
||||
first = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!first) {
|
||||
Printf("\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
__debugbreak();
|
||||
}
|
||||
|
||||
void UISearchResults(Array<String> filenames) {
|
||||
Scratch scratch;
|
||||
Array<String> matches = LockSearchResults();
|
||||
@@ -106,6 +175,9 @@ int main(int, char **) {
|
||||
InitScratch();
|
||||
InitArena(&Perm);
|
||||
|
||||
// TestPdfio();
|
||||
// return 0;
|
||||
|
||||
XInitLoading();
|
||||
InitSearch();
|
||||
ThreadStartupInfo infos[16] = {};
|
||||
@@ -131,7 +203,7 @@ int main(int, char **) {
|
||||
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
|
||||
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);
|
||||
SDL_WindowFlags window_flags = (SDL_WindowFlags)(SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI);
|
||||
SDL_Window *window = SDL_CreateWindow("Transcript browser", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, window_flags);
|
||||
SDL_Window *window = SDL_CreateWindow("Transcript browser", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 960, 600, window_flags);
|
||||
if (window == nullptr) {
|
||||
printf("Error: SDL_CreateWindow(): %s\n", SDL_GetError());
|
||||
return -1;
|
||||
@@ -141,7 +213,6 @@ int main(int, char **) {
|
||||
SDL_GL_MakeCurrent(window, gl_context);
|
||||
|
||||
if (!gladLoadGLLoader((GLADloadproc)SDL_GL_GetProcAddress)) {
|
||||
Assert(0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -164,8 +235,6 @@ int main(int, char **) {
|
||||
ImGui_ImplOpenGL3_Init(glsl_version);
|
||||
io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f);
|
||||
|
||||
ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
|
||||
|
||||
bool show_loaded_files = false;
|
||||
bool set_focus_to_input = true;
|
||||
int64_t frame = -1;
|
||||
@@ -189,43 +258,61 @@ int main(int, char **) {
|
||||
#endif
|
||||
ImGui_ImplSDL2_ProcessEvent(&event);
|
||||
if (event.type == SDL_KEYDOWN) {
|
||||
if (event.key.keysym.sym == SDLK_RETURN) {
|
||||
enter_press = true;
|
||||
} else if (event.key.keysym.sym == SDLK_UP || event.key.keysym.sym == SDLK_DOWN) {
|
||||
switch (event.key.keysym.sym) {
|
||||
case SDLK_UP:
|
||||
case SDLK_DOWN:
|
||||
case SDLK_PAGEUP:
|
||||
case SDLK_PAGEDOWN:
|
||||
set_focus_to_list = true;
|
||||
} else if (event.key.keysym.sym == SDLK_BACKSPACE) {
|
||||
break;
|
||||
case SDLK_BACKSPACE:
|
||||
case SDLK_DELETE:
|
||||
set_focus_to_input = true;
|
||||
} else if (event.key.keysym.sym == SDLK_TAB) {
|
||||
case SDLK_RETURN:
|
||||
enter_press = true;
|
||||
break;
|
||||
case SDLK_TAB:
|
||||
tab_press = true;
|
||||
} else if (event.key.keysym.sym == SDLK_F1) {
|
||||
break;
|
||||
case SDLK_F1:
|
||||
f1_press = true;
|
||||
break;
|
||||
}
|
||||
} else if (event.type == SDL_KEYUP) {
|
||||
|
||||
} else if (event.type == SDL_TEXTINPUT) {
|
||||
set_focus_to_input = true;
|
||||
} else if (event.type == SDL_QUIT) {
|
||||
done = true;
|
||||
} else if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(window)) {
|
||||
done = true;
|
||||
}
|
||||
if (event.type == SDL_QUIT)
|
||||
done = true;
|
||||
if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(window))
|
||||
done = true;
|
||||
}
|
||||
|
||||
ImGui_ImplOpenGL3_NewFrame();
|
||||
ImGui_ImplSDL2_NewFrame();
|
||||
ImGui::NewFrame();
|
||||
|
||||
#if 0
|
||||
ImGui::ShowDemoWindow();
|
||||
#else
|
||||
{
|
||||
|
||||
ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse;
|
||||
const ImGuiViewport *main_viewport = ImGui::GetMainViewport();
|
||||
ImGui::SetNextWindowPos(ImVec2(0, 0), ImGuiCond_Always);
|
||||
ImGui::SetNextWindowSize(ImVec2(main_viewport->Size.x, 20), ImGuiCond_Always);
|
||||
ImGui::SetNextWindowSize(ImVec2(main_viewport->Size.x, 40), ImGuiCond_Always);
|
||||
|
||||
ImGui::Begin("input", NULL, window_flags);
|
||||
if (ImGui::Button("Show loaded files") || f1_press) {
|
||||
show_loaded_files = !show_loaded_files;
|
||||
|
||||
if (show_loaded_files) {
|
||||
if (ImGui::Button("Show search results (F1)") || f1_press) {
|
||||
show_loaded_files = !show_loaded_files;
|
||||
}
|
||||
} else {
|
||||
if (ImGui::Button("Show loaded files (F1)") || f1_press) {
|
||||
show_loaded_files = !show_loaded_files;
|
||||
}
|
||||
}
|
||||
|
||||
ImGui::SameLine();
|
||||
if (set_focus_to_input) ImGui::SetKeyboardFocusHere(0);
|
||||
if (tab_press && ImGui::IsWindowFocused()) set_focus_to_list = true;
|
||||
@@ -247,8 +334,8 @@ int main(int, char **) {
|
||||
{
|
||||
ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse;
|
||||
const ImGuiViewport *main_viewport = ImGui::GetMainViewport();
|
||||
ImGui::SetNextWindowPos(ImVec2(0, 30), ImGuiCond_Always);
|
||||
ImGui::SetNextWindowSize(ImVec2(main_viewport->Size.x, main_viewport->Size.y - 30), ImGuiCond_Always);
|
||||
ImGui::SetNextWindowPos(ImVec2(0, 35), ImGuiCond_Always);
|
||||
ImGui::SetNextWindowSize(ImVec2(main_viewport->Size.x, main_viewport->Size.y - 35), ImGuiCond_Always);
|
||||
|
||||
ImGui::Begin("result", NULL, window_flags);
|
||||
if (!ImGui::IsWindowFocused() && set_focus_to_list) ImGui::SetKeyboardFocusHere(0);
|
||||
@@ -259,11 +346,11 @@ int main(int, char **) {
|
||||
}
|
||||
ImGui::End();
|
||||
}
|
||||
#endif
|
||||
|
||||
// Rendering
|
||||
ImGui::Render();
|
||||
glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y);
|
||||
glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w);
|
||||
glClearColor(1, 1, 1, 1);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
|
||||
SDL_GL_SwapWindow(window);
|
||||
|
||||
@@ -17,9 +17,9 @@ WORK_FUNCTION(SearchForMatchesWork) {
|
||||
int64_t index = 0;
|
||||
while (Seek(buffer, find, &index, SeekFlag_IgnoreCase)) {
|
||||
String found = {buffer.data + index, find.len};
|
||||
if (search_thread_stop_searching != SearchThreadStopSearching) break;
|
||||
Matches.bounded_add(found);
|
||||
buffer = buffer.skip(index + find.len);
|
||||
if (search_thread_stop_searching != SearchThreadStopSearching) break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user