From bb3c884af9b1ef7b7799eda6c7d9161732c4133b Mon Sep 17 00:00:00 2001 From: Guy Turcotte Date: Sun, 30 Oct 2016 21:15:22 -0400 Subject: [PATCH 01/21] Multi-columns and many more. --- README.asciidoc | 15 + configure.ac | 2 +- src/Makefile.am | 4 +- src/config.cpp | 269 +++++++ src/config.h | 69 ++ src/icons 32x32.h | 1855 +++++++++++++++++++++++++++++++++++++++++++++ src/loadfile.cpp | 33 +- src/main.cpp | 389 ++++++++-- src/main.h | 12 +- src/view.cpp | 516 +++++++++---- src/view.h | 14 + 11 files changed, 2949 insertions(+), 229 deletions(-) create mode 100644 src/config.cpp create mode 100644 src/config.h create mode 100644 src/icons 32x32.h diff --git a/README.asciidoc b/README.asciidoc index 8140ebc..58da529 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -37,3 +37,18 @@ FlaxPDF 57% (5% *) 36.5 MB 45 KB * To be fair to all, these measurements were done using the Vesa driver. FlaxPDF, as the only one of the three, is able to take advantage of the GPU, dropping its CPU use when scrolling to 5% (tested on radeon). + +New capabilities added by Guy Turcotte (November 2016) +------------------------------------------------------ + +The following modifications have been made to allow FlaxPDF to be verstatile enough +to be used everyday as a pdf document viewer. + +- Multi-columns document display +- Selection button for the last 10 viewed documents +- Automatically open the last viewed document +- Fullscreen mode +- PageUp and PageDown buttons +- Exit button +- Scrollbars +- Gnome standard icons diff --git a/configure.ac b/configure.ac index cecd99e..9628a1a 100644 --- a/configure.ac +++ b/configure.ac @@ -47,10 +47,10 @@ LIBS=["$LIBS $($fltkconfig --ldflags --use-images)"] # Checks for libraries. AC_CHECK_LIB([lzo2], [__lzo_init_v2], [], AC_MSG_ERROR([LZO not found])) +AC_CHECK_LIB([config++], [_ZNK9libconfig6Config7getRootEv], [], AC_MSG_ERROR([libconfig++ not found])) #AC_CHECK_LIB([dl], [dlopen], [], AC_MSG_ERROR([libdl not found])) #AC_CHECK_LIB([rt], [sched_get_priority_min], [], AC_MSG_ERROR([librt not found])) PKG_CHECK_MODULES([DEPS], [poppler >= 0.31.0 xrender]) - DEPS_CFLAGS=$(echo $DEPS_CFLAGS | sed 's@-I@-isystem @g') LIBS=["$LIBS $DEPS_LIBS"] diff --git a/src/Makefile.am b/src/Makefile.am index 0ec83ba..95991d9 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,7 +1,7 @@ bin_PROGRAMS = flaxpdf -flaxpdf_SOURCES = main.cpp main.h loadfile.cpp gettext.h icons.h wmicon.h \ +flaxpdf_SOURCES = main.cpp main.h loadfile.cpp gettext.h \"icons 32x32.h\" wmicon.h \ lrtypes.h macros.h helpers.h helpers.cpp \ - view.cpp view.h + view.cpp view.h config.cpp config.h AM_CPPFLAGS=-DDATADIR=\"$(pkgdatadir)\" -DLOCALEDIR=\"$(localedir)\" diff --git a/src/config.cpp b/src/config.cpp new file mode 100644 index 0000000..5d05198 --- /dev/null +++ b/src/config.cpp @@ -0,0 +1,269 @@ +/* +Copyright (C) 2016 Guy Turcotte + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, version 3 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +//#define TEST 1 + +#ifdef TEST + #include "config.h" +#else + #include "main.h" +#endif + +#ifdef TEST + #define fl_alert printf + #define fl_message printf + #define xmalloc malloc + #define _(a) a +#endif + +std::string CONFIG_VERSION("1.0"); +std::string version("ERROR"); + +recent_file_struct *recent_files = NULL; + +void save_to_config( + char * filename, + int columns, + float xoff, + float yoff, + float zoom, + int zoommode, + int x, + int y, + int w, + int h, + bool full) { + + recent_file_struct *prev = NULL; + recent_file_struct *rf = recent_files; + + while ((rf != NULL) && (rf->filename.compare(filename) != 0)) { + + prev = rf; + rf = rf->next; + } + + if (rf) { + rf->columns = columns; + rf->xoff = xoff; + rf->yoff = yoff; + rf->zoom = zoom; + rf->zoom_mode = zoommode; + rf->width = w; + rf->height = h; + rf->fullscreen = full; + rf->x = x; + rf->y = y; + + // prev is NULL if it's already the first entry in the list + if (prev) { + prev->next = rf->next; + rf->next = recent_files; + recent_files = rf; + } + } + else { + rf = new recent_file_struct; + + rf->filename = filename; + rf->columns = columns; + rf->xoff = xoff; + rf->yoff = yoff; + rf->zoom = zoom; + rf->zoom_mode = zoommode; + rf->width = w; + rf->height = h; + rf->fullscreen = full; + rf->x = x; + rf->y = y; + + rf->next = recent_files; + recent_files = rf; + } +} + +bool file_exists (const char * name) { + struct stat buffer; + return (stat (name, &buffer) == 0); +} + +void load_config() { + + Config cfg; + + static char config_filename[301]; + char * homedir; + + if ((homedir = getenv("HOME")) == NULL) { + homedir = getpwuid(getuid())->pw_dir; + } + + strncpy(config_filename, homedir, 300); + strncat(config_filename, "/.flaxpdf", 300 - strlen(config_filename) - 1); + + try { + cfg.readFile(config_filename); + + Setting &root = cfg.getRoot(); + + if (root.exists("version")){ + + version = root["version"].c_str(); + + if (version.compare(CONFIG_VERSION) != 0) { + fl_alert(_("Error: Config file version is expected to be %s."), CONFIG_VERSION.c_str()); + return; + } + } + else { + fl_alert(_("Error: Config file structure error.")); + return; + } + + if (!root.exists("recent_files")) + root.add("recent_files", Setting::TypeList); + + Setting &rf_setting = root["recent_files"]; + recent_file_struct *prev = NULL; + + for (int i = 0; i < rf_setting.getLength(); i++) { + + Setting &s = rf_setting[i]; + std::string filename = s["filename"]; + + if (file_exists(filename.c_str())) { + recent_file_struct *rf = new recent_file_struct; + + if (!(s.lookupValue("filename" , rf->filename ) && + s.lookupValue("columns" , rf->columns ) && + s.lookupValue("xoff" , rf->xoff ) && + s.lookupValue("yoff" , rf->yoff ) && + s.lookupValue("zoom" , rf->zoom ) && + s.lookupValue("zoom_mode" , rf->zoom_mode) && + s.lookupValue("width" , rf->width ) && + s.lookupValue("height" , rf->height ) && + s.lookupValue("x" , rf->x ) && + s.lookupValue("y" , rf->y ) && + s.lookupValue("fullscreen", rf->fullscreen))) { + fl_alert(_("Configuration file content error: %s."), config_filename); + return; + } + + if (prev == NULL) { + prev = rf; + recent_files = rf; + } + else { + prev->next = rf; + prev = rf; + } + rf->next = NULL; + } + } + } + catch (const FileIOException &e) { + } + catch (const ParseException &e) { + fl_alert(_("Parse Exception (config file %s error): %s"), config_filename, e.getError()); + } + catch (const ConfigException &e) { + fl_alert(_("Load Config Exception: %s"), e.what()); + } +} + +void save_config() { + + Config cfg; + + char config_filename[301]; + char * homedir; + + if ((homedir = getenv("HOME")) == NULL) { + homedir = getpwuid(getuid())->pw_dir; + } + + strncpy(config_filename, homedir, 300); + strncat(config_filename, "/.flaxpdf", 300 - strlen(config_filename) - 1); + + try { + Setting &root = cfg.getRoot(); + if (root.exists("recent_files")) + root.remove("recent_files"); + + root.add("version", Setting::TypeString) = CONFIG_VERSION; + + Setting &rf_setting = root.add("recent_files", Setting::TypeList); + + recent_file_struct *rf = recent_files; + + int cnt = 0; + while ((rf != NULL) && (cnt < 10)) { + Setting &gr = rf_setting.add(Setting::TypeGroup); + + gr.add("filename", Setting::TypeString ) = rf->filename; + gr.add("columns", Setting::TypeInt ) = rf->columns; + gr.add("xoff", Setting::TypeFloat ) = rf->xoff; + gr.add("yoff", Setting::TypeFloat ) = rf->yoff; + gr.add("zoom", Setting::TypeFloat ) = rf->zoom; + gr.add("zoom_mode", Setting::TypeInt ) = (int)rf->zoom_mode; + gr.add("width", Setting::TypeInt ) = rf->width; + gr.add("height", Setting::TypeInt ) = rf->height; + gr.add("x", Setting::TypeInt ) = rf->x; + gr.add("y", Setting::TypeInt ) = rf->y; + gr.add("fullscreen", Setting::TypeBoolean) = rf->fullscreen; + + rf = rf->next; + cnt += 1; + } + + cfg.writeFile(config_filename); + } + catch (const FileIOException &e) { + fl_alert(_("File IO Error: Unable to create or write config file %s."), config_filename); + } + catch (const ConfigException &e) { + fl_alert(_("Save Config Exception: %s."), e.what()); + } +} + +#ifdef TEST + +main() +{ + printf("Begin. Config version: %s\n", CONFIG_VERSION.c_str()); + + load_config(); + + printf("Config file:\nVersion: %s\n\n", version.c_str()); + + printf("recent file descriptors:\n\n"); + + recent_file_struct *rf = recent_files; + while (rf != NULL) { + printf("filename: %s, columns: %d, xoff: %f, yoff: %f, zoom: %f, mode: %d\n", + rf->filename.c_str(), + rf->columns, + rf->xoff, + rf->yoff, + rf->zoom, + rf->zoom_mode); + rf = rf->next; + } + printf("End\n"); +} + +#endif + diff --git a/src/config.h b/src/config.h new file mode 100644 index 0000000..22aed08 --- /dev/null +++ b/src/config.h @@ -0,0 +1,69 @@ +/* +Copyright (C) 2016 Guy Turcotte + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, version 3 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace libconfig; + +struct recent_file_struct { + std::string filename; + int columns; + float xoff; + float yoff; + float zoom; + int zoom_mode; + int x; // App Window x pos + int y; // App Window y pos + int width; // App Windows width + int height; // App Window height + bool fullscreen; + + struct recent_file_struct *next; +}; + +extern recent_file_struct *recent_files; + +extern void save_to_config( + char * filename, + int columns, + float xoff, + float yoff, + float zoom, + int zoommode, + int x, + int y, + int w, + int h, + bool full); + +extern void load_config(); +extern void save_config(); + +#endif + diff --git a/src/icons 32x32.h b/src/icons 32x32.h new file mode 100644 index 0000000..a800220 --- /dev/null +++ b/src/icons 32x32.h @@ -0,0 +1,1855 @@ +unsigned char application_exit_png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, + 0x08, 0x06, 0x00, 0x00, 0x00, 0x73, 0x7a, 0x7a, 0xf4, 0x00, 0x00, 0x00, + 0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64, + 0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0d, + 0xd7, 0x00, 0x00, 0x0d, 0xd7, 0x01, 0x42, 0x28, 0x9b, 0x78, 0x00, 0x00, + 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, + 0x72, 0x65, 0x00, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x6b, 0x73, 0x63, + 0x61, 0x70, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x9b, 0xee, 0x3c, 0x1a, 0x00, + 0x00, 0x06, 0x13, 0x49, 0x44, 0x41, 0x54, 0x58, 0xc3, 0x95, 0x57, 0x6b, + 0x6c, 0x14, 0x55, 0x14, 0xfe, 0x66, 0x76, 0xf6, 0xd1, 0x7d, 0x14, 0xda, + 0x4a, 0x81, 0xc6, 0x6e, 0x5b, 0x68, 0xa1, 0x08, 0x45, 0x04, 0x94, 0xd6, + 0x50, 0x2d, 0x48, 0x4c, 0x48, 0x63, 0x62, 0x4c, 0xf0, 0x51, 0xfd, 0x47, + 0x8c, 0x22, 0x31, 0x26, 0x26, 0x26, 0x82, 0x10, 0x12, 0x8c, 0x4a, 0xb0, + 0xfe, 0x20, 0x1a, 0xa2, 0x26, 0x18, 0x43, 0xc2, 0xa3, 0x88, 0x34, 0x68, + 0x0c, 0x24, 0x36, 0x56, 0x8c, 0x4d, 0x83, 0xb6, 0x8a, 0xa4, 0xd2, 0x96, + 0x16, 0xa9, 0x76, 0xe9, 0xf6, 0xfd, 0xde, 0xee, 0x63, 0x76, 0x66, 0xbd, + 0xe7, 0xce, 0x4c, 0x19, 0xb6, 0xfb, 0xe2, 0x36, 0xa7, 0xb3, 0x73, 0x67, + 0xe6, 0x9e, 0xef, 0x3c, 0xee, 0x77, 0xce, 0x15, 0x62, 0xb1, 0x18, 0xee, + 0x63, 0x08, 0xba, 0x58, 0x98, 0x58, 0x75, 0x11, 0xf5, 0x39, 0x1a, 0xb4, + 0x58, 0x54, 0x97, 0x08, 0x13, 0x55, 0x9f, 0x4b, 0xbe, 0x60, 0xdd, 0x2b, + 0x2f, 0x7e, 0x20, 0xcb, 0xf2, 0xfe, 0x8c, 0xb4, 0x0b, 0x02, 0x44, 0x51, + 0x84, 0xdd, 0x6e, 0x47, 0x56, 0x96, 0x93, 0x89, 0x03, 0x56, 0xab, 0x0d, + 0xa2, 0xa0, 0xe9, 0x57, 0x54, 0x05, 0xe1, 0x70, 0x04, 0x59, 0x76, 0xc7, + 0xb1, 0x23, 0x47, 0x8e, 0xbe, 0xc7, 0xa6, 0x42, 0xe9, 0x40, 0x48, 0xa4, + 0xfc, 0xa5, 0x17, 0x5e, 0x46, 0x47, 0x47, 0x07, 0x02, 0x81, 0x00, 0x42, + 0xa1, 0x10, 0x22, 0x91, 0x08, 0xd8, 0x3c, 0xa2, 0xd1, 0x28, 0x17, 0x45, + 0x51, 0xf8, 0xbd, 0x68, 0xb1, 0x40, 0x12, 0x25, 0xb8, 0xb2, 0xdc, 0xd8, + 0xb7, 0xef, 0x5d, 0xe4, 0xe4, 0xe4, 0x30, 0x50, 0xe2, 0xfc, 0x62, 0xe4, + 0xcd, 0xb9, 0xb9, 0x39, 0xd4, 0x7f, 0xf2, 0xf1, 0x5b, 0xec, 0xf6, 0x23, + 0xdd, 0x13, 0x72, 0x4a, 0x00, 0xf4, 0x2f, 0x37, 0x37, 0x17, 0x2e, 0x97, + 0x8b, 0x4f, 0x90, 0x85, 0x24, 0x82, 0x6e, 0x15, 0x2d, 0x4a, 0x20, 0xe8, + 0x4a, 0x20, 0x24, 0x49, 0x62, 0x62, 0xe5, 0x62, 0xb1, 0x48, 0xfc, 0x3d, + 0xf3, 0xbb, 0x6e, 0xb7, 0x9b, 0x01, 0xcb, 0xa5, 0x5b, 0x37, 0x93, 0x59, + 0x1d, 0x04, 0x52, 0x02, 0xd0, 0x5c, 0x9a, 0x05, 0x23, 0x1f, 0xcc, 0x8b, + 0xaa, 0xaa, 0xca, 0x01, 0xd1, 0x33, 0x12, 0xfa, 0xed, 0x70, 0x38, 0x98, + 0x72, 0xcb, 0x3c, 0x58, 0x23, 0x05, 0x8c, 0xef, 0x09, 0x04, 0x1b, 0x0e, + 0x3d, 0x57, 0x52, 0x0e, 0xd1, 0x50, 0x48, 0x0b, 0x92, 0x58, 0xad, 0x56, + 0x6e, 0xa5, 0x71, 0x6f, 0x28, 0xd1, 0x14, 0x69, 0xef, 0xd2, 0x73, 0x03, + 0x64, 0xbc, 0x10, 0x18, 0xab, 0x8d, 0x72, 0x93, 0x2b, 0x17, 0x4c, 0xc9, + 0x9b, 0x1c, 0x80, 0xa1, 0xc0, 0xac, 0xd0, 0xf8, 0x6d, 0xbe, 0x9a, 0x13, + 0xd1, 0xf0, 0x10, 0xad, 0x2d, 0x08, 0xe6, 0x44, 0xe5, 0x33, 0xe6, 0x1d, + 0x93, 0x99, 0x07, 0xcc, 0x96, 0xc6, 0x2b, 0x8f, 0xcf, 0x0b, 0xcd, 0xdd, + 0xf1, 0x3b, 0x64, 0xc1, 0xef, 0xb4, 0xca, 0x17, 0x84, 0x20, 0x91, 0x52, + 0xf3, 0x1c, 0xb9, 0xfe, 0x6e, 0x8e, 0x24, 0x59, 0x91, 0x21, 0xb3, 0xfc, + 0xde, 0x86, 0x06, 0x97, 0xb3, 0xf1, 0x8c, 0xc3, 0xf6, 0xed, 0x69, 0x9b, + 0x6d, 0x6f, 0xda, 0x24, 0x4c, 0xa4, 0x3c, 0x51, 0x08, 0x68, 0x3b, 0x2e, + 0xe4, 0xa5, 0x7b, 0xc7, 0x6f, 0xbb, 0x77, 0x63, 0xe5, 0x95, 0x4b, 0x58, + 0x57, 0x5b, 0x56, 0xac, 0x0a, 0x6a, 0xf1, 0x8d, 0x6b, 0x03, 0xdb, 0x4f, + 0x4b, 0x92, 0xaf, 0x2e, 0x1a, 0xbd, 0x90, 0xd4, 0x03, 0xe6, 0x3c, 0x48, + 0x15, 0x02, 0x73, 0x22, 0x26, 0x1a, 0x37, 0x8f, 0x1d, 0x43, 0xe0, 0xf2, + 0x45, 0x6c, 0xac, 0x29, 0x85, 0xf3, 0x91, 0xe7, 0xe0, 0x2a, 0x7e, 0x1a, + 0x6b, 0x37, 0x14, 0x30, 0xa7, 0xa8, 0xef, 0xa7, 0xf4, 0x40, 0x32, 0x2f, + 0x18, 0xb2, 0x68, 0xd1, 0x22, 0xd4, 0xd6, 0xd6, 0x62, 0x6c, 0x6c, 0x0c, + 0x6d, 0x6d, 0x6d, 0x1c, 0x00, 0x6d, 0x4f, 0xb6, 0x30, 0x13, 0x0d, 0xcc, + 0x50, 0x73, 0x33, 0xba, 0x0f, 0x1d, 0x40, 0xcd, 0xce, 0x32, 0x58, 0xbc, + 0x5b, 0xa1, 0xfa, 0xc7, 0x10, 0xbb, 0xd3, 0xc3, 0xd9, 0x11, 0x6a, 0x6c, + 0x20, 0x2d, 0x80, 0x54, 0x21, 0x30, 0xf6, 0x77, 0x49, 0x49, 0x09, 0x4a, + 0x4b, 0x4b, 0x71, 0xf5, 0xea, 0x55, 0x04, 0xe6, 0x02, 0x9c, 0x0f, 0x68, + 0xdb, 0x06, 0x7d, 0x3e, 0xb4, 0xd6, 0xd5, 0xa1, 0xb2, 0xba, 0x08, 0xd6, + 0x82, 0x0d, 0xcc, 0x45, 0x4e, 0x44, 0x7e, 0xbe, 0x08, 0xeb, 0x1a, 0x0b, + 0x6e, 0xb5, 0x8f, 0xd0, 0xe2, 0x97, 0x33, 0x02, 0x90, 0x2c, 0x04, 0xc1, + 0x60, 0x10, 0x0d, 0x0d, 0x0d, 0x28, 0x2f, 0x2f, 0xc7, 0xb6, 0x6d, 0xdb, + 0x50, 0x51, 0x51, 0xc1, 0xf2, 0x81, 0x51, 0x34, 0xf3, 0x82, 0xc0, 0xa8, + 0xb7, 0x65, 0xd7, 0x2e, 0x94, 0x15, 0xda, 0x60, 0x5f, 0xe6, 0x85, 0xfc, + 0x40, 0x19, 0x02, 0x67, 0xcf, 0xc0, 0x56, 0xa8, 0xa2, 0xbf, 0x77, 0x1c, + 0xb7, 0x6f, 0x8d, 0xd2, 0xf2, 0xf5, 0xa7, 0x04, 0xa1, 0xde, 0xa4, 0xb7, + 0x9d, 0xc9, 0x17, 0x01, 0xe0, 0x6b, 0x29, 0xbe, 0xd0, 0x24, 0xdb, 0x05, + 0x44, 0xc3, 0xc4, 0x98, 0x34, 0xba, 0xba, 0xba, 0x50, 0x95, 0x5b, 0xc9, + 0xc3, 0xd0, 0xfe, 0xc6, 0x5e, 0xb8, 0xc7, 0xfb, 0x90, 0xb7, 0x65, 0x05, + 0x94, 0x92, 0xc7, 0x31, 0x7e, 0xe1, 0x02, 0x24, 0x77, 0x00, 0x82, 0xdb, + 0x81, 0x3c, 0xc6, 0x88, 0x35, 0x25, 0xab, 0x16, 0x58, 0x1d, 0x9e, 0x95, + 0x37, 0x75, 0xff, 0x35, 0xfc, 0x25, 0x06, 0x03, 0x11, 0xc9, 0xfc, 0x20, + 0xd5, 0x2e, 0x58, 0xb2, 0x64, 0x09, 0x36, 0x6f, 0xde, 0x8c, 0xce, 0xce, + 0x4e, 0xf4, 0xf7, 0xf7, 0x63, 0x4b, 0xec, 0x31, 0xdc, 0x3e, 0x7e, 0x1c, + 0x93, 0x97, 0x1a, 0xf1, 0x50, 0xd5, 0x72, 0xc8, 0xcb, 0x2b, 0x31, 0xd1, + 0xf4, 0x13, 0x54, 0xf6, 0x6e, 0xde, 0xb3, 0xaf, 0xa7, 0xdc, 0xfb, 0x96, + 0x81, 0x5e, 0x14, 0x2b, 0x3f, 0x62, 0x6c, 0x28, 0xf0, 0xe6, 0x3d, 0x00, + 0x92, 0x29, 0x27, 0xcb, 0x6b, 0x6a, 0x6a, 0xe0, 0xf7, 0xfb, 0xd1, 0xd2, + 0xd2, 0x82, 0xfc, 0xfc, 0x7c, 0xad, 0x4e, 0xb0, 0xfc, 0x0b, 0x33, 0x2f, + 0x84, 0xc2, 0x61, 0x0c, 0x9d, 0x3f, 0x87, 0xd0, 0xe0, 0x04, 0x9f, 0x1f, + 0xbe, 0x76, 0x2d, 0x79, 0x49, 0x27, 0x80, 0x4f, 0x6e, 0x84, 0xca, 0xbe, + 0x89, 0xb0, 0x3a, 0xb7, 0x00, 0x40, 0xa2, 0x10, 0x54, 0x55, 0x55, 0xf1, + 0x10, 0x34, 0x35, 0x35, 0xdd, 0xa5, 0x62, 0xf6, 0xb7, 0x72, 0xcf, 0x1e, + 0x8c, 0x5f, 0xef, 0xc0, 0xed, 0x2b, 0xdf, 0x61, 0x45, 0x99, 0x07, 0xa3, + 0xa3, 0x02, 0xdc, 0x1b, 0x1f, 0x85, 0xcb, 0xcb, 0x2a, 0xeb, 0x54, 0x67, + 0x52, 0x10, 0x73, 0xb3, 0x7d, 0xf8, 0xa7, 0x6b, 0x8a, 0x3a, 0x96, 0xcf, + 0xa5, 0x05, 0xc4, 0x10, 0xe7, 0x05, 0xaa, 0xf9, 0x74, 0x6d, 0x66, 0xdb, + 0x8c, 0x88, 0x88, 0xd8, 0x90, 0xf3, 0x81, 0x4e, 0x05, 0x95, 0x9f, 0x7d, + 0x8a, 0x1f, 0x76, 0x74, 0x61, 0x64, 0xb8, 0x0f, 0xf9, 0x0f, 0xe7, 0x61, + 0xa6, 0xa7, 0x07, 0x59, 0x4f, 0xec, 0x86, 0xdc, 0x3b, 0x0b, 0xdf, 0xdf, + 0x5d, 0xe8, 0xe8, 0x9e, 0x4a, 0x84, 0xa1, 0x8d, 0x7d, 0x7e, 0xdc, 0x06, + 0x9c, 0x4a, 0x08, 0xc0, 0x1c, 0x82, 0xd9, 0xd9, 0x59, 0xb4, 0xb6, 0xb6, + 0x72, 0xe5, 0x06, 0x1d, 0x6b, 0x1e, 0xd0, 0xb7, 0x11, 0x2b, 0xe3, 0x3b, + 0x1a, 0xce, 0xe2, 0xfc, 0xd6, 0xad, 0x58, 0xbc, 0x18, 0xc8, 0x66, 0xd1, + 0x99, 0x6e, 0x6c, 0x44, 0xee, 0xf3, 0xbb, 0x50, 0x1c, 0x9d, 0xc1, 0xc4, + 0xb4, 0x8c, 0xbe, 0xa1, 0xd0, 0x3b, 0x6f, 0x2b, 0x4a, 0x7d, 0x4a, 0x26, + 0x4c, 0x94, 0x88, 0x89, 0x6a, 0x81, 0x71, 0xa5, 0x26, 0x45, 0x55, 0x63, + 0xbc, 0xd5, 0x71, 0x17, 0x16, 0xe2, 0xa9, 0x93, 0x27, 0xf1, 0xcb, 0xf5, + 0x49, 0x58, 0x97, 0x33, 0x6e, 0x88, 0x8c, 0x22, 0xf4, 0x6b, 0x0b, 0xec, + 0x65, 0xdb, 0xb1, 0x6e, 0x4d, 0x0e, 0x42, 0xaa, 0xfa, 0x4c, 0xca, 0x62, + 0x94, 0xa8, 0xef, 0x8b, 0x4f, 0x44, 0xa3, 0x47, 0x20, 0xe2, 0xa1, 0xeb, + 0x1d, 0xdf, 0x00, 0xa6, 0xa7, 0xa7, 0x38, 0x1f, 0xa8, 0x8c, 0x11, 0x0b, + 0xaa, 0xab, 0xb1, 0xfe, 0xc0, 0x21, 0x34, 0xb7, 0x8f, 0xc2, 0x53, 0x9e, + 0x0d, 0xc1, 0x77, 0x13, 0x4a, 0xc7, 0x0d, 0xc4, 0xac, 0x22, 0x14, 0x51, + 0x28, 0xc8, 0x18, 0x40, 0x3c, 0x2d, 0x9b, 0x1b, 0x15, 0x62, 0x3e, 0xa7, + 0xd3, 0x09, 0xc9, 0x2a, 0x21, 0x1c, 0x09, 0xb3, 0xf0, 0x04, 0x78, 0xff, + 0xc8, 0xfb, 0x46, 0x26, 0x15, 0xaf, 0xbd, 0x0a, 0xc7, 0x8e, 0x5a, 0x34, + 0xfd, 0xc9, 0xc8, 0x67, 0xa5, 0x15, 0x61, 0xf1, 0x16, 0xfe, 0xe8, 0x99, + 0x42, 0x54, 0x10, 0x0f, 0xa7, 0x65, 0xc2, 0x64, 0x89, 0x48, 0x96, 0x93, + 0x62, 0x83, 0x8e, 0x63, 0x50, 0xd8, 0xbd, 0x1d, 0x2e, 0xa7, 0x8b, 0x77, + 0xc5, 0x44, 0x46, 0xb4, 0x43, 0xe8, 0x39, 0xe5, 0x49, 0x75, 0xfd, 0x51, + 0x7c, 0x73, 0xd8, 0x83, 0xd3, 0x0d, 0xe7, 0x7a, 0x55, 0x25, 0xea, 0x57, + 0x95, 0xd8, 0xf7, 0xe2, 0xc1, 0x83, 0xa7, 0xee, 0x0b, 0x80, 0xa1, 0xd8, + 0x48, 0x3c, 0xe2, 0x81, 0xc9, 0xa9, 0x09, 0xde, 0x03, 0x78, 0x8b, 0xbc, + 0xf0, 0x7a, 0x8b, 0x90, 0xc7, 0x1a, 0x59, 0x1b, 0x6b, 0xbd, 0x64, 0x39, + 0xa2, 0x97, 0x65, 0x0d, 0x80, 0x1c, 0x95, 0xa1, 0xac, 0x5e, 0x85, 0x83, + 0x81, 0xb9, 0x9d, 0x6c, 0x72, 0x90, 0x49, 0x50, 0x6f, 0xcd, 0x33, 0x03, + 0x60, 0x94, 0x5a, 0x9b, 0xcd, 0xc6, 0x2d, 0xf5, 0xfb, 0x07, 0x30, 0x13, + 0x98, 0x41, 0x11, 0x53, 0x5a, 0xe8, 0x7d, 0x10, 0x1e, 0x4f, 0x36, 0x07, + 0x24, 0x88, 0x02, 0x57, 0x16, 0x8d, 0xca, 0x1c, 0x00, 0xa5, 0x23, 0x79, + 0x83, 0x42, 0x12, 0x0a, 0x92, 0xce, 0xf9, 0x83, 0x09, 0xd2, 0x36, 0x24, + 0x66, 0xe5, 0x64, 0x3d, 0x75, 0xb5, 0xfd, 0xbe, 0xff, 0x30, 0x3c, 0x32, + 0x88, 0x42, 0x96, 0xe1, 0xeb, 0xd6, 0xaf, 0xe5, 0x6d, 0x3b, 0x81, 0xa2, + 0xe7, 0x9a, 0xdb, 0x23, 0x71, 0x0d, 0x89, 0x06, 0x80, 0xf2, 0x21, 0x18, + 0xba, 0x07, 0x40, 0x2c, 0x23, 0x00, 0xe4, 0x72, 0x8f, 0xc7, 0xc3, 0x32, + 0x7b, 0x12, 0x9d, 0xdd, 0x1d, 0xc8, 0x5f, 0xba, 0x14, 0x9b, 0x8a, 0x36, + 0xc1, 0x61, 0xd7, 0x4a, 0x2e, 0x59, 0x4c, 0x2e, 0xa6, 0xfa, 0x2e, 0x24, + 0x69, 0xf7, 0x8c, 0x33, 0x44, 0x30, 0x18, 0xe2, 0x35, 0x27, 0x23, 0x00, + 0x46, 0x72, 0x79, 0xb2, 0x3d, 0xcc, 0xea, 0x7f, 0xe1, 0xf6, 0xb8, 0xb0, + 0x6a, 0x75, 0x19, 0xec, 0x36, 0x3b, 0x2c, 0xbc, 0xfd, 0x86, 0x5e, 0x7a, + 0x05, 0x4d, 0x71, 0xd2, 0x5e, 0x10, 0xf3, 0x61, 0xa0, 0xd3, 0x95, 0xee, + 0x01, 0x25, 0xa3, 0x10, 0x0c, 0x8d, 0x0c, 0x20, 0xaa, 0xc8, 0x58, 0xba, + 0x2c, 0x5f, 0xdb, 0xef, 0x7a, 0xeb, 0x45, 0x16, 0xab, 0x42, 0xc6, 0x0d, + 0x2e, 0x47, 0x41, 0x06, 0x85, 0xc3, 0x1c, 0x80, 0x71, 0x24, 0x4b, 0xed, + 0x01, 0x16, 0xd7, 0x0f, 0x4f, 0x9c, 0xf8, 0x6a, 0xbf, 0xf9, 0x70, 0x61, + 0xee, 0xfd, 0x04, 0x21, 0x53, 0xe5, 0xda, 0x20, 0x0f, 0xb0, 0x35, 0x8f, + 0xe8, 0xd6, 0xa7, 0x3d, 0x7a, 0x0b, 0xa6, 0xe3, 0xb9, 0xf9, 0x14, 0x73, + 0x7f, 0x5a, 0x13, 0x06, 0x24, 0xbd, 0xf5, 0x34, 0xfe, 0x07, 0xae, 0x35, + 0x79, 0xa8, 0x3b, 0x02, 0x98, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, + 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 +}; +unsigned int application_exit_png_len = 1686; +unsigned char document_open_png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, + 0x08, 0x06, 0x00, 0x00, 0x00, 0x73, 0x7a, 0x7a, 0xf4, 0x00, 0x00, 0x00, + 0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64, + 0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0d, + 0xd7, 0x00, 0x00, 0x0d, 0xd7, 0x01, 0x42, 0x28, 0x9b, 0x78, 0x00, 0x00, + 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, + 0x72, 0x65, 0x00, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x6b, 0x73, 0x63, + 0x61, 0x70, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x9b, 0xee, 0x3c, 0x1a, 0x00, + 0x00, 0x00, 0x0e, 0x74, 0x45, 0x58, 0x74, 0x54, 0x69, 0x74, 0x6c, 0x65, + 0x00, 0x46, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x21, 0x54, 0xaa, 0x60, + 0x41, 0x00, 0x00, 0x00, 0x17, 0x74, 0x45, 0x58, 0x74, 0x41, 0x75, 0x74, + 0x68, 0x6f, 0x72, 0x00, 0x4c, 0x61, 0x70, 0x6f, 0x20, 0x43, 0x61, 0x6c, + 0x61, 0x6d, 0x61, 0x6e, 0x64, 0x72, 0x65, 0x69, 0xdf, 0x91, 0x1a, 0x2a, + 0x00, 0x00, 0x00, 0x29, 0x74, 0x45, 0x58, 0x74, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x42, 0x61, 0x73, 0x65, + 0x64, 0x20, 0x6f, 0x66, 0x20, 0x4a, 0x61, 0x6b, 0x75, 0x62, 0x20, 0x53, + 0x74, 0x65, 0x69, 0x6e, 0x65, 0x72, 0x20, 0x64, 0x65, 0x73, 0x69, 0x67, + 0x6e, 0xa0, 0x84, 0x05, 0x73, 0x00, 0x00, 0x04, 0x99, 0x49, 0x44, 0x41, + 0x54, 0x58, 0xc3, 0xed, 0x96, 0xcf, 0x6f, 0x54, 0x55, 0x14, 0xc7, 0x3f, + 0xf7, 0xbd, 0x37, 0x33, 0x4c, 0x5b, 0xaa, 0x09, 0x94, 0x1a, 0x02, 0xb2, + 0xb0, 0x11, 0x64, 0x05, 0x2e, 0x5c, 0x18, 0xe3, 0x46, 0x89, 0x89, 0x89, + 0x4b, 0x88, 0x89, 0x3b, 0x34, 0x1a, 0x57, 0x2e, 0x8c, 0x0b, 0x7f, 0x25, + 0x8a, 0x2b, 0xff, 0x08, 0x42, 0xd8, 0x18, 0x63, 0x37, 0x1a, 0x63, 0x5c, + 0xb8, 0x11, 0x82, 0x21, 0x31, 0xc6, 0x94, 0xdf, 0xb6, 0x30, 0x58, 0x06, + 0x28, 0x23, 0xa5, 0x08, 0xb4, 0xd3, 0xce, 0xbb, 0x3f, 0xce, 0x71, 0xf1, + 0xde, 0xcc, 0xbc, 0x69, 0xa7, 0xd8, 0x1a, 0xd4, 0x85, 0x9e, 0xe4, 0xe5, + 0x9d, 0xfb, 0xee, 0x3d, 0xf7, 0x7c, 0xef, 0xf7, 0x9c, 0x7b, 0xce, 0x83, + 0xff, 0xe5, 0xbf, 0x2e, 0xa6, 0xad, 0x1c, 0x7a, 0x75, 0xcf, 0x97, 0x11, + 0x66, 0x1f, 0xda, 0xfd, 0xb6, 0x8a, 0x85, 0x62, 0xf8, 0x41, 0x9d, 0x7b, + 0xf3, 0xc3, 0xa3, 0x67, 0x6b, 0x0f, 0x04, 0xc0, 0x17, 0xfb, 0xf7, 0xc7, + 0x93, 0x1b, 0xa7, 0xfc, 0x9e, 0x67, 0x0f, 0x80, 0x31, 0x18, 0xd3, 0x8b, + 0x41, 0x55, 0xbb, 0x06, 0x06, 0x7e, 0xab, 0x9f, 0xd7, 0x99, 0x5f, 0xcf, + 0xce, 0x19, 0xe4, 0xe0, 0x07, 0x87, 0x4f, 0x7f, 0xfd, 0x40, 0x00, 0x5c, + 0x18, 0x9a, 0xf2, 0x3b, 0xf7, 0x3e, 0xcf, 0xd2, 0xe2, 0x3c, 0xa0, 0xf7, + 0x35, 0x29, 0x57, 0x06, 0x88, 0x62, 0xd3, 0xbc, 0x78, 0xea, 0xfb, 0x2b, + 0x2a, 0xb2, 0x7b, 0x9d, 0x3e, 0x45, 0xd1, 0xcf, 0x3f, 0x3a, 0x72, 0xfa, + 0x95, 0x1e, 0x00, 0xe7, 0x07, 0x27, 0xfd, 0xae, 0x27, 0xf7, 0xad, 0x01, + 0x40, 0x26, 0x71, 0x52, 0x62, 0x68, 0x78, 0x13, 0xa5, 0x72, 0xa5, 0x40, + 0x55, 0x51, 0xd5, 0x65, 0x2c, 0x0a, 0x22, 0x42, 0x08, 0x22, 0x67, 0x4f, + 0x7e, 0x65, 0x76, 0x37, 0x77, 0x96, 0x0e, 0x8c, 0x8f, 0x87, 0x04, 0x60, + 0x1c, 0x78, 0x42, 0xc0, 0x8b, 0x12, 0x44, 0xd6, 0x04, 0x20, 0xd8, 0x94, + 0xdb, 0xb7, 0x66, 0xd6, 0x4d, 0x78, 0x75, 0x70, 0x38, 0x12, 0xc9, 0x7c, + 0x02, 0x24, 0x5d, 0x5e, 0x14, 0xe7, 0x1c, 0xd6, 0xba, 0x1e, 0x00, 0x8b, + 0xc9, 0x08, 0x4d, 0xa9, 0xe2, 0x7c, 0x40, 0x44, 0xd6, 0xf1, 0x68, 0x47, + 0x8f, 0x22, 0xc3, 0xd6, 0x61, 0xc3, 0xd6, 0x61, 0x25, 0x2e, 0x79, 0xa4, + 0x90, 0x53, 0x05, 0x00, 0x60, 0x5d, 0xc0, 0x7a, 0x0f, 0x85, 0x05, 0x77, + 0xb4, 0xcc, 0xfb, 0xef, 0xbe, 0x47, 0xb9, 0x54, 0xf9, 0xcb, 0x89, 0x66, + 0x6d, 0xca, 0x6b, 0xaf, 0x1f, 0x64, 0xf3, 0x40, 0x4c, 0xe2, 0x3d, 0x52, + 0x20, 0x38, 0x29, 0x66, 0xba, 0xf3, 0x0e, 0xeb, 0x5c, 0x0f, 0x00, 0xaf, + 0x9e, 0x72, 0xa9, 0xcc, 0xec, 0xdc, 0x4d, 0x54, 0x65, 0xfd, 0x59, 0x6e, + 0x22, 0x36, 0x6f, 0x1a, 0xc1, 0xfb, 0x80, 0x75, 0x42, 0xe2, 0x7c, 0xcf, + 0xad, 0xea, 0x32, 0x20, 0xe0, 0x9c, 0xc7, 0xda, 0x5e, 0x06, 0x3c, 0x1e, + 0x55, 0x18, 0xa8, 0x0e, 0xf4, 0x18, 0xae, 0x1d, 0x80, 0xe9, 0x44, 0x34, + 0xb5, 0x9e, 0xa4, 0xe2, 0x11, 0xa1, 0x5f, 0x08, 0x14, 0xeb, 0x3d, 0xce, + 0xb9, 0x1e, 0x47, 0x2e, 0xf2, 0x44, 0x91, 0xa1, 0xba, 0xa1, 0x0a, 0xc0, + 0xa5, 0x4b, 0x35, 0xbc, 0xf7, 0xab, 0x3a, 0x4c, 0x92, 0x98, 0xb1, 0xb1, + 0xb1, 0x95, 0x20, 0x00, 0x67, 0x2d, 0xce, 0xb9, 0xfe, 0x39, 0xa0, 0x9a, + 0x33, 0xe0, 0x3c, 0x52, 0x80, 0xe8, 0x23, 0x9f, 0x13, 0x92, 0x6d, 0xb2, + 0x7c, 0xf3, 0xf5, 0x48, 0x6a, 0x3d, 0x89, 0xf5, 0x45, 0x82, 0xdb, 0x00, + 0xc6, 0x11, 0xdd, 0x8d, 0xb5, 0x96, 0x34, 0xb5, 0xa8, 0x6a, 0x67, 0x91, + 0x8b, 0x2d, 0x21, 0x64, 0xcc, 0x00, 0xd4, 0xeb, 0x57, 0xef, 0xcb, 0x40, + 0x5b, 0x4a, 0xa5, 0x12, 0xdb, 0xb7, 0x6f, 0xcb, 0x59, 0x29, 0xa1, 0xaa, + 0xb4, 0x52, 0x4b, 0xc9, 0xda, 0x9c, 0x81, 0xf1, 0x95, 0x39, 0x60, 0xbd, + 0xa7, 0x65, 0xdb, 0x49, 0xa2, 0xa0, 0xe0, 0xca, 0x1e, 0xe7, 0x32, 0x60, + 0xa0, 0x8c, 0x8e, 0x8e, 0xac, 0xfd, 0xc4, 0x69, 0x2b, 0x6b, 0x1e, 0xf9, + 0x69, 0x96, 0x5a, 0x96, 0x72, 0xd5, 0x65, 0x39, 0x60, 0xfa, 0xdc, 0x02, + 0x9b, 0x3a, 0x52, 0x6b, 0x51, 0x11, 0x34, 0x0f, 0x4b, 0xa8, 0xb4, 0x43, + 0x92, 0x6d, 0xd2, 0x68, 0xdc, 0x24, 0x84, 0xf0, 0xa7, 0xce, 0x93, 0x24, + 0xc9, 0xc1, 0x6a, 0x27, 0xa4, 0x4b, 0xa9, 0x65, 0x43, 0x6a, 0x31, 0xaa, + 0x2b, 0x01, 0x88, 0x82, 0xb3, 0x8e, 0x34, 0x75, 0x88, 0x68, 0x27, 0x0c, + 0x8b, 0x7a, 0x97, 0xe9, 0xe9, 0xe9, 0x35, 0x39, 0xed, 0xa9, 0x94, 0xc1, + 0x51, 0xaf, 0xd7, 0x01, 0x88, 0xa2, 0x98, 0x66, 0xb3, 0x89, 0x5a, 0x4b, + 0x2b, 0x75, 0x54, 0x94, 0x55, 0x0a, 0x91, 0xf5, 0xb4, 0xd2, 0x3c, 0x46, + 0xaa, 0x88, 0xc2, 0x8d, 0xb9, 0x06, 0xc7, 0x8e, 0x1d, 0x47, 0xe6, 0xaf, + 0xa1, 0xcd, 0x19, 0x0c, 0xd2, 0xa7, 0x9f, 0x2d, 0xbb, 0x9e, 0xba, 0x52, + 0x7d, 0xea, 0x51, 0x43, 0x12, 0x3d, 0x42, 0x1c, 0x27, 0x44, 0xba, 0x83, + 0xc7, 0xca, 0x63, 0xa7, 0x9e, 0x7e, 0x5b, 0xce, 0x99, 0x4f, 0xdf, 0x7a, + 0xe1, 0x33, 0x94, 0x5d, 0xce, 0xd9, 0xbd, 0x42, 0x42, 0x08, 0x21, 0x6b, + 0x24, 0xb9, 0x65, 0xcb, 0x29, 0x43, 0x43, 0x83, 0x6c, 0xd9, 0xbe, 0x93, + 0xe7, 0x5e, 0x7c, 0x99, 0x52, 0x7e, 0x1d, 0xb3, 0x9b, 0x65, 0x50, 0xc0, + 0xe4, 0x7c, 0x6a, 0xfb, 0x3a, 0xad, 0xd0, 0xb3, 0x03, 0x65, 0xe7, 0xca, + 0x12, 0x20, 0x5d, 0x5a, 0xe0, 0x9b, 0xa3, 0x9f, 0x68, 0xe2, 0x9d, 0x3b, + 0xb0, 0xff, 0x8d, 0x43, 0xf1, 0xf0, 0xc3, 0x5b, 0xf2, 0xb8, 0x98, 0xfc, + 0x9f, 0xa0, 0xab, 0xab, 0x08, 0xce, 0x59, 0xee, 0xce, 0x35, 0x98, 0xbd, + 0x71, 0x39, 0xdf, 0x48, 0x3b, 0xb9, 0xd3, 0xab, 0x77, 0xbb, 0x61, 0x71, + 0x8e, 0x82, 0xcd, 0xc6, 0x87, 0x36, 0x11, 0xc7, 0xc6, 0x39, 0x6b, 0x67, + 0x13, 0x6b, 0xed, 0x85, 0x52, 0xa5, 0xfa, 0xf8, 0xc2, 0xbd, 0xd9, 0xf2, + 0x5c, 0xa3, 0xde, 0xdd, 0x20, 0x0f, 0x43, 0xbb, 0xad, 0xae, 0xea, 0x74, + 0xd9, 0x98, 0xe5, 0xeb, 0x96, 0xd9, 0xab, 0x2a, 0x22, 0x8e, 0x46, 0xbd, + 0x76, 0xcb, 0x79, 0x37, 0x99, 0xa4, 0xce, 0x4f, 0xdc, 0xb8, 0x5a, 0x1b, + 0xdd, 0xb6, 0x63, 0x6c, 0x44, 0x35, 0x2f, 0x12, 0x3d, 0x1b, 0xd0, 0xe3, + 0xb4, 0xbb, 0x79, 0xa1, 0xe7, 0x6b, 0x37, 0x64, 0x9d, 0x75, 0xab, 0x00, + 0x47, 0xc1, 0xdb, 0x25, 0xea, 0xb5, 0x73, 0x0b, 0xd6, 0x86, 0x8b, 0x91, + 0xf3, 0x6e, 0xe2, 0xfc, 0xcf, 0x27, 0x44, 0x55, 0xd0, 0x10, 0x40, 0x02, + 0x2a, 0x01, 0x15, 0x0f, 0x9a, 0x8f, 0x83, 0x07, 0x09, 0xbd, 0x4f, 0x3e, + 0x47, 0x61, 0xae, 0xb3, 0x4e, 0x43, 0x56, 0x58, 0x44, 0x0a, 0x73, 0xf9, + 0x37, 0x0d, 0x2c, 0xce, 0xdf, 0x61, 0xe6, 0xca, 0x64, 0xc5, 0x39, 0x7b, + 0x31, 0x71, 0xa9, 0x9b, 0xa8, 0xfd, 0x32, 0xb1, 0xf9, 0x99, 0xf9, 0x97, + 0x30, 0x06, 0x24, 0xf8, 0x02, 0xfd, 0xf4, 0x89, 0x33, 0x85, 0xd3, 0xf5, + 0x3b, 0xf9, 0x4a, 0x9b, 0x3c, 0x23, 0xbb, 0x36, 0xc0, 0x62, 0xb3, 0x39, + 0x8a, 0x61, 0x2a, 0x99, 0x6f, 0x2e, 0x9e, 0xf6, 0x3e, 0xc4, 0x37, 0x67, + 0x2e, 0x33, 0x38, 0x38, 0x48, 0x30, 0xa6, 0x9d, 0xe2, 0x85, 0x46, 0x62, + 0x72, 0xf3, 0xec, 0x87, 0xb5, 0x9d, 0xf9, 0xc6, 0x64, 0xd7, 0x57, 0xf3, + 0x42, 0x25, 0x2a, 0x68, 0x5e, 0x43, 0x3a, 0x7a, 0x61, 0xae, 0x5d, 0x90, + 0xee, 0xde, 0xbe, 0x85, 0x75, 0xae, 0xe2, 0xc5, 0xd4, 0xa2, 0x23, 0xdf, + 0x5e, 0x6a, 0x79, 0xe7, 0xa7, 0x2f, 0x9c, 0xf9, 0x49, 0xbd, 0x44, 0x68, + 0x54, 0x46, 0x4d, 0x09, 0xa2, 0x32, 0x44, 0xe5, 0x6c, 0x1c, 0x57, 0x20, + 0xae, 0x40, 0x9c, 0x8d, 0x8b, 0xba, 0x89, 0xcb, 0x90, 0x54, 0xd0, 0xa8, + 0x02, 0x51, 0xa5, 0x63, 0x67, 0xe2, 0x4a, 0x36, 0xd7, 0xb6, 0x31, 0xd9, + 0x7c, 0xd0, 0x98, 0x46, 0xe3, 0x3a, 0xa2, 0xba, 0xf0, 0xdd, 0x99, 0x99, + 0xeb, 0x09, 0x30, 0x34, 0x75, 0xed, 0xde, 0x61, 0x4e, 0x1e, 0x7f, 0x67, + 0xe2, 0xc7, 0x13, 0xc3, 0xa6, 0x7f, 0x3d, 0xe9, 0xdb, 0x5e, 0x97, 0xcb, + 0x5a, 0xff, 0x17, 0x82, 0xc8, 0x7c, 0x6d, 0x66, 0xe1, 0xe3, 0xe9, 0xe9, + 0x3b, 0xb1, 0x01, 0x06, 0x81, 0x11, 0x60, 0xb8, 0x58, 0x19, 0xff, 0x46, + 0x51, 0xc0, 0x02, 0xbf, 0x03, 0xb7, 0x0d, 0x10, 0x01, 0x71, 0xfe, 0x36, + 0xfc, 0x33, 0xa2, 0x40, 0xc8, 0x9f, 0x7f, 0x57, 0xfe, 0x00, 0x78, 0x44, + 0xa0, 0xe9, 0x8f, 0x7f, 0xa4, 0x26, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, + 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 +}; +unsigned int document_open_png_len = 1422; +unsigned char edit_select_all_png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, + 0x08, 0x06, 0x00, 0x00, 0x00, 0x73, 0x7a, 0x7a, 0xf4, 0x00, 0x00, 0x00, + 0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64, + 0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0d, + 0xd7, 0x00, 0x00, 0x0d, 0xd7, 0x01, 0x42, 0x28, 0x9b, 0x78, 0x00, 0x00, + 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, + 0x72, 0x65, 0x00, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x6b, 0x73, 0x63, + 0x61, 0x70, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x9b, 0xee, 0x3c, 0x1a, 0x00, + 0x00, 0x00, 0x12, 0x74, 0x45, 0x58, 0x74, 0x54, 0x69, 0x74, 0x6c, 0x65, + 0x00, 0x50, 0x61, 0x70, 0x65, 0x72, 0x20, 0x53, 0x68, 0x65, 0x65, 0x74, + 0x73, 0xb9, 0xaf, 0x91, 0xf9, 0x00, 0x00, 0x00, 0x17, 0x74, 0x45, 0x58, + 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x00, 0x4c, 0x61, 0x70, 0x6f, + 0x20, 0x43, 0x61, 0x6c, 0x61, 0x6d, 0x61, 0x6e, 0x64, 0x72, 0x65, 0x69, + 0xdf, 0x91, 0x1a, 0x2a, 0x00, 0x00, 0x00, 0x27, 0x74, 0x45, 0x58, 0x74, + 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x00, + 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x48, 0x55, 0x47, 0x45, 0x20, + 0x68, 0x65, 0x6c, 0x70, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x4a, 0x61, + 0x6b, 0x75, 0x62, 0x86, 0x54, 0x07, 0xb3, 0x00, 0x00, 0x05, 0x57, 0x49, + 0x44, 0x41, 0x54, 0x58, 0xc3, 0xc5, 0x97, 0x4d, 0x88, 0x5b, 0x65, 0x14, + 0x86, 0x9f, 0x73, 0x73, 0x93, 0x9b, 0x3b, 0x93, 0x49, 0x66, 0xc6, 0x76, + 0x6c, 0xad, 0xb8, 0x50, 0xdb, 0xda, 0x8c, 0xa2, 0xb6, 0x0b, 0x8b, 0x22, + 0xb5, 0xf5, 0x97, 0x2a, 0xfd, 0x19, 0xad, 0xe0, 0xae, 0x0b, 0x37, 0x0a, + 0x15, 0xc4, 0x8d, 0x0b, 0x41, 0x44, 0x14, 0x5c, 0x57, 0x14, 0xdc, 0x58, + 0xaa, 0x28, 0x56, 0xac, 0x28, 0x68, 0x41, 0xf0, 0xa7, 0xe2, 0xbf, 0x55, + 0x0b, 0x6a, 0x3b, 0x85, 0x22, 0x55, 0xb1, 0x9d, 0xa9, 0x36, 0xd3, 0x76, + 0x32, 0x63, 0x92, 0xe6, 0x3b, 0xc7, 0xc5, 0xfd, 0x99, 0x24, 0xd3, 0x99, + 0x49, 0xbb, 0xf1, 0x83, 0xcb, 0x47, 0x6e, 0x6e, 0x72, 0xde, 0xf3, 0xbe, + 0xe7, 0x3d, 0xdf, 0xb9, 0x62, 0x66, 0xfc, 0x9f, 0xcb, 0xe3, 0x7f, 0x5e, + 0x7e, 0xe7, 0x8d, 0x8f, 0x3e, 0xde, 0xb7, 0x45, 0xd5, 0xbd, 0xa2, 0xaa, + 0x8b, 0x01, 0x12, 0x86, 0xa2, 0xcd, 0xd2, 0xbd, 0xfd, 0x3b, 0x43, 0x44, + 0x9a, 0x22, 0xf2, 0x87, 0x9a, 0x7d, 0xd0, 0x30, 0xf7, 0xc2, 0xb6, 0xfb, + 0xb6, 0xfd, 0xd5, 0x0d, 0x00, 0xe9, 0x94, 0x60, 0xdf, 0x47, 0xef, 0xff, + 0xb9, 0x7e, 0xdd, 0x5d, 0x97, 0xe7, 0x83, 0xfc, 0x1c, 0x3f, 0x31, 0x5a, + 0x30, 0xa4, 0xeb, 0xdf, 0xda, 0x34, 0x7f, 0xff, 0x73, 0x92, 0xe3, 0x27, + 0x8e, 0x37, 0xc6, 0xc6, 0x8e, 0x37, 0x31, 0x79, 0x64, 0xeb, 0xe6, 0x07, + 0x76, 0x5f, 0x30, 0x03, 0xcd, 0xa6, 0x5b, 0x12, 0xe4, 0x02, 0xfe, 0xad, + 0x4d, 0xa3, 0xaa, 0xa8, 0x2a, 0x86, 0x61, 0x0a, 0x66, 0x8a, 0xa1, 0x98, + 0x1a, 0x6a, 0x8a, 0x99, 0xa2, 0x66, 0xa8, 0x2a, 0xbe, 0xef, 0x53, 0x2c, + 0x96, 0x08, 0xc3, 0x7c, 0x6e, 0x70, 0x70, 0x20, 0x37, 0x3a, 0x7a, 0xe4, + 0xe5, 0x3d, 0x7b, 0xdf, 0x1c, 0x7e, 0x70, 0xe4, 0xa1, 0x27, 0x67, 0xc3, + 0x9d, 0xa7, 0x06, 0x54, 0x35, 0xdd, 0x55, 0x15, 0x33, 0xc3, 0xd4, 0xa2, + 0xc0, 0x28, 0xaa, 0x16, 0x01, 0xb1, 0x48, 0x0e, 0x53, 0x03, 0x83, 0x46, + 0xa3, 0x41, 0xb5, 0x3a, 0x49, 0xa1, 0xb7, 0xc8, 0xe0, 0xc0, 0x22, 0x86, + 0xcb, 0xe5, 0x9e, 0x30, 0x0c, 0x1f, 0xdd, 0xf3, 0xf6, 0x1b, 0x6f, 0x03, + 0xd2, 0x35, 0x00, 0xe7, 0x5a, 0x00, 0xc4, 0x59, 0x1a, 0x33, 0x01, 0x53, + 0x09, 0x12, 0x0d, 0x25, 0xfa, 0x6f, 0x41, 0x00, 0xe3, 0xc4, 0xd8, 0x09, + 0x06, 0xfb, 0x07, 0x29, 0xf4, 0x15, 0x29, 0xaf, 0x2a, 0x17, 0xfc, 0x5c, + 0xf6, 0xee, 0x37, 0xf6, 0xbc, 0xfe, 0xcc, 0x05, 0x30, 0xe0, 0xe2, 0xc2, + 0x4a, 0x82, 0x76, 0x5e, 0x49, 0x41, 0xb6, 0x82, 0x88, 0x72, 0x14, 0xcf, + 0xa3, 0x56, 0x9b, 0x06, 0x84, 0x52, 0x5f, 0x89, 0x6c, 0x36, 0xcb, 0xf0, + 0xf0, 0x70, 0x01, 0xd3, 0x27, 0x76, 0xef, 0x7e, 0x75, 0x73, 0x57, 0x35, + 0x90, 0x4a, 0x60, 0xc6, 0xe7, 0xa3, 0x67, 0x50, 0xb5, 0x36, 0x09, 0x3b, + 0x5d, 0x31, 0x73, 0x2f, 0x02, 0x77, 0xed, 0x90, 0x8f, 0x08, 0x84, 0xf9, + 0x1e, 0x7a, 0xc2, 0x5e, 0x04, 0x8f, 0xeb, 0xae, 0xbb, 0xbe, 0xe7, 0xa7, + 0x1f, 0x0f, 0xbc, 0xbe, 0x6b, 0xd7, 0xae, 0xc5, 0xdb, 0xb7, 0x6f, 0xaf, + 0xcd, 0x0b, 0x20, 0x91, 0xc0, 0x4c, 0x51, 0xa7, 0xbc, 0xf6, 0xe1, 0xcf, + 0x38, 0x55, 0x30, 0x50, 0x6d, 0xe2, 0x65, 0xfc, 0xf3, 0x52, 0x19, 0x64, + 0x7d, 0xb6, 0xdd, 0xb1, 0x92, 0x03, 0xbf, 0xd7, 0xf9, 0xe2, 0xf0, 0x37, + 0xd4, 0x6b, 0x53, 0x34, 0xea, 0x75, 0xf2, 0x85, 0x3e, 0x36, 0xdf, 0xb2, + 0x9c, 0x9e, 0x42, 0x41, 0x4f, 0x9f, 0x3e, 0xbd, 0x11, 0xd8, 0xbb, 0x00, + 0x03, 0x2e, 0xcd, 0x2a, 0x52, 0x5f, 0x10, 0x2f, 0x13, 0xa3, 0x6b, 0x70, + 0xae, 0x76, 0x96, 0x6c, 0xd8, 0x8f, 0xa9, 0x4b, 0xc1, 0x98, 0x3a, 0x9a, + 0x16, 0x49, 0xb1, 0xef, 0xeb, 0x63, 0x8c, 0x8d, 0x57, 0x70, 0xe7, 0x6a, + 0xf4, 0x87, 0xc2, 0xea, 0x15, 0x25, 0x4e, 0x8e, 0x97, 0xb8, 0x66, 0xe5, + 0xaa, 0xe2, 0xf7, 0xdf, 0x7d, 0xfb, 0xf0, 0xc2, 0x00, 0x52, 0x06, 0x22, + 0x7a, 0x83, 0x20, 0x68, 0x49, 0x33, 0xc0, 0x4c, 0x99, 0x9e, 0x38, 0x4e, + 0xd0, 0x3b, 0x40, 0x26, 0x97, 0xa5, 0x5e, 0x3d, 0x45, 0xc6, 0x0f, 0xc8, + 0x65, 0x43, 0x40, 0x18, 0xb9, 0x7d, 0x18, 0x55, 0x87, 0x73, 0x4a, 0xb3, + 0x79, 0x8e, 0xe9, 0xea, 0x24, 0x95, 0x4a, 0x85, 0xb5, 0x37, 0xad, 0xe5, + 0xcb, 0x2f, 0xbf, 0xd8, 0xb0, 0x73, 0xe7, 0xce, 0x60, 0xc7, 0x8e, 0x1d, + 0xf5, 0xb9, 0x01, 0x58, 0x0c, 0x20, 0x89, 0x99, 0xcf, 0xb5, 0x7d, 0x5f, + 0xab, 0x56, 0xc8, 0x05, 0x39, 0x7a, 0x4b, 0x03, 0x00, 0x9c, 0xab, 0x36, + 0xe9, 0xed, 0x5f, 0x4a, 0x26, 0x93, 0x41, 0x04, 0xde, 0xdf, 0x7f, 0x94, + 0x93, 0x13, 0xd3, 0x00, 0x2c, 0x59, 0x54, 0xe0, 0xde, 0x5b, 0xae, 0xa2, + 0xbc, 0xbc, 0x97, 0x30, 0xdf, 0x83, 0x20, 0x38, 0xe7, 0x42, 0xa0, 0x3e, + 0x4f, 0x0d, 0xb8, 0xa4, 0xe1, 0x21, 0x40, 0x3e, 0x1f, 0xb4, 0xd9, 0x2d, + 0x9f, 0x5f, 0xca, 0xdf, 0xc7, 0x7e, 0xc1, 0xcf, 0x40, 0xad, 0x3a, 0x41, + 0xa1, 0x74, 0x09, 0x61, 0x18, 0xe2, 0x49, 0x64, 0xc6, 0x4d, 0xeb, 0x56, + 0xcc, 0xb6, 0x9a, 0xe7, 0xa5, 0x85, 0xbd, 0xa0, 0x0b, 0xa2, 0x22, 0xb4, + 0x94, 0x85, 0x20, 0x9f, 0xc3, 0x13, 0x8f, 0x4b, 0x8a, 0x01, 0x61, 0xce, + 0x67, 0x6c, 0x62, 0x9a, 0xdc, 0x8a, 0x1b, 0xf8, 0xfd, 0x97, 0xaf, 0x28, + 0x2d, 0x5a, 0x46, 0xff, 0xd0, 0x15, 0x51, 0x10, 0x11, 0x44, 0x3c, 0xde, + 0xdb, 0x7f, 0x84, 0x93, 0x95, 0x29, 0x00, 0x96, 0x2e, 0xea, 0xe3, 0xbe, + 0x5b, 0xaf, 0x4e, 0x01, 0x58, 0xec, 0xb0, 0xae, 0x6c, 0x08, 0x86, 0x08, + 0x64, 0x7d, 0x9f, 0xde, 0xbc, 0xcf, 0xea, 0x2b, 0x07, 0xf1, 0x33, 0x42, + 0x98, 0xcb, 0xf0, 0xdb, 0x78, 0x95, 0x6c, 0x2e, 0xa0, 0x7f, 0x68, 0x19, + 0x59, 0xdf, 0x8f, 0xb3, 0x8c, 0x58, 0xda, 0x72, 0xdb, 0x35, 0x6d, 0xe7, + 0x46, 0x04, 0xce, 0x03, 0xe9, 0x12, 0x40, 0x22, 0x81, 0x88, 0x20, 0x08, + 0x95, 0x3f, 0x0f, 0x71, 0x46, 0x84, 0xcf, 0xfe, 0xe9, 0x8b, 0x0f, 0x9d, + 0x06, 0x67, 0xce, 0x9e, 0x05, 0x57, 0xe7, 0xd4, 0x1f, 0xbf, 0x92, 0xf1, + 0xb3, 0x00, 0xe4, 0xf2, 0x21, 0xb2, 0xf2, 0x26, 0xde, 0xfd, 0xf4, 0x70, + 0x1b, 0x03, 0x9b, 0xd6, 0xad, 0x40, 0x3c, 0x2f, 0xd2, 0xdf, 0x14, 0x38, + 0xd3, 0x0d, 0x03, 0x11, 0x9d, 0x9e, 0x27, 0x6c, 0xba, 0x63, 0x6d, 0xda, + 0x68, 0x67, 0x3a, 0xfa, 0xec, 0xd6, 0x2e, 0x12, 0x81, 0x1e, 0xd9, 0x50, + 0x9e, 0xcd, 0x40, 0x52, 0x03, 0x4e, 0x3b, 0xc2, 0xcf, 0x63, 0x43, 0x2f, + 0xee, 0xaf, 0xef, 0xed, 0x1f, 0x4d, 0x33, 0xba, 0xd0, 0x75, 0xd9, 0xe2, + 0x22, 0x9b, 0xd7, 0xad, 0x8c, 0x24, 0x00, 0x9c, 0xba, 0x4e, 0x02, 0xce, + 0x23, 0x81, 0x26, 0x12, 0x78, 0x88, 0xc0, 0xc8, 0x86, 0x55, 0x1d, 0x0c, + 0x48, 0x07, 0x07, 0x32, 0xf7, 0x59, 0x67, 0x9d, 0x0c, 0x74, 0xe1, 0x82, + 0x84, 0x01, 0xf1, 0xa2, 0x1a, 0xd8, 0xfb, 0xc9, 0x61, 0xc6, 0x2b, 0xd5, + 0x8b, 0x66, 0x60, 0xeb, 0xfa, 0x55, 0xa9, 0x85, 0x2f, 0xc8, 0x05, 0x82, + 0x80, 0x08, 0x23, 0xb7, 0x97, 0x5b, 0xa4, 0x97, 0x99, 0xfc, 0x5b, 0x12, + 0xdf, 0xb8, 0xe6, 0xf2, 0x59, 0x7f, 0xfc, 0xe1, 0x0f, 0x7f, 0xa5, 0x47, + 0x77, 0xc2, 0x80, 0x33, 0xd7, 0x85, 0x0b, 0xb4, 0xd5, 0x05, 0xf0, 0xce, + 0x27, 0x87, 0x18, 0x3f, 0x35, 0x3f, 0x03, 0x1b, 0xd7, 0x3c, 0x90, 0x66, + 0x99, 0xb4, 0xf1, 0x17, 0xdf, 0xfa, 0x9a, 0x65, 0x43, 0x25, 0xb6, 0xae, + 0x2f, 0x23, 0xe2, 0xb5, 0xb1, 0xbb, 0x80, 0x04, 0x96, 0x4a, 0xab, 0x06, + 0xf7, 0x6f, 0x28, 0xcf, 0x64, 0xde, 0xc2, 0x80, 0xb4, 0xdb, 0x22, 0x19, + 0x4c, 0xd3, 0x33, 0xe4, 0xb1, 0x87, 0x6e, 0x4e, 0xe7, 0x86, 0x04, 0x9c, + 0x53, 0x05, 0x4e, 0x2f, 0x00, 0x20, 0xa6, 0x29, 0x9e, 0x31, 0x16, 0x64, + 0xe0, 0x8a, 0x25, 0xfd, 0x88, 0x08, 0xf7, 0xdc, 0xb8, 0xb4, 0xed, 0x3c, + 0xb9, 0xf3, 0xfa, 0x4b, 0xa1, 0x65, 0x90, 0x89, 0x92, 0x6b, 0x76, 0x84, + 0x9f, 0xa7, 0x08, 0x13, 0x17, 0x2f, 0xc4, 0x80, 0x08, 0x6d, 0xc1, 0x93, + 0xce, 0xe7, 0xd4, 0x91, 0x8c, 0x32, 0xd6, 0xda, 0xe6, 0xe7, 0xb2, 0xa1, + 0x44, 0x3c, 0xc9, 0xd3, 0xcf, 0x3c, 0x95, 0x3a, 0x68, 0x7d, 0x79, 0x20, + 0xaa, 0x85, 0xe4, 0x8a, 0x0b, 0x33, 0xfa, 0x3c, 0x53, 0xa8, 0xad, 0x34, + 0x27, 0x32, 0x44, 0xb3, 0x64, 0x7c, 0xac, 0xc7, 0x0c, 0x38, 0x35, 0x26, + 0x26, 0x26, 0x32, 0x22, 0x22, 0x16, 0xd3, 0xe2, 0xb7, 0x04, 0xf7, 0x80, + 0x6c, 0xd2, 0x8a, 0xd3, 0xd1, 0xf3, 0xbc, 0x03, 0xb5, 0x81, 0x09, 0x26, + 0x20, 0xd6, 0xfe, 0x92, 0x32, 0x23, 0x43, 0x14, 0xd8, 0xd2, 0x97, 0x19, + 0x30, 0xa7, 0x72, 0xf4, 0xe8, 0xd1, 0x5e, 0x60, 0x52, 0x44, 0x9a, 0x66, + 0xa6, 0x7e, 0x07, 0x1b, 0x45, 0xcc, 0x2a, 0x93, 0x93, 0x67, 0x87, 0x8a, + 0xc5, 0xe2, 0x9c, 0x6d, 0xb7, 0x9b, 0x95, 0xcb, 0x76, 0xcc, 0x11, 0xb5, + 0x1a, 0xb5, 0x46, 0xcd, 0x1d, 0x3c, 0x78, 0xb0, 0x18, 0x1f, 0x08, 0x53, + 0x22, 0x62, 0x7e, 0x4b, 0x14, 0x01, 0xb2, 0x3f, 0x1d, 0xfc, 0xf9, 0xa5, + 0xe7, 0x9e, 0x7f, 0xf6, 0x71, 0x13, 0xfa, 0xe8, 0x7c, 0x2d, 0x8b, 0x3f, + 0x74, 0xee, 0x6d, 0xcf, 0xcc, 0xfd, 0x6c, 0xed, 0xf0, 0xa1, 0xd1, 0x3d, + 0x53, 0x53, 0x53, 0x41, 0x9c, 0xac, 0x07, 0x38, 0x89, 0xed, 0x23, 0xf1, + 0xcd, 0x10, 0x28, 0x02, 0x05, 0x20, 0xdb, 0xf2, 0xa0, 0x5c, 0x24, 0x15, + 0x49, 0x45, 0x3b, 0xa0, 0x49, 0x34, 0x09, 0x4d, 0xc6, 0x57, 0x3d, 0x05, + 0x10, 0xd7, 0x81, 0x17, 0x07, 0xf3, 0x5a, 0x82, 0x5e, 0xbc, 0x06, 0xb3, + 0x8a, 0x26, 0xdd, 0x35, 0x06, 0xa4, 0x66, 0x66, 0xff, 0x01, 0x4f, 0x04, + 0xd6, 0x0b, 0x9d, 0x73, 0x34, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, + 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 +}; +unsigned int edit_select_all_png_len = 1614; +unsigned char media_seek_backward_png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, + 0x08, 0x06, 0x00, 0x00, 0x00, 0x73, 0x7a, 0x7a, 0xf4, 0x00, 0x00, 0x00, + 0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64, + 0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0d, + 0xd7, 0x00, 0x00, 0x0d, 0xd7, 0x01, 0x42, 0x28, 0x9b, 0x78, 0x00, 0x00, + 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, + 0x72, 0x65, 0x00, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x6b, 0x73, 0x63, + 0x61, 0x70, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x9b, 0xee, 0x3c, 0x1a, 0x00, + 0x00, 0x00, 0x13, 0x74, 0x45, 0x58, 0x74, 0x54, 0x69, 0x74, 0x6c, 0x65, + 0x00, 0x4f, 0x70, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x44, 0x72, 0x69, + 0x76, 0x65, 0x3e, 0x67, 0xba, 0x0c, 0x00, 0x00, 0x04, 0x6a, 0x49, 0x44, + 0x41, 0x54, 0x58, 0x85, 0xed, 0x97, 0x6d, 0x4c, 0x5b, 0x55, 0x18, 0xc7, + 0xff, 0xa7, 0xf7, 0xdc, 0x96, 0xd9, 0x42, 0x7b, 0x5b, 0x5c, 0x58, 0x21, + 0xdb, 0xa4, 0x1d, 0x1b, 0xda, 0x38, 0xa0, 0x28, 0xc2, 0x88, 0x6e, 0xce, + 0x17, 0x08, 0x64, 0x2f, 0x6a, 0x02, 0x2e, 0x9a, 0x98, 0x18, 0x33, 0x9c, + 0xca, 0xc6, 0x96, 0xa0, 0x18, 0x33, 0x25, 0x2a, 0x02, 0x0e, 0xbf, 0xc8, + 0x84, 0xb0, 0xc9, 0x90, 0x8d, 0x2f, 0x48, 0x8c, 0xcb, 0x96, 0x4d, 0x1d, + 0x9b, 0x71, 0xbc, 0x28, 0xcc, 0x6c, 0x5f, 0x66, 0x64, 0x3a, 0x60, 0x89, + 0x5b, 0x07, 0x86, 0xf1, 0x56, 0xfa, 0xc2, 0x3d, 0xb7, 0xf7, 0xf8, 0x01, + 0xda, 0x8c, 0xd0, 0x41, 0xb7, 0x2f, 0xf3, 0x03, 0x27, 0x39, 0xdf, 0x7e, + 0x27, 0xe7, 0xf7, 0x3c, 0xcf, 0xb9, 0xcf, 0x93, 0x4b, 0x38, 0xe7, 0xb8, + 0x9f, 0x4b, 0x73, 0x5f, 0x6f, 0x5f, 0x12, 0x58, 0x12, 0xf8, 0x3f, 0x08, + 0xd0, 0x7b, 0x3d, 0x48, 0x08, 0x21, 0x00, 0xf4, 0x00, 0x74, 0x00, 0x3c, + 0x9c, 0x73, 0x7f, 0x84, 0xbc, 0x00, 0xc0, 0xc7, 0x39, 0x97, 0xef, 0x59, + 0x80, 0x10, 0xa2, 0x03, 0x60, 0x6c, 0x3a, 0xda, 0xb8, 0x39, 0x21, 0x61, + 0xc5, 0xf6, 0x1f, 0x4f, 0x9d, 0x2b, 0x03, 0xd0, 0x1f, 0x09, 0x6f, 0xb5, + 0xc6, 0xbd, 0x70, 0xfa, 0xe4, 0x99, 0x77, 0x01, 0x0c, 0x00, 0x00, 0x38, + 0xe7, 0x11, 0xef, 0x59, 0x7b, 0xa9, 0xb4, 0xb4, 0x34, 0xbd, 0xfd, 0xe7, + 0x1f, 0x3a, 0x7a, 0x7f, 0xef, 0xf2, 0xff, 0x74, 0xf6, 0x14, 0x67, 0x8c, + 0xed, 0x5d, 0x8c, 0x3f, 0x73, 0xee, 0x74, 0x47, 0xef, 0x85, 0x10, 0xbf, + 0x2f, 0xc8, 0x44, 0xf4, 0x06, 0xc8, 0xcc, 0x32, 0x38, 0x1c, 0x0e, 0xeb, + 0xf7, 0xc7, 0xdb, 0xca, 0x9e, 0xcf, 0xdd, 0x7c, 0xde, 0xf1, 0xf0, 0xa3, + 0x1b, 0xd2, 0xd3, 0x32, 0x75, 0x8c, 0x31, 0x50, 0x4a, 0x0d, 0x61, 0xce, + 0x18, 0x1c, 0x0e, 0x87, 0xf5, 0xbb, 0xe3, 0xad, 0x65, 0xcf, 0xe5, 0x6e, + 0x3a, 0xef, 0x78, 0x64, 0xfd, 0x86, 0x74, 0xe7, 0x7c, 0x7e, 0xd1, 0x12, + 0x04, 0xd3, 0x57, 0xd7, 0x50, 0xbb, 0x31, 0x21, 0xde, 0x5a, 0x9b, 0xb4, + 0x26, 0x59, 0x4a, 0x4c, 0xb4, 0x53, 0x8f, 0x77, 0x0a, 0x84, 0x10, 0x30, + 0x99, 0x85, 0xe3, 0x63, 0xea, 0x1a, 0x6a, 0x37, 0x25, 0xc4, 0x5b, 0x6b, + 0xed, 0xb6, 0x24, 0xc9, 0x6e, 0x5b, 0x4b, 0xfd, 0xd3, 0xbe, 0xb0, 0xfc, + 0x1d, 0x05, 0x08, 0x21, 0x02, 0x80, 0x98, 0xa2, 0xa2, 0xa2, 0xd5, 0xcf, + 0xe4, 0x6c, 0xaa, 0x89, 0x5b, 0x1e, 0x97, 0xe5, 0x4c, 0x7d, 0x4c, 0x47, + 0x34, 0x1a, 0xdc, 0x1c, 0xbe, 0x01, 0xb7, 0x7b, 0x02, 0xc6, 0xb5, 0x26, + 0xc8, 0x4c, 0x9e, 0xc7, 0x3f, 0x9b, 0xb3, 0xb1, 0x26, 0x36, 0xf6, 0xc1, + 0x0d, 0xe9, 0xa9, 0x19, 0x5a, 0x8d, 0x20, 0xe0, 0xd6, 0xd8, 0xbf, 0x50, + 0x55, 0x0e, 0x83, 0x3e, 0x3a, 0xc4, 0x2f, 0x28, 0x40, 0x08, 0xd1, 0xdb, + 0x6c, 0x36, 0xf3, 0x07, 0xfb, 0xdf, 0xdb, 0x65, 0xb1, 0x98, 0xf7, 0x64, + 0x65, 0x3e, 0xa5, 0x93, 0x4c, 0x26, 0x32, 0x3e, 0x31, 0x86, 0xb1, 0x89, + 0x51, 0xc8, 0xf2, 0x34, 0x88, 0x86, 0x00, 0x40, 0x28, 0x22, 0xa7, 0xd3, + 0x19, 0xff, 0x76, 0x71, 0xd1, 0x9b, 0x66, 0xb3, 0x79, 0x4f, 0x46, 0x46, + 0x96, 0xce, 0x22, 0xc5, 0x92, 0xf1, 0xc9, 0x51, 0xf8, 0xfc, 0x3e, 0x50, + 0x4a, 0x41, 0x29, 0x9d, 0xc3, 0x87, 0x15, 0x20, 0x84, 0x88, 0x00, 0x4c, + 0x9f, 0x55, 0x7f, 0xf2, 0xe4, 0xea, 0x55, 0xab, 0x0e, 0xa6, 0xa5, 0xa6, + 0x5b, 0xec, 0xb6, 0x24, 0xea, 0x9f, 0xf6, 0x61, 0x68, 0xd8, 0x05, 0xbf, + 0xec, 0x07, 0x63, 0x32, 0x38, 0x38, 0xb4, 0x54, 0x07, 0x00, 0x90, 0x99, + 0x8c, 0x3f, 0xfb, 0xfe, 0xb0, 0xed, 0x2b, 0xdd, 0xdd, 0x9b, 0xb2, 0x3e, + 0xcd, 0x92, 0x64, 0x5f, 0x4b, 0x27, 0xa7, 0x26, 0xe1, 0x1a, 0xfa, 0x07, + 0x1a, 0x41, 0x80, 0x48, 0xc5, 0x19, 0x01, 0x81, 0x86, 0xf8, 0x85, 0x32, + 0x60, 0x3a, 0xfc, 0x75, 0x7d, 0xb3, 0xdd, 0x6e, 0x7f, 0x3a, 0xf3, 0x89, + 0x6c, 0x2d, 0x40, 0x30, 0x31, 0x39, 0x06, 0x9f, 0xcf, 0x0b, 0x99, 0x4d, + 0x83, 0x31, 0x86, 0x80, 0x1a, 0x80, 0x56, 0xd4, 0x82, 0x52, 0x31, 0x14, + 0xd1, 0xf0, 0xf0, 0xf0, 0x8e, 0xed, 0x5b, 0x5e, 0xa2, 0x01, 0x35, 0x80, + 0x1b, 0x43, 0xd7, 0xc1, 0xb9, 0x0a, 0x2a, 0xcc, 0x44, 0x2d, 0x08, 0x73, + 0x05, 0x16, 0xcc, 0x40, 0x72, 0x72, 0x32, 0x7d, 0xc0, 0x60, 0x58, 0x19, + 0x50, 0x55, 0x0d, 0x40, 0x40, 0x08, 0xa0, 0x30, 0x05, 0x4c, 0x61, 0x90, + 0x19, 0x03, 0x53, 0xe4, 0xd0, 0xe5, 0xa2, 0x28, 0x86, 0x22, 0x52, 0x54, + 0x05, 0x20, 0x04, 0x84, 0x10, 0x08, 0x02, 0x05, 0xc0, 0x43, 0x02, 0x54, + 0x58, 0x38, 0x03, 0x73, 0x3e, 0x43, 0x8d, 0x46, 0x73, 0x6b, 0xfb, 0x96, + 0x17, 0xab, 0x8c, 0xd1, 0xc6, 0xd6, 0xa3, 0xc7, 0x8e, 0x4c, 0x5d, 0xb9, + 0xd2, 0x17, 0x30, 0x9b, 0x63, 0x11, 0x13, 0x6d, 0x44, 0x40, 0x55, 0x66, + 0xd3, 0x29, 0x42, 0x14, 0xb5, 0x10, 0x6f, 0xcb, 0x80, 0x14, 0x63, 0x6a, + 0x3d, 0xd6, 0xd2, 0x34, 0xd5, 0xdf, 0x7f, 0x35, 0x10, 0xb7, 0x7c, 0x05, + 0x24, 0xa3, 0x39, 0x24, 0x3a, 0x53, 0x7f, 0x71, 0x4e, 0xc6, 0xee, 0x28, + 0x70, 0xf9, 0xf2, 0x65, 0x39, 0x2a, 0x2a, 0xaa, 0x59, 0x92, 0x62, 0x3f, + 0x7a, 0xb9, 0xf0, 0xd5, 0xca, 0x81, 0xc1, 0xfe, 0xae, 0xc6, 0x6f, 0x0e, + 0x31, 0x8f, 0xd7, 0xcb, 0xd7, 0x3c, 0xb4, 0x0e, 0x92, 0xc9, 0x12, 0xba, + 0x3c, 0x28, 0x20, 0x33, 0x19, 0x4e, 0xe7, 0xe3, 0x7f, 0xbd, 0xb2, 0xe3, + 0xb5, 0xca, 0xc1, 0xc1, 0x81, 0xae, 0x23, 0x4d, 0x87, 0x99, 0xdb, 0xed, + 0xe6, 0xc6, 0x18, 0x09, 0xcb, 0x74, 0xcb, 0x66, 0x59, 0x0a, 0x41, 0x10, + 0x22, 0x7a, 0x03, 0x00, 0x80, 0xc4, 0xc4, 0xc4, 0xbf, 0x77, 0xee, 0xdc, + 0x59, 0x5d, 0x51, 0x51, 0xd1, 0xe3, 0xf5, 0x7a, 0xf2, 0x4e, 0x9f, 0x3a, + 0xb9, 0xd5, 0x68, 0x92, 0x12, 0xf2, 0x72, 0xf3, 0x45, 0xc9, 0x68, 0x86, + 0xcf, 0xe7, 0x05, 0xd1, 0x68, 0x6e, 0x8f, 0x88, 0x37, 0x37, 0x37, 0x57, + 0x17, 0x14, 0x14, 0xf4, 0x4c, 0x4e, 0x4e, 0xe4, 0x9d, 0x38, 0x71, 0x7c, + 0xab, 0x24, 0x49, 0x09, 0xf9, 0x79, 0x5b, 0x44, 0x9d, 0x2e, 0x0a, 0xc0, + 0x4c, 0xc7, 0x0d, 0xd7, 0x07, 0x16, 0x6d, 0xbf, 0x97, 0x2e, 0x5d, 0x32, + 0xc9, 0xb2, 0xfc, 0x7a, 0x67, 0xe7, 0x2f, 0x2d, 0x95, 0x07, 0x3e, 0x75, + 0x77, 0xff, 0xda, 0xa9, 0x28, 0x8a, 0xc2, 0x15, 0x85, 0x71, 0xce, 0x39, + 0xdf, 0x5f, 0xfe, 0x3e, 0xe7, 0x9c, 0xef, 0x0f, 0xf2, 0x1d, 0x1d, 0x1d, + 0x52, 0x90, 0xaf, 0xaa, 0xa9, 0x70, 0xf7, 0xf4, 0xfe, 0xa6, 0xa8, 0xaa, + 0xca, 0x55, 0x55, 0xbd, 0x9d, 0xff, 0x30, 0xe2, 0x56, 0x9c, 0x92, 0x92, + 0x32, 0xae, 0xd5, 0x6a, 0x1b, 0xe3, 0xe3, 0x57, 0x7e, 0xbc, 0xfb, 0xad, + 0xbd, 0x55, 0xd7, 0xae, 0x0d, 0x76, 0xd7, 0x7c, 0x51, 0x25, 0xdf, 0x1c, + 0xba, 0xc9, 0xc3, 0xd5, 0x34, 0x3b, 0x3b, 0x7b, 0x2c, 0xc8, 0x17, 0xef, + 0x2a, 0xa9, 0x1a, 0x18, 0xb8, 0xda, 0xfd, 0xf9, 0x81, 0x4a, 0xf9, 0x86, + 0xeb, 0x7a, 0x58, 0x3e, 0xa2, 0x69, 0xc8, 0x67, 0x26, 0x4b, 0x5f, 0x43, + 0x43, 0x43, 0x55, 0x61, 0x61, 0xe1, 0x85, 0x91, 0xd1, 0x91, 0x9c, 0xb6, + 0xb6, 0xd6, 0x6d, 0x7a, 0x83, 0x21, 0x5e, 0x96, 0x65, 0xf1, 0x4e, 0x7c, + 0x79, 0x79, 0x79, 0x75, 0x49, 0x49, 0xc9, 0x85, 0x91, 0xd1, 0x91, 0x9c, + 0x6f, 0xdb, 0x5a, 0xb7, 0xe9, 0xf5, 0xfa, 0xf9, 0xfc, 0xdd, 0x4c, 0xc3, + 0xe0, 0xee, 0xee, 0xee, 0x36, 0x2b, 0x8a, 0xf2, 0xc6, 0xd9, 0xb3, 0x67, + 0x5a, 0xea, 0xea, 0x0f, 0x5e, 0xe4, 0x9c, 0xbf, 0xb3, 0x10, 0xdf, 0xde, + 0xde, 0x6e, 0x09, 0xf2, 0x5f, 0xd5, 0x7f, 0x79, 0x91, 0x73, 0x5e, 0x1c, + 0x9a, 0x98, 0xf7, 0x22, 0x30, 0x3b, 0x6a, 0x89, 0xcb, 0xe5, 0x5a, 0xc7, + 0x39, 0xcf, 0xf7, 0x78, 0x3c, 0xd6, 0xbb, 0xe1, 0x39, 0xe7, 0x21, 0x9e, + 0x2c, 0xfd, 0x98, 0x2c, 0x09, 0x2c, 0x09, 0xdc, 0x6f, 0x81, 0xff, 0x00, + 0x22, 0x33, 0xf5, 0x54, 0xc3, 0xec, 0xb3, 0x75, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 +}; +unsigned int media_seek_backward_png_len = 1292; +unsigned char system_log_out_png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, + 0x08, 0x06, 0x00, 0x00, 0x00, 0x73, 0x7a, 0x7a, 0xf4, 0x00, 0x00, 0x00, + 0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64, + 0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0d, + 0xd7, 0x00, 0x00, 0x0d, 0xd7, 0x01, 0x42, 0x28, 0x9b, 0x78, 0x00, 0x00, + 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, + 0x72, 0x65, 0x00, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x6b, 0x73, 0x63, + 0x61, 0x70, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x9b, 0xee, 0x3c, 0x1a, 0x00, + 0x00, 0x00, 0x20, 0x74, 0x45, 0x58, 0x74, 0x54, 0x69, 0x74, 0x6c, 0x65, + 0x00, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x53, + 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x73, 0x2c, 0x82, 0xc9, 0xba, 0x00, 0x00, 0x00, 0x17, 0x74, + 0x45, 0x58, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x00, 0x4c, 0x61, + 0x70, 0x6f, 0x20, 0x43, 0x61, 0x6c, 0x61, 0x6d, 0x61, 0x6e, 0x64, 0x72, + 0x65, 0x69, 0xdf, 0x91, 0x1a, 0x2a, 0x00, 0x00, 0x05, 0xd9, 0x49, 0x44, + 0x41, 0x54, 0x58, 0xc3, 0xbd, 0x97, 0x5d, 0x6c, 0x14, 0xd7, 0x15, 0x80, + 0xbf, 0x73, 0xee, 0xcc, 0xda, 0x60, 0x27, 0xd8, 0x86, 0xd6, 0xae, 0xf1, + 0x42, 0xd8, 0x00, 0x51, 0x81, 0xd6, 0x44, 0xaa, 0x43, 0xfe, 0x5a, 0xd1, + 0x2a, 0x51, 0x1e, 0x00, 0x25, 0x05, 0x85, 0x4a, 0x49, 0xd5, 0x36, 0xed, + 0x43, 0xa2, 0x48, 0x79, 0x08, 0x21, 0x8d, 0xf2, 0xd4, 0x9f, 0x48, 0x81, + 0x46, 0x51, 0xfa, 0x10, 0xf5, 0x29, 0xc2, 0x95, 0xaa, 0x54, 0x6d, 0x05, + 0x11, 0x10, 0xaa, 0x26, 0x6d, 0x54, 0x14, 0x55, 0x55, 0xf8, 0x6b, 0xd4, + 0x86, 0x08, 0x28, 0xc4, 0x80, 0x63, 0xb0, 0x0d, 0x01, 0x6c, 0x83, 0x8d, + 0xf1, 0x7a, 0x67, 0xee, 0xed, 0xc3, 0x9d, 0xdd, 0x9d, 0x61, 0x4d, 0xed, + 0xa8, 0x2a, 0x57, 0xba, 0xda, 0x59, 0xed, 0x99, 0x73, 0xbe, 0x7b, 0xce, + 0x3d, 0x3f, 0x2b, 0xce, 0x39, 0xee, 0xde, 0x1c, 0x3e, 0x18, 0x2a, 0xdd, + 0xd6, 0xd2, 0xc1, 0x4d, 0x58, 0xaa, 0x9c, 0x2d, 0x59, 0x7e, 0xb8, 0xff, + 0xd5, 0xd2, 0x7b, 0x01, 0x40, 0xa8, 0x74, 0x77, 0x14, 0xda, 0x3a, 0xbe, + 0xd4, 0x3a, 0x1f, 0x00, 0x41, 0xbc, 0xa4, 0xc8, 0xf4, 0xda, 0x9c, 0xab, + 0x3e, 0xe2, 0x66, 0x04, 0x30, 0x78, 0xbe, 0xbf, 0xe3, 0xec, 0xa9, 0x73, + 0xdd, 0x40, 0x3e, 0x00, 0xb0, 0x96, 0x8e, 0xf6, 0xd6, 0x3c, 0x7d, 0x23, + 0x47, 0xb1, 0x36, 0x46, 0x52, 0x86, 0xcb, 0x30, 0xb5, 0x50, 0x02, 0xb8, + 0x8a, 0xac, 0x73, 0x1e, 0x40, 0x32, 0x6c, 0x96, 0x52, 0x5c, 0xcc, 0x80, + 0x19, 0x0d, 0x58, 0xf8, 0xc5, 0x15, 0xf4, 0xf5, 0x9c, 0xeb, 0x00, 0x08, + 0xca, 0x3f, 0x04, 0x1a, 0xa0, 0x28, 0x6a, 0x4c, 0xc6, 0xe0, 0xef, 0x7f, + 0x70, 0xf1, 0x7f, 0x72, 0xf7, 0xfa, 0x6d, 0x8d, 0xde, 0x37, 0xce, 0xe1, + 0x9c, 0x25, 0xb6, 0x11, 0xa4, 0x80, 0x2a, 0x00, 0xa2, 0x06, 0xa3, 0x61, + 0x72, 0xa2, 0xe4, 0xd4, 0x33, 0x09, 0xc1, 0x34, 0x2b, 0xd0, 0x10, 0x87, + 0x37, 0xee, 0x9c, 0xc3, 0x61, 0x33, 0xa1, 0xad, 0x00, 0x18, 0x09, 0x08, + 0x4c, 0x88, 0x20, 0x9f, 0xcb, 0x70, 0x64, 0x4b, 0xec, 0xf9, 0xf8, 0x75, + 0xfe, 0xd9, 0xff, 0x17, 0xba, 0x16, 0xac, 0x65, 0xed, 0xf2, 0xa7, 0x11, + 0xd1, 0x8c, 0xcb, 0xcb, 0x86, 0x9d, 0x78, 0x10, 0x41, 0x6b, 0x01, 0x54, + 0x03, 0x02, 0x0d, 0x13, 0xe7, 0xcf, 0x1c, 0xe2, 0x1f, 0x7d, 0x7f, 0x62, + 0xcf, 0x91, 0xd7, 0x71, 0xce, 0xd1, 0x37, 0x7c, 0x8c, 0x05, 0xcd, 0xcb, + 0xe8, 0x9c, 0xff, 0xad, 0xea, 0x8d, 0x97, 0x00, 0xc4, 0x61, 0x9d, 0xf5, + 0x5e, 0x10, 0x45, 0x53, 0x80, 0x5a, 0x15, 0x34, 0x04, 0x9a, 0x23, 0xd4, + 0x1c, 0x81, 0xc9, 0x61, 0x34, 0x24, 0xd0, 0xdc, 0xb4, 0x00, 0xe7, 0x46, + 0x4f, 0x27, 0xb2, 0x7e, 0x0f, 0x5e, 0x39, 0x95, 0xf9, 0xdd, 0xa8, 0xc1, + 0x48, 0x80, 0x51, 0xbf, 0x55, 0x4c, 0xda, 0x6c, 0x1a, 0x40, 0x31, 0x1a, + 0xa6, 0x94, 0x79, 0x88, 0xe9, 0xd6, 0xfd, 0x85, 0x47, 0x69, 0x9e, 0xd5, + 0x8a, 0xd1, 0x90, 0x96, 0xd9, 0xed, 0xdc, 0xb7, 0x68, 0x7d, 0x16, 0x40, + 0x02, 0x54, 0xfd, 0xa9, 0x55, 0x0c, 0x2a, 0x26, 0x93, 0xdd, 0xa9, 0x3b, + 0x60, 0x08, 0x35, 0x07, 0x22, 0xd5, 0xd4, 0x9b, 0x41, 0x18, 0xe6, 0x35, + 0xcc, 0x67, 0xcb, 0xba, 0xbd, 0xf4, 0x0e, 0x1d, 0xe6, 0xb6, 0x96, 0x95, + 0x18, 0x35, 0xd9, 0xa2, 0x23, 0x26, 0x49, 0x4e, 0xc1, 0x61, 0xcb, 0x01, + 0x9e, 0xfa, 0x0e, 0xa4, 0xb3, 0x40, 0x24, 0x2b, 0x08, 0xf0, 0xee, 0xb1, + 0x37, 0xf8, 0xfb, 0xc9, 0x1d, 0x49, 0x5e, 0xfb, 0xd4, 0xb2, 0x44, 0xe0, + 0x84, 0xfa, 0xb0, 0x81, 0x27, 0x56, 0xfd, 0x82, 0x85, 0x2d, 0xcb, 0xaf, + 0xab, 0x7a, 0x06, 0x6b, 0x41, 0x05, 0x2c, 0x00, 0x36, 0xe3, 0x01, 0x4d, + 0x7b, 0xa0, 0x1c, 0x82, 0xd0, 0xe4, 0x6a, 0x42, 0x70, 0xea, 0xd2, 0xbf, + 0x78, 0xff, 0x93, 0xdf, 0xb2, 0xbc, 0xfd, 0xeb, 0x3c, 0x70, 0xc7, 0xf7, + 0x59, 0xb5, 0x70, 0x1d, 0xc5, 0x78, 0x9c, 0xc9, 0xa8, 0x48, 0x31, 0x1a, + 0x67, 0xe4, 0xda, 0x79, 0xba, 0xf7, 0x3f, 0xcf, 0x58, 0x71, 0x38, 0x03, + 0x20, 0x08, 0x2a, 0x8a, 0xe0, 0xc3, 0x20, 0x22, 0xe0, 0xa4, 0x16, 0x40, + 0xc4, 0x60, 0x92, 0x4c, 0x48, 0x5f, 0x2a, 0x80, 0xc9, 0x78, 0x82, 0x9d, + 0x1f, 0xbd, 0x46, 0xbe, 0x79, 0x19, 0xdf, 0x59, 0xf9, 0x22, 0xdf, 0x5c, + 0xf2, 0x38, 0x91, 0x8b, 0x7c, 0x7c, 0xc5, 0x20, 0x89, 0x81, 0xf1, 0xd2, + 0x28, 0xbf, 0x3e, 0xf0, 0x02, 0xd6, 0xc5, 0x55, 0x00, 0x51, 0x1f, 0xd6, + 0x54, 0x05, 0x75, 0x53, 0x16, 0x22, 0x04, 0xa3, 0x41, 0x95, 0x58, 0xb4, + 0x12, 0x82, 0xfd, 0xbd, 0x6f, 0x73, 0x75, 0xf2, 0x32, 0xdf, 0xed, 0xfa, + 0x39, 0xaa, 0x86, 0x0b, 0x63, 0x7d, 0x7c, 0x78, 0xe6, 0x1d, 0x54, 0x35, + 0xa9, 0xc1, 0x4a, 0x7e, 0xce, 0x72, 0xd6, 0xac, 0x78, 0x9a, 0x5f, 0xfd, + 0xed, 0x29, 0xde, 0x3c, 0xf4, 0x13, 0x0a, 0x73, 0x3b, 0x2b, 0x15, 0x4f, + 0x90, 0xca, 0x53, 0x4d, 0xa1, 0xaa, 0x92, 0x4a, 0xc5, 0x78, 0xf9, 0x54, + 0x3e, 0x65, 0x60, 0xd1, 0xdc, 0xaf, 0x30, 0xbf, 0xe9, 0xa7, 0xb4, 0xde, + 0x72, 0x1b, 0x00, 0xef, 0x9d, 0xe8, 0x46, 0xc4, 0xa2, 0x26, 0xb1, 0x61, + 0x85, 0x75, 0x5f, 0x7d, 0x86, 0x42, 0x4b, 0x27, 0x1b, 0x56, 0x6e, 0x66, + 0xfb, 0x47, 0xaf, 0xf0, 0x41, 0xef, 0x5b, 0x44, 0x71, 0x89, 0xc8, 0x4e, + 0x12, 0xd9, 0x88, 0xd8, 0x46, 0x58, 0x1b, 0x61, 0x5d, 0xcc, 0xd5, 0xdc, + 0x9c, 0x5a, 0x80, 0x32, 0xad, 0x23, 0x29, 0x97, 0x0e, 0x6c, 0x02, 0x9c, + 0x6f, 0xfa, 0x72, 0x45, 0x6a, 0x68, 0x7c, 0x80, 0x43, 0xfd, 0x7b, 0x28, + 0xc5, 0x45, 0x22, 0x5b, 0x24, 0x8a, 0x27, 0x59, 0xd1, 0xb6, 0x9a, 0x42, + 0x4b, 0x67, 0x92, 0x96, 0x1b, 0xb9, 0xbf, 0xb0, 0xb1, 0x22, 0xff, 0xc8, + 0xb6, 0x7a, 0x9c, 0x75, 0x35, 0xd5, 0xb3, 0x06, 0x60, 0x74, 0x62, 0x88, + 0xa1, 0xf1, 0x01, 0x22, 0x5b, 0xc2, 0xba, 0x12, 0xb1, 0x8b, 0x88, 0x29, + 0xd5, 0xb8, 0xec, 0xb3, 0xab, 0xbd, 0x0c, 0x8c, 0x1e, 0x23, 0x17, 0xcc, + 0x22, 0xb2, 0x93, 0x58, 0x17, 0x73, 0xef, 0xa2, 0x0d, 0x37, 0xee, 0xfd, + 0x06, 0x9c, 0x88, 0x2f, 0xc7, 0xb6, 0xda, 0x25, 0x6b, 0x2e, 0xe1, 0xc0, + 0x95, 0x1e, 0x06, 0xae, 0xf4, 0x70, 0x71, 0xbc, 0x8f, 0xe1, 0xe2, 0x20, + 0xa3, 0xd1, 0x45, 0xae, 0xc5, 0x97, 0x6b, 0x14, 0x4e, 0x44, 0xa3, 0x68, + 0x20, 0x7c, 0xe1, 0xd6, 0x3c, 0xdf, 0xb8, 0xfd, 0x31, 0x34, 0x50, 0xfe, + 0x7a, 0x7a, 0xdb, 0x7f, 0x01, 0x10, 0x34, 0x10, 0xff, 0x69, 0x04, 0x24, + 0x3b, 0x37, 0x68, 0x3a, 0x04, 0xaa, 0xe2, 0xb7, 0x49, 0xbd, 0x70, 0xdd, + 0xba, 0x96, 0x00, 0x34, 0xd6, 0x35, 0xb1, 0x7e, 0xd9, 0x0b, 0x84, 0x61, + 0xc0, 0x91, 0x0b, 0x7b, 0xf9, 0x64, 0xe8, 0xc0, 0x8d, 0x01, 0xca, 0x3b, + 0xd1, 0xcf, 0x94, 0x00, 0xea, 0x85, 0xc5, 0x90, 0x01, 0xa9, 0x01, 0x88, + 0xaf, 0x60, 0x02, 0xa1, 0xb1, 0x7e, 0x0e, 0xad, 0x0d, 0x05, 0xee, 0x5b, + 0xb0, 0x11, 0x0d, 0x84, 0x9d, 0xc7, 0xb7, 0xdc, 0x18, 0x20, 0xd1, 0x27, + 0xc6, 0x7f, 0x4f, 0x1f, 0x3b, 0x35, 0x0f, 0xf8, 0x5d, 0x7e, 0xa1, 0x30, + 0xf7, 0x4e, 0x56, 0x17, 0xbe, 0xc7, 0xfe, 0xb3, 0x6f, 0x81, 0x24, 0x09, + 0x24, 0xd0, 0x33, 0xbc, 0x0f, 0x35, 0x42, 0x43, 0x9d, 0xbf, 0xc9, 0x0f, + 0xdf, 0xf1, 0x63, 0x0e, 0x9e, 0xdf, 0xc1, 0xd1, 0xa1, 0xbd, 0xf4, 0x0c, + 0x1f, 0x64, 0x71, 0xf3, 0x5d, 0x35, 0x00, 0x4e, 0x1c, 0x4e, 0xbc, 0x12, + 0x8b, 0x43, 0xa6, 0x02, 0x40, 0xaa, 0x21, 0x78, 0x68, 0xe9, 0x93, 0x8c, + 0x14, 0x07, 0xf9, 0xcd, 0xe1, 0xe7, 0x50, 0x05, 0x51, 0xf1, 0x80, 0xe2, + 0x3f, 0x4d, 0xa0, 0xdc, 0x52, 0xdf, 0x02, 0x40, 0x5b, 0xc3, 0x62, 0xee, + 0xe9, 0x78, 0x94, 0x7d, 0x03, 0x7f, 0x60, 0x77, 0xcf, 0xcb, 0x3c, 0xd7, + 0xb5, 0x6b, 0x0a, 0x00, 0x6f, 0x58, 0xfd, 0x05, 0x00, 0x99, 0xaa, 0x10, + 0x89, 0x43, 0x54, 0x98, 0x95, 0x6b, 0xe4, 0xae, 0xfc, 0xc3, 0x6c, 0x3f, + 0xfa, 0x33, 0x96, 0xce, 0xed, 0x02, 0x23, 0x68, 0x62, 0xd8, 0x57, 0x34, + 0xa8, 0x0f, 0x1a, 0x58, 0x9d, 0x7f, 0xa2, 0xa2, 0x64, 0xed, 0xed, 0x9b, + 0x39, 0xf8, 0xd9, 0x0e, 0x8e, 0x8d, 0xbc, 0x4f, 0xcf, 0xc8, 0x01, 0x16, + 0x37, 0xad, 0x4a, 0xf5, 0x02, 0x28, 0x8f, 0x20, 0x16, 0x87, 0x38, 0x41, + 0xa6, 0x02, 0x40, 0xbc, 0x6b, 0x1a, 0xea, 0x9a, 0x38, 0x7e, 0xe9, 0x03, + 0x3a, 0xdb, 0x1e, 0x44, 0x04, 0x1e, 0x59, 0xfa, 0xe2, 0xb4, 0x1d, 0xb1, + 0x6d, 0xf6, 0x12, 0x56, 0xb5, 0x6f, 0xe0, 0xc0, 0xe0, 0x76, 0xde, 0x3e, + 0xbd, 0x95, 0x4d, 0x77, 0xee, 0xac, 0xaa, 0x35, 0x82, 0x96, 0xfb, 0xa0, + 0x03, 0x71, 0x2e, 0xe3, 0x01, 0x4d, 0x75, 0x0d, 0x44, 0x60, 0x78, 0xa2, + 0x9f, 0x9d, 0xff, 0x7e, 0x99, 0x5d, 0x27, 0xb6, 0xb0, 0xbb, 0x67, 0xeb, + 0x8c, 0x47, 0xb3, 0x35, 0x0b, 0x9f, 0xc7, 0x04, 0x86, 0xe3, 0x97, 0xbd, + 0x17, 0xaa, 0x1e, 0x10, 0x1f, 0xc2, 0x44, 0x7f, 0x6a, 0xe4, 0xbc, 0x1e, + 0xc0, 0x25, 0xb1, 0xbe, 0x4e, 0x78, 0x86, 0xab, 0x6d, 0xf6, 0x12, 0xba, + 0x5a, 0xbf, 0x8d, 0xaa, 0xf0, 0xc7, 0x4f, 0xb7, 0xa6, 0x9a, 0x51, 0x6a, + 0x27, 0xfa, 0xa7, 0xbc, 0x03, 0xb8, 0xd4, 0x4c, 0x5f, 0x79, 0xe3, 0xf3, + 0x4d, 0xc0, 0x1b, 0x16, 0xbd, 0xc4, 0xd7, 0xe6, 0x65, 0x27, 0x22, 0x3f, + 0x8b, 0x94, 0x75, 0x25, 0x36, 0x52, 0x7f, 0x66, 0x54, 0xc4, 0x77, 0x1c, + 0x27, 0x16, 0x51, 0xcd, 0x10, 0xaf, 0x29, 0x6c, 0x9a, 0xb1, 0x71, 0x87, + 0xe3, 0xcf, 0xfd, 0xaf, 0xd1, 0x7d, 0xe2, 0x47, 0x9c, 0x19, 0x3b, 0x0c, + 0xc0, 0x3b, 0xbd, 0xbf, 0xf4, 0x99, 0x93, 0xf1, 0x82, 0xe2, 0xc4, 0x96, + 0x1b, 0xa0, 0x09, 0x80, 0x3a, 0xe0, 0xe2, 0xf0, 0x85, 0xb1, 0x79, 0x2d, + 0xad, 0x4d, 0x95, 0xaa, 0x75, 0x6b, 0xfd, 0x3c, 0x44, 0x84, 0x5d, 0x27, + 0x5f, 0x02, 0x95, 0x8a, 0x22, 0x2d, 0x87, 0x28, 0x49, 0x4d, 0x00, 0x67, + 0xe1, 0xd2, 0xc4, 0xa7, 0x1c, 0x19, 0xda, 0x4b, 0x73, 0x5d, 0x9e, 0xc8, + 0x95, 0x78, 0xf3, 0xf8, 0xb3, 0x7c, 0x78, 0x6e, 0x37, 0x8d, 0x61, 0x0b, + 0xd6, 0x38, 0x6c, 0x5c, 0xdd, 0x43, 0xe7, 0xc7, 0x70, 0x70, 0x09, 0xc8, + 0x09, 0xd0, 0xd4, 0xde, 0xa5, 0xaf, 0xe4, 0xef, 0xd1, 0xc7, 0x4c, 0x48, + 0x03, 0x37, 0x61, 0xc5, 0x25, 0xae, 0x9e, 0xd9, 0x67, 0x7f, 0x37, 0x70, + 0xc8, 0x6e, 0x92, 0xc4, 0x03, 0x05, 0xa0, 0x23, 0xdb, 0x9e, 0xff, 0xaf, + 0x2b, 0x02, 0xfa, 0x81, 0x93, 0x92, 0x64, 0x42, 0x98, 0x6c, 0xb9, 0x49, + 0x00, 0x0e, 0x28, 0x01, 0xa5, 0xff, 0x00, 0x58, 0x97, 0x10, 0x38, 0x29, + 0xb1, 0x19, 0xa6, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, + 0x42, 0x60, 0x82 +}; +unsigned int system_log_out_png_len = 1707; +unsigned char view_fullscreen_png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, + 0x08, 0x03, 0x00, 0x00, 0x00, 0x44, 0xa4, 0x8a, 0xc6, 0x00, 0x00, 0x00, + 0x03, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0xdb, 0xe1, 0x4f, 0xe0, + 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0d, 0xd7, + 0x00, 0x00, 0x0d, 0xd7, 0x01, 0x42, 0x28, 0x9b, 0x78, 0x00, 0x00, 0x00, + 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, + 0x65, 0x00, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x6b, 0x73, 0x63, 0x61, + 0x70, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x9b, 0xee, 0x3c, 0x1a, 0x00, 0x00, + 0x00, 0x13, 0x74, 0x45, 0x58, 0x74, 0x54, 0x69, 0x74, 0x6c, 0x65, 0x00, + 0x4f, 0x70, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x44, 0x72, 0x69, 0x76, + 0x65, 0x3e, 0x67, 0xba, 0x0c, 0x00, 0x00, 0x01, 0x32, 0x50, 0x4c, 0x54, + 0x45, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1f, 0x4b, 0x88, 0x20, 0x4b, 0x88, 0x1f, 0x4b, 0x88, 0x83, 0x86, + 0x80, 0x21, 0x49, 0x86, 0x20, 0x4a, 0x87, 0x20, 0x4a, 0x87, 0x21, 0x4b, + 0x88, 0x20, 0x4a, 0x87, 0x1f, 0x4a, 0x86, 0x21, 0x4b, 0x88, 0x23, 0x4c, + 0x88, 0x20, 0x4a, 0x87, 0x21, 0x4b, 0x88, 0x8e, 0x90, 0x8b, 0x8d, 0x8f, + 0x8b, 0x28, 0x52, 0x8d, 0x2b, 0x54, 0x8e, 0x2d, 0x56, 0x90, 0x2e, 0x57, + 0x90, 0x30, 0x58, 0x91, 0x30, 0x59, 0x92, 0x37, 0x5e, 0x95, 0x27, 0x52, + 0x8e, 0x2f, 0x57, 0x92, 0x5f, 0x8b, 0xbe, 0x60, 0x8b, 0xbe, 0x60, 0x8d, + 0xbf, 0x61, 0x8d, 0xbf, 0x62, 0x8d, 0xbf, 0x63, 0x8c, 0xbd, 0x64, 0x8d, + 0xbd, 0x65, 0x92, 0xc4, 0x66, 0x92, 0xc4, 0x66, 0x93, 0xc4, 0x67, 0x8f, + 0xbe, 0x6e, 0x98, 0xc7, 0x6f, 0x97, 0xc5, 0x71, 0x9a, 0xc6, 0x74, 0xa1, + 0xd0, 0x7b, 0x9d, 0xc7, 0x80, 0xa5, 0xce, 0x87, 0xad, 0xd6, 0x88, 0x8a, + 0x85, 0x8d, 0xab, 0xcf, 0x8d, 0xb1, 0xd8, 0x94, 0xb2, 0xd4, 0x95, 0xb1, + 0xd2, 0x95, 0xb3, 0xd4, 0x95, 0xb6, 0xdb, 0x95, 0xb7, 0xdb, 0x96, 0xb3, + 0xd5, 0x97, 0xb8, 0xdc, 0x98, 0xb4, 0xd4, 0x99, 0xba, 0xdc, 0x9b, 0xb8, + 0xd7, 0x9b, 0xb9, 0xd9, 0x9c, 0xb9, 0xda, 0x9c, 0xbc, 0xdd, 0x9d, 0xb8, + 0xd7, 0x9e, 0xb9, 0xd8, 0x9e, 0xbd, 0xde, 0x9f, 0xba, 0xd9, 0x9f, 0xbe, + 0xde, 0xa0, 0xbb, 0xda, 0xa1, 0xbd, 0xdb, 0xa3, 0xbd, 0xdc, 0xa4, 0xbf, + 0xdc, 0xa6, 0xbf, 0xdc, 0xbc, 0xc0, 0xb8, 0xc3, 0xc7, 0xbf, 0xc7, 0xcb, + 0xc3, 0xc8, 0xcc, 0xc4, 0xd3, 0xd7, 0xcf, 0xd4, 0xd7, 0xd2, 0xd7, 0xd9, + 0xd4, 0xd8, 0xd9, 0xd7, 0xd8, 0xdc, 0xd6, 0xda, 0xde, 0xd7, 0xde, 0xe1, + 0xdc, 0xe4, 0xe5, 0xe2, 0xe5, 0xe8, 0xe2, 0xe6, 0xe8, 0xe5, 0xeb, 0xec, + 0xe9, 0xed, 0xee, 0xeb, 0xee, 0xf0, 0xec, 0xf0, 0xf1, 0xee, 0xf2, 0xf3, + 0xf1, 0xf3, 0xf4, 0xf2, 0xf4, 0xf5, 0xf2, 0xf5, 0xf5, 0xf3, 0xf6, 0xf6, + 0xf5, 0xfb, 0xfc, 0xfb, 0xff, 0xff, 0xff, 0x5f, 0x88, 0xd4, 0x90, 0x00, + 0x00, 0x00, 0x21, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x01, 0x02, 0x04, 0x09, + 0x0b, 0x1f, 0x28, 0x3a, 0x47, 0x4b, 0x4c, 0x54, 0x59, 0xc1, 0xc1, 0xc2, + 0xcb, 0xcb, 0xcc, 0xd9, 0xd9, 0xe3, 0xe4, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, + 0xfb, 0xfb, 0xfc, 0xfc, 0x3d, 0xd3, 0x0b, 0xcf, 0x00, 0x00, 0x01, 0x4c, + 0x49, 0x44, 0x41, 0x54, 0x38, 0xcb, 0xb5, 0xd3, 0xd9, 0x52, 0xc2, 0x30, + 0x14, 0x80, 0xe1, 0x00, 0x05, 0x9b, 0x50, 0x6a, 0xaa, 0x15, 0x22, 0x8b, + 0x45, 0x71, 0xa9, 0xe2, 0x5e, 0x37, 0x10, 0x51, 0x70, 0x03, 0x51, 0x14, + 0x17, 0xdc, 0x01, 0x41, 0xdf, 0xff, 0x15, 0x3c, 0x65, 0xa6, 0xd2, 0x76, + 0x9a, 0xde, 0xf9, 0xdf, 0x9e, 0xef, 0x22, 0x93, 0x9c, 0x20, 0xe4, 0x2c, + 0x16, 0x43, 0xbe, 0x49, 0xd9, 0xac, 0xe4, 0x3b, 0x4f, 0xd5, 0xeb, 0x29, + 0x1f, 0x81, 0x93, 0xb5, 0x72, 0xb9, 0x96, 0x24, 0x5c, 0x20, 0xef, 0x55, + 0x75, 0xbd, 0x7a, 0xa0, 0x72, 0x81, 0xb2, 0x34, 0xcf, 0xd8, 0xdc, 0x22, + 0xe5, 0x02, 0x91, 0xaa, 0x04, 0xcb, 0x8a, 0x88, 0xfe, 0xa5, 0x40, 0x34, + 0x6e, 0xd8, 0x8a, 0x47, 0x03, 0x2e, 0x10, 0x4a, 0x3c, 0x7e, 0x5b, 0xb5, + 0xdb, 0xed, 0xa7, 0x44, 0xc8, 0x05, 0x04, 0xe3, 0xab, 0x63, 0x75, 0xf7, + 0xf1, 0xfe, 0x60, 0x08, 0xa3, 0x19, 0x99, 0xa2, 0x22, 0x0a, 0x1b, 0x9f, + 0xaf, 0x56, 0x37, 0x6f, 0x2f, 0xf7, 0x46, 0x18, 0x89, 0x13, 0x32, 0x1e, + 0x5e, 0x6f, 0xfa, 0x62, 0x47, 0x01, 0xd0, 0x69, 0x59, 0xdd, 0x36, 0x9b, + 0xcf, 0x00, 0xe8, 0xd1, 0xe1, 0xb4, 0x64, 0xce, 0x1b, 0x85, 0x35, 0x19, + 0x40, 0xb7, 0xf5, 0xf3, 0x57, 0xab, 0x0b, 0x40, 0x5d, 0xbf, 0x3c, 0x01, + 0xa1, 0xd5, 0x0b, 0x2b, 0x0c, 0x03, 0xe8, 0xd9, 0x41, 0x0f, 0x00, 0x61, + 0xcb, 0xe7, 0x15, 0x0d, 0x69, 0xab, 0xdb, 0x57, 0x69, 0x02, 0xa0, 0x6f, + 0x07, 0x7d, 0x00, 0x78, 0xa6, 0xb2, 0xb1, 0xa5, 0x21, 0x89, 0xe9, 0xc5, + 0x63, 0x15, 0xc0, 0xc0, 0x0e, 0x06, 0x00, 0xc6, 0xaf, 0x77, 0x75, 0x66, + 0x1e, 0x82, 0x2d, 0xec, 0x53, 0x2f, 0x30, 0xb9, 0x99, 0x63, 0xc3, 0xdd, + 0x18, 0x3e, 0x8f, 0x07, 0x30, 0x9f, 0x6e, 0x74, 0x19, 0x26, 0xb0, 0x65, + 0x02, 0x67, 0x00, 0x1c, 0x79, 0x00, 0x57, 0x6e, 0x20, 0x44, 0xc6, 0x1c, + 0x45, 0x04, 0x17, 0x08, 0x0a, 0x61, 0x47, 0x42, 0xd0, 0x73, 0xe5, 0x14, + 0x19, 0x13, 0x95, 0xf2, 0x57, 0x8e, 0xe6, 0x4f, 0x33, 0x99, 0xb3, 0xbc, + 0xc2, 0x05, 0x6a, 0xae, 0xd4, 0x68, 0x94, 0x66, 0x65, 0x2e, 0x20, 0x70, + 0xed, 0x45, 0x9d, 0x61, 0xfe, 0x66, 0xc2, 0xc3, 0xe8, 0xcc, 0xff, 0x73, + 0x6a, 0x9a, 0xef, 0xdc, 0xe3, 0xfb, 0xff, 0x02, 0xf8, 0xf6, 0x5e, 0x2b, + 0xe6, 0xa3, 0xa7, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, + 0xae, 0x42, 0x60, 0x82 +}; +unsigned int view_fullscreen_png_len = 856; +unsigned char view_restore_png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, + 0x08, 0x03, 0x00, 0x00, 0x00, 0x44, 0xa4, 0x8a, 0xc6, 0x00, 0x00, 0x00, + 0x03, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0xdb, 0xe1, 0x4f, 0xe0, + 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0d, 0xd7, + 0x00, 0x00, 0x0d, 0xd7, 0x01, 0x42, 0x28, 0x9b, 0x78, 0x00, 0x00, 0x00, + 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, + 0x65, 0x00, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x6b, 0x73, 0x63, 0x61, + 0x70, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x9b, 0xee, 0x3c, 0x1a, 0x00, 0x00, + 0x00, 0x13, 0x74, 0x45, 0x58, 0x74, 0x54, 0x69, 0x74, 0x6c, 0x65, 0x00, + 0x4f, 0x70, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x44, 0x72, 0x69, 0x76, + 0x65, 0x3e, 0x67, 0xba, 0x0c, 0x00, 0x00, 0x01, 0x05, 0x50, 0x4c, 0x54, + 0x45, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x55, 0x8e, 0x00, 0x00, 0x00, 0x24, 0x49, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x49, 0x86, 0x00, 0x00, + 0x00, 0x2f, 0x5e, 0x92, 0x1e, 0x4b, 0x87, 0x1f, 0x4b, 0x88, 0x1f, 0x4b, + 0x88, 0x83, 0x86, 0x80, 0x21, 0x49, 0x87, 0x41, 0x6a, 0xa2, 0x5d, 0x84, + 0xb5, 0x21, 0x4a, 0x88, 0x20, 0x4a, 0x88, 0x4e, 0x75, 0xa8, 0x20, 0x4a, + 0x87, 0x23, 0x4d, 0x88, 0x20, 0x4a, 0x87, 0x22, 0x4d, 0x88, 0x24, 0x4e, + 0x89, 0x7d, 0xa1, 0xcb, 0x20, 0x4a, 0x87, 0x4a, 0x71, 0xa4, 0x8e, 0x90, + 0x8b, 0x8d, 0x8f, 0x8b, 0x99, 0xba, 0xda, 0x98, 0xb8, 0xda, 0x20, 0x4a, + 0x87, 0x44, 0x6b, 0xa0, 0x72, 0x9f, 0xcf, 0x79, 0xa4, 0xd1, 0x7b, 0x9e, + 0xc6, 0x82, 0x84, 0x7f, 0x83, 0xa5, 0xca, 0x86, 0xad, 0xd6, 0x87, 0xa8, + 0xcd, 0x88, 0x8a, 0x85, 0x89, 0xaa, 0xce, 0x97, 0xb7, 0xd9, 0x99, 0x9b, + 0x97, 0x9a, 0x9c, 0x98, 0xa2, 0xbf, 0xdf, 0xaa, 0xc5, 0xe2, 0xbc, 0xc0, + 0xb8, 0xc3, 0xc7, 0xbf, 0xc7, 0xcb, 0xc3, 0xc8, 0xcc, 0xc4, 0xca, 0xce, + 0xc6, 0xd3, 0xd7, 0xcf, 0xd4, 0xd7, 0xd2, 0xd7, 0xd9, 0xd4, 0xd8, 0xd9, + 0xd7, 0xd8, 0xdc, 0xd6, 0xda, 0xdb, 0xd9, 0xda, 0xde, 0xd7, 0xde, 0xe1, + 0xdc, 0xe4, 0xe5, 0xe2, 0xe5, 0xe8, 0xe2, 0xe6, 0xe8, 0xe5, 0xeb, 0xeb, + 0xea, 0xeb, 0xec, 0xe9, 0xed, 0xee, 0xeb, 0xee, 0xf0, 0xec, 0xf0, 0xf1, + 0xee, 0xf2, 0xf3, 0xf1, 0xf3, 0xf4, 0xf2, 0xf4, 0xf4, 0xf4, 0xf4, 0xf5, + 0xf2, 0xf5, 0xf5, 0xf3, 0xf6, 0xf6, 0xf5, 0xf6, 0xf6, 0xf6, 0xfb, 0xfb, + 0xfb, 0xfb, 0xfc, 0xfb, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0x87, 0x5f, + 0x5e, 0x82, 0x00, 0x00, 0x00, 0x27, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x01, + 0x01, 0x02, 0x02, 0x02, 0x04, 0x09, 0x09, 0x0b, 0x0e, 0x16, 0x1f, 0x28, + 0x2a, 0x31, 0x31, 0x33, 0x3a, 0x4b, 0x4c, 0x6c, 0x76, 0x7c, 0x8d, 0x9e, + 0xb0, 0xbd, 0xbe, 0xc5, 0xca, 0xcb, 0xd4, 0xd7, 0xd8, 0xe3, 0xe4, 0xfa, + 0xfd, 0x37, 0xdc, 0x9b, 0x18, 0x00, 0x00, 0x01, 0x1a, 0x49, 0x44, 0x41, + 0x54, 0x38, 0xcb, 0xad, 0xd0, 0x69, 0x57, 0x82, 0x40, 0x14, 0xc6, 0xf1, + 0x41, 0xa5, 0x89, 0x72, 0x37, 0x4d, 0x2c, 0x2b, 0x6d, 0x19, 0x6c, 0x9d, + 0x2c, 0xc9, 0x8a, 0xb2, 0xb0, 0x5d, 0x29, 0x68, 0xe1, 0xfb, 0x7f, 0x94, + 0xee, 0xc9, 0x83, 0xe7, 0x0e, 0x0c, 0xf3, 0xaa, 0xff, 0xdb, 0xfb, 0x3b, + 0xc3, 0x73, 0x20, 0x44, 0xd5, 0xa2, 0xf2, 0x4a, 0xb4, 0x62, 0x79, 0x49, + 0x75, 0xcf, 0xd4, 0x1a, 0xab, 0x65, 0xc5, 0x1b, 0xb9, 0x7a, 0x6b, 0xab, + 0x51, 0x94, 0x9e, 0x2a, 0x9b, 0x6b, 0x55, 0xa2, 0x37, 0xbb, 0xbb, 0xad, + 0x9a, 0x26, 0x05, 0x9d, 0xd3, 0x83, 0xb6, 0x6e, 0x5a, 0x7b, 0xdd, 0x7a, + 0x46, 0xfe, 0x38, 0xb3, 0xf7, 0x99, 0x69, 0xf5, 0xad, 0x66, 0x8e, 0xa4, + 0x81, 0x1e, 0x83, 0xbb, 0xa9, 0x93, 0x74, 0x90, 0xbc, 0x6b, 0x2b, 0xdb, + 0x3c, 0x0a, 0x40, 0xdf, 0x62, 0xac, 0x53, 0xc1, 0x60, 0x61, 0x67, 0xf4, + 0x1d, 0x05, 0x60, 0x60, 0xdb, 0xf6, 0xc9, 0x06, 0x06, 0x94, 0x7f, 0x4c, + 0xa2, 0xd8, 0xa0, 0x07, 0x1d, 0x1f, 0xad, 0x63, 0x60, 0xf0, 0xb7, 0xc7, + 0x28, 0x36, 0xab, 0x5d, 0x15, 0xc1, 0xc4, 0x89, 0xba, 0x1c, 0x0e, 0xc7, + 0xdc, 0x90, 0xce, 0x83, 0xce, 0xef, 0x7f, 0xc2, 0xd0, 0x99, 0x22, 0x80, + 0xe7, 0xb9, 0xae, 0x7b, 0x77, 0xf6, 0x05, 0xc0, 0x43, 0x00, 0xcf, 0xbb, + 0x7a, 0x7d, 0xb9, 0xe5, 0x9f, 0x00, 0x7c, 0x04, 0xf0, 0xbc, 0x8b, 0xa7, + 0x87, 0x1b, 0xfe, 0x0e, 0x20, 0x10, 0x40, 0x6c, 0x5e, 0x12, 0x4c, 0x9d, + 0x70, 0x1e, 0xcc, 0x4b, 0x02, 0x0f, 0x03, 0x8f, 0x5f, 0xc3, 0x53, 0x22, + 0xf0, 0x31, 0xf0, 0xf9, 0x73, 0x00, 0x09, 0x20, 0xc0, 0x20, 0xe0, 0x87, + 0x7f, 0xff, 0x43, 0x01, 0x4a, 0x05, 0x28, 0x4f, 0xd3, 0xc1, 0xb2, 0x01, + 0xd1, 0xac, 0x00, 0x50, 0xf8, 0xeb, 0x73, 0x20, 0x24, 0x01, 0xb1, 0xe2, + 0x80, 0xe6, 0x0b, 0x42, 0x68, 0xde, 0xac, 0x2c, 0x35, 0x84, 0xd0, 0xbc, + 0xff, 0xe9, 0x17, 0x84, 0x12, 0x69, 0x8d, 0xe3, 0xb2, 0x09, 0xe5, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 +}; +unsigned int view_restore_png_len = 767; +unsigned char zoom_in_png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, + 0x08, 0x06, 0x00, 0x00, 0x00, 0x73, 0x7a, 0x7a, 0xf4, 0x00, 0x00, 0x00, + 0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64, + 0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0d, + 0xd7, 0x00, 0x00, 0x0d, 0xd7, 0x01, 0x42, 0x28, 0x9b, 0x78, 0x00, 0x00, + 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, + 0x72, 0x65, 0x00, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x6b, 0x73, 0x63, + 0x61, 0x70, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x9b, 0xee, 0x3c, 0x1a, 0x00, + 0x00, 0x00, 0x0a, 0x74, 0x45, 0x58, 0x74, 0x54, 0x69, 0x74, 0x6c, 0x65, + 0x00, 0x5a, 0x6f, 0x6f, 0x6d, 0xbc, 0x01, 0x55, 0x2b, 0x00, 0x00, 0x00, + 0x26, 0x74, 0x45, 0x58, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x00, + 0x4a, 0x61, 0x6b, 0x75, 0x62, 0x20, 0x53, 0x74, 0x65, 0x69, 0x6e, 0x65, + 0x72, 0x2c, 0x20, 0x4c, 0x61, 0x70, 0x6f, 0x20, 0x43, 0x61, 0x6c, 0x61, + 0x6d, 0x61, 0x6e, 0x64, 0x72, 0x65, 0x69, 0x14, 0x54, 0xf1, 0xa7, 0x00, + 0x00, 0x04, 0x08, 0x49, 0x44, 0x41, 0x54, 0x58, 0x85, 0xed, 0x97, 0x5d, + 0x68, 0x1d, 0x45, 0x14, 0xc7, 0xff, 0xf3, 0xb1, 0x9b, 0x64, 0x27, 0xb9, + 0xa8, 0xb5, 0xa5, 0x2d, 0x4a, 0xee, 0x83, 0x4f, 0xd6, 0x52, 0x41, 0x10, + 0xb5, 0x9a, 0xb4, 0x10, 0x49, 0x11, 0x44, 0x29, 0x41, 0x7d, 0xb0, 0x36, + 0x3e, 0x14, 0x1f, 0xfa, 0xe6, 0x8b, 0x4b, 0xb4, 0x62, 0x4b, 0xd4, 0x88, + 0x88, 0x0f, 0xa2, 0x20, 0x62, 0x5b, 0x63, 0x5a, 0xb5, 0x86, 0x48, 0x51, + 0x44, 0x90, 0x52, 0x04, 0xab, 0xe0, 0x43, 0xc1, 0x22, 0x7d, 0xb1, 0x94, + 0x9b, 0x9a, 0x60, 0x5b, 0xad, 0x1f, 0x69, 0x9a, 0xde, 0xd9, 0x3b, 0x33, + 0xc7, 0x87, 0xbb, 0xbb, 0xbd, 0x7b, 0xef, 0xae, 0xde, 0x1b, 0xc1, 0xbc, + 0x78, 0x60, 0xd9, 0xdd, 0xb3, 0x73, 0xce, 0xfc, 0xe6, 0x9c, 0x99, 0x33, + 0xb3, 0x2c, 0x0c, 0x43, 0xac, 0xa4, 0xf0, 0x15, 0xed, 0xfd, 0x7f, 0x00, + 0x00, 0xb2, 0xe8, 0xc3, 0x96, 0xe1, 0x2d, 0xb7, 0x78, 0x8c, 0xbd, 0x0c, + 0xc6, 0xee, 0x74, 0xd6, 0xae, 0x03, 0xc0, 0x3a, 0xf0, 0x4b, 0x82, 0xf3, + 0x79, 0x47, 0x38, 0x41, 0x26, 0x1a, 0x3b, 0x76, 0xec, 0xc4, 0xb9, 0x8e, + 0x00, 0x86, 0x86, 0xb7, 0xee, 0xf4, 0x3c, 0xef, 0xcd, 0x8d, 0x1b, 0x36, + 0x05, 0x7d, 0xbd, 0x7d, 0x4c, 0x88, 0x42, 0xce, 0x42, 0x31, 0xc6, 0x94, + 0xff, 0x5c, 0xf8, 0xa3, 0xff, 0x87, 0xd3, 0xa7, 0x1e, 0xbe, 0x7f, 0xdb, + 0xe0, 0x8e, 0x2f, 0xbf, 0xf8, 0xea, 0x93, 0xbc, 0x76, 0x2d, 0x29, 0x18, + 0x1a, 0x1a, 0xb8, 0xb5, 0xab, 0xcb, 0x7b, 0xeb, 0xbe, 0x7b, 0x06, 0xd5, + 0xf5, 0xd7, 0xdd, 0xb0, 0xac, 0xce, 0x01, 0x40, 0x4a, 0x89, 0x1b, 0x57, + 0xad, 0x66, 0x03, 0x9b, 0xb7, 0x2a, 0x21, 0xbc, 0xf7, 0x07, 0x86, 0x07, + 0x6e, 0x6a, 0x0b, 0x40, 0x48, 0x39, 0xb1, 0xe9, 0xb6, 0x3b, 0x7a, 0x88, + 0x00, 0x63, 0x0c, 0xac, 0xb5, 0xcb, 0xbe, 0x8c, 0x31, 0x00, 0x80, 0x8d, + 0x1b, 0x6e, 0xef, 0xe9, 0x66, 0x62, 0x6f, 0x2e, 0x68, 0xb3, 0xc2, 0x81, + 0xee, 0x0a, 0x94, 0x62, 0xd6, 0x5a, 0x10, 0xd1, 0xb2, 0x46, 0xdf, 0x28, + 0x44, 0x84, 0xbe, 0xde, 0x12, 0x67, 0x9c, 0x6f, 0x6e, 0x0b, 0xc0, 0x5a, + 0xbb, 0x9a, 0x33, 0x8e, 0xc8, 0x44, 0xb9, 0x0e, 0x19, 0x63, 0x78, 0x62, + 0xf4, 0xf1, 0x16, 0xfd, 0xe4, 0xc1, 0xa9, 0x5c, 0x60, 0xc6, 0x18, 0x7c, + 0xdf, 0x87, 0x35, 0xf6, 0xe6, 0xb6, 0x00, 0x12, 0x6a, 0x6b, 0x6d, 0x21, + 0x00, 0x00, 0x1c, 0xf9, 0x70, 0x3a, 0xd5, 0x3d, 0xf2, 0xd8, 0x08, 0x8a, + 0x22, 0xc6, 0x18, 0x03, 0x11, 0x81, 0x0a, 0x96, 0x7c, 0xe1, 0x0c, 0x73, + 0xce, 0xe5, 0xea, 0x39, 0xe7, 0x90, 0x32, 0x6b, 0x26, 0xa5, 0x04, 0x11, + 0xe5, 0xda, 0xd4, 0x81, 0x8b, 0x53, 0xd9, 0x02, 0x50, 0xab, 0xd5, 0x62, + 0x67, 0x36, 0x75, 0xde, 0x18, 0x0d, 0x6b, 0x1d, 0x94, 0x52, 0x19, 0x1b, + 0xa5, 0x14, 0xac, 0x35, 0x19, 0x9d, 0x10, 0x02, 0xc6, 0x98, 0x34, 0x02, + 0xa6, 0x56, 0x6b, 0x0f, 0x40, 0xeb, 0x28, 0x03, 0x40, 0x24, 0xf0, 0xfc, + 0x0b, 0x7b, 0x32, 0xa3, 0x2e, 0x95, 0x4a, 0x19, 0x9b, 0x52, 0xa9, 0x84, + 0x7d, 0xe3, 0xd7, 0x26, 0xb9, 0x31, 0x06, 0xe3, 0xfb, 0x5e, 0x84, 0x73, + 0x36, 0x05, 0xd0, 0x91, 0x6e, 0x0f, 0x20, 0xd2, 0xba, 0x4e, 0x1c, 0x2f, + 0x21, 0x29, 0x25, 0x94, 0x0a, 0xf0, 0xd2, 0xf8, 0x2b, 0xb9, 0x0e, 0x00, + 0xe0, 0xb5, 0x57, 0x5f, 0xcf, 0xbc, 0x8f, 0x3d, 0xf7, 0x0c, 0x88, 0x5c, + 0x1a, 0x01, 0xe7, 0x1c, 0x74, 0xb5, 0x4d, 0x00, 0x1d, 0x45, 0x70, 0xe4, + 0x60, 0x6c, 0x12, 0x01, 0x20, 0x08, 0x82, 0xc2, 0xce, 0xf3, 0x24, 0x08, + 0x02, 0x10, 0x01, 0xc6, 0xda, 0x18, 0x80, 0xa0, 0xa3, 0xb6, 0x53, 0xa0, + 0x41, 0xce, 0xa5, 0x11, 0x20, 0x22, 0x04, 0x2a, 0x80, 0x69, 0xca, 0xb1, + 0x6c, 0xa8, 0x90, 0xcd, 0xdf, 0x02, 0x15, 0xa4, 0x51, 0xac, 0x03, 0x58, + 0x44, 0x9d, 0xa4, 0xc0, 0x35, 0x00, 0x00, 0x40, 0xa9, 0xaf, 0x0f, 0x07, + 0x0e, 0xbe, 0x93, 0xbe, 0x3b, 0xe7, 0xf0, 0xd4, 0xae, 0xdd, 0xe9, 0xfb, + 0xbb, 0xfb, 0xdf, 0x06, 0xe7, 0x3c, 0xd3, 0x1e, 0x40, 0x0c, 0xc0, 0xe1, + 0x9c, 0x43, 0xa4, 0x3b, 0x48, 0x81, 0x6d, 0x02, 0x18, 0xd9, 0xfe, 0x68, + 0xa6, 0xcd, 0xa7, 0x9f, 0x1f, 0x6d, 0x1a, 0xb1, 0xc2, 0x83, 0x0f, 0x3c, + 0xd4, 0xe2, 0xdc, 0x18, 0x03, 0xce, 0x39, 0xac, 0x73, 0xa8, 0xb6, 0x1b, + 0x01, 0xad, 0x35, 0x18, 0x00, 0x21, 0xea, 0x23, 0xba, 0xf4, 0xdb, 0xaf, + 0x99, 0xef, 0x6b, 0xd6, 0xac, 0x6d, 0x99, 0x13, 0x41, 0x10, 0x40, 0x48, + 0x89, 0x8b, 0x17, 0xcf, 0x67, 0xf4, 0x42, 0xf0, 0xb4, 0x70, 0x45, 0x3a, + 0xbf, 0xb2, 0xe6, 0xa4, 0x20, 0x8a, 0x8d, 0x45, 0xae, 0x81, 0x10, 0x02, + 0x4a, 0x05, 0xa8, 0x99, 0x6b, 0x93, 0x4a, 0xa9, 0x00, 0x42, 0x88, 0x5c, + 0x9b, 0x8e, 0x01, 0xb4, 0xd6, 0x00, 0x63, 0x28, 0xda, 0x86, 0x19, 0x63, + 0xf0, 0x3c, 0x0f, 0x5f, 0x7f, 0x73, 0x3c, 0xd5, 0x79, 0x9e, 0x07, 0x56, + 0x60, 0x93, 0x54, 0xc2, 0x28, 0xaa, 0xe5, 0x96, 0xd6, 0xd6, 0xdd, 0x90, + 0xe8, 0x92, 0xae, 0x56, 0x57, 0xf9, 0xbe, 0x9f, 0x5b, 0x5a, 0x39, 0x63, + 0xb8, 0xf7, 0xee, 0xc1, 0xfc, 0xd1, 0xc8, 0x56, 0x00, 0x21, 0x04, 0x96, + 0xae, 0x2c, 0x81, 0xc8, 0xcd, 0xb7, 0x05, 0x60, 0x4c, 0xed, 0xbb, 0xb9, + 0xf9, 0xf9, 0x6d, 0xe5, 0xfe, 0x7e, 0x16, 0x45, 0xad, 0x61, 0x5b, 0x58, + 0x58, 0xc8, 0xed, 0x1c, 0xc8, 0x2e, 0xcd, 0x44, 0x7c, 0xbf, 0x0b, 0x67, + 0xcf, 0x9e, 0x76, 0x57, 0xab, 0xd5, 0x6f, 0x7d, 0xd1, 0x9d, 0x0f, 0x30, + 0x31, 0x31, 0x91, 0x9c, 0xf7, 0xd8, 0xe8, 0xae, 0xd1, 0xb1, 0x43, 0x87, + 0x26, 0x07, 0xc3, 0xf0, 0xd9, 0xa0, 0xbb, 0xbb, 0x07, 0xc6, 0x9a, 0x65, + 0x9d, 0x0b, 0x18, 0x63, 0x90, 0x52, 0xa2, 0x5a, 0xad, 0xe2, 0xc8, 0xc7, + 0x1f, 0x5d, 0xb9, 0xf0, 0xfb, 0x2f, 0x7b, 0x0f, 0xef, 0x3f, 0xcc, 0x11, + 0xef, 0x4c, 0x61, 0x18, 0x12, 0x50, 0x3f, 0x68, 0x26, 0x97, 0x00, 0xe0, + 0x01, 0xe8, 0x1a, 0x19, 0xd9, 0xbe, 0x7b, 0xed, 0xfa, 0x75, 0x7b, 0x46, + 0x77, 0x3e, 0xe9, 0x97, 0xfb, 0xcb, 0x2d, 0x9b, 0x4f, 0x3b, 0xb2, 0xb8, + 0xb8, 0x88, 0x33, 0x67, 0x7e, 0xa4, 0xc9, 0xa9, 0xf7, 0xa2, 0x0b, 0x3f, + 0x9f, 0x7f, 0x7a, 0x66, 0xe6, 0xe8, 0x14, 0x80, 0x08, 0x40, 0x2d, 0x86, + 0xa0, 0x30, 0x0c, 0x29, 0x89, 0x59, 0x02, 0xd0, 0x05, 0xa0, 0x77, 0x7a, + 0x7a, 0xe6, 0xb3, 0x72, 0xb9, 0x2c, 0xe7, 0xe6, 0x7e, 0xda, 0xa1, 0x94, + 0x5a, 0x6f, 0xad, 0x6d, 0x8d, 0xdd, 0x3f, 0x88, 0x10, 0x72, 0xe9, 0xf2, + 0xe2, 0xe5, 0x73, 0xdf, 0x9f, 0x3c, 0xf5, 0xc6, 0xec, 0xec, 0xec, 0x71, + 0x00, 0x2a, 0xee, 0xd8, 0x01, 0x48, 0x8b, 0x4c, 0x02, 0x40, 0xb1, 0xb2, + 0x1a, 0x37, 0xd0, 0x95, 0x4a, 0xe5, 0x40, 0xa5, 0x52, 0xf9, 0x00, 0x80, + 0x1f, 0xc3, 0x25, 0x91, 0xfa, 0x3b, 0xa1, 0x86, 0xbb, 0x01, 0xa0, 0x63, + 0x9f, 0x57, 0xe3, 0xe7, 0x08, 0x80, 0x6d, 0x68, 0x07, 0x96, 0xfc, 0x1b, + 0x36, 0xce, 0x03, 0xd4, 0x4f, 0x2f, 0x1c, 0xd9, 0x14, 0x75, 0x22, 0xd4, + 0x74, 0xb9, 0x86, 0xe7, 0x34, 0xff, 0x19, 0x80, 0x66, 0x69, 0x00, 0xfa, + 0xd7, 0xd2, 0xd8, 0x61, 0xb3, 0x14, 0x02, 0xfc, 0x57, 0xb2, 0xe2, 0xff, + 0x86, 0x7f, 0x01, 0x48, 0xae, 0x03, 0x1c, 0x3b, 0xb4, 0x54, 0x8d, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 +}; +unsigned int zoom_in_png_len = 1235; +unsigned char zoom_out_png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, + 0x08, 0x06, 0x00, 0x00, 0x00, 0x73, 0x7a, 0x7a, 0xf4, 0x00, 0x00, 0x00, + 0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64, + 0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0d, + 0xd7, 0x00, 0x00, 0x0d, 0xd7, 0x01, 0x42, 0x28, 0x9b, 0x78, 0x00, 0x00, + 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, + 0x72, 0x65, 0x00, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x6b, 0x73, 0x63, + 0x61, 0x70, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x9b, 0xee, 0x3c, 0x1a, 0x00, + 0x00, 0x00, 0x0a, 0x74, 0x45, 0x58, 0x74, 0x54, 0x69, 0x74, 0x6c, 0x65, + 0x00, 0x5a, 0x6f, 0x6f, 0x6d, 0xbc, 0x01, 0x55, 0x2b, 0x00, 0x00, 0x00, + 0x26, 0x74, 0x45, 0x58, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x00, + 0x4a, 0x61, 0x6b, 0x75, 0x62, 0x20, 0x53, 0x74, 0x65, 0x69, 0x6e, 0x65, + 0x72, 0x2c, 0x20, 0x4c, 0x61, 0x70, 0x6f, 0x20, 0x43, 0x61, 0x6c, 0x61, + 0x6d, 0x61, 0x6e, 0x64, 0x72, 0x65, 0x69, 0x14, 0x54, 0xf1, 0xa7, 0x00, + 0x00, 0x03, 0x56, 0x49, 0x44, 0x41, 0x54, 0x58, 0x85, 0xed, 0x97, 0x3b, + 0x68, 0x14, 0x41, 0x18, 0xc7, 0xff, 0xb3, 0x33, 0xb7, 0x77, 0xd9, 0xcd, + 0x05, 0x9f, 0xa0, 0xa2, 0x78, 0x85, 0x95, 0x0f, 0x14, 0x04, 0x11, 0xc5, + 0x44, 0x21, 0x12, 0x4b, 0x91, 0x80, 0x95, 0x18, 0x0b, 0x2b, 0x3b, 0x1b, + 0x97, 0xf8, 0x40, 0xc5, 0x47, 0xac, 0x45, 0x1b, 0xc1, 0xf7, 0x03, 0x1f, + 0x44, 0x04, 0x0b, 0x41, 0x44, 0x2c, 0x44, 0xb0, 0x10, 0x14, 0xb1, 0xd1, + 0xe2, 0x12, 0x13, 0x54, 0x7c, 0x6b, 0x8c, 0x3b, 0x73, 0x33, 0xf3, 0x59, + 0xec, 0xde, 0xb1, 0xb9, 0xdc, 0xc9, 0xde, 0x25, 0x98, 0xc6, 0x3f, 0x0c, + 0xb7, 0xec, 0xce, 0xce, 0xf7, 0xbb, 0xff, 0x37, 0xf3, 0xcd, 0x2c, 0x0b, + 0x82, 0x00, 0x53, 0x29, 0x67, 0x4a, 0xa3, 0xff, 0x07, 0x00, 0x20, 0xea, + 0x3d, 0x58, 0xdf, 0xb5, 0x7e, 0x51, 0x86, 0xb1, 0xe3, 0x60, 0x6c, 0x95, + 0x35, 0x66, 0x2e, 0x00, 0xd6, 0xc0, 0xb8, 0xc4, 0x1d, 0x67, 0xd8, 0x12, + 0x1e, 0x93, 0x56, 0xbd, 0x0f, 0x1e, 0x3c, 0x1e, 0x6c, 0x08, 0xa0, 0xb3, + 0x6b, 0xc3, 0xf6, 0x4c, 0x26, 0x73, 0x6a, 0xd9, 0x92, 0xe5, 0x5e, 0xbe, + 0x35, 0xcf, 0x38, 0xaf, 0xcb, 0x59, 0x57, 0x5a, 0xeb, 0xc2, 0xf7, 0x1f, + 0xdf, 0x16, 0xbe, 0x7c, 0xf5, 0x62, 0xf3, 0xc6, 0x4d, 0x1d, 0xdb, 0xee, + 0xdf, 0x7b, 0x74, 0xbb, 0x56, 0xbf, 0x71, 0x29, 0xe8, 0xec, 0x6c, 0x5f, + 0x9c, 0xcd, 0x66, 0x4e, 0xaf, 0x5b, 0xd3, 0xe1, 0x4f, 0x9f, 0x36, 0xa3, + 0xa9, 0xe0, 0x00, 0x20, 0x84, 0xc0, 0xac, 0x99, 0xb3, 0x59, 0xfb, 0xda, + 0x0d, 0x3e, 0xe7, 0x99, 0x4b, 0xed, 0x5d, 0xed, 0xf3, 0x53, 0x01, 0x70, + 0x21, 0xfa, 0x96, 0x2f, 0x5d, 0xd9, 0x42, 0x04, 0x68, 0xad, 0x61, 0x8c, + 0x69, 0xba, 0x69, 0xad, 0x01, 0x00, 0xcb, 0x96, 0xac, 0x68, 0xc9, 0x31, + 0x7e, 0xa8, 0x26, 0x68, 0xf5, 0x0d, 0x0b, 0x5a, 0xed, 0xf9, 0x3e, 0x33, + 0xc6, 0x80, 0x88, 0x9a, 0xfa, 0xf7, 0x49, 0x11, 0x11, 0xf2, 0xad, 0x6d, + 0x0e, 0x73, 0x9c, 0xb5, 0xa9, 0x00, 0x8c, 0x31, 0xb3, 0x1d, 0xe6, 0x40, + 0x69, 0x35, 0xe1, 0xe0, 0x00, 0xc0, 0x18, 0x83, 0xeb, 0xba, 0x30, 0xda, + 0x2c, 0x48, 0x05, 0x00, 0x44, 0xd4, 0xc6, 0x98, 0x49, 0x03, 0x20, 0x22, + 0x50, 0x9d, 0x25, 0x5f, 0x77, 0x86, 0x59, 0x6b, 0x27, 0x0d, 0x00, 0xa8, + 0x9f, 0xca, 0x71, 0x00, 0xa5, 0x52, 0x09, 0x44, 0x04, 0x6b, 0x23, 0x07, + 0x84, 0x10, 0x4d, 0xb9, 0xc1, 0x39, 0x87, 0xd6, 0xba, 0xe2, 0x80, 0x2e, + 0x95, 0xd2, 0x01, 0x48, 0xa9, 0xc6, 0x00, 0x10, 0x71, 0x1c, 0x38, 0xb8, + 0x1f, 0x42, 0xa4, 0x5f, 0x8e, 0x5a, 0x6b, 0x1c, 0x39, 0x7c, 0x14, 0xd6, + 0x9a, 0x0a, 0x80, 0x54, 0x32, 0x1d, 0x80, 0x92, 0x32, 0x22, 0x8e, 0x97, + 0x90, 0x10, 0x02, 0xbe, 0xef, 0xe1, 0xd8, 0x91, 0x13, 0xa9, 0x01, 0x7a, + 0xf7, 0xed, 0x01, 0x91, 0xad, 0x38, 0x60, 0xad, 0x85, 0x0c, 0x53, 0x02, + 0x48, 0xa5, 0x60, 0xc9, 0x42, 0x9b, 0xb2, 0x03, 0x80, 0xe7, 0x79, 0xa9, + 0x83, 0x03, 0x51, 0x7f, 0x22, 0x40, 0x1b, 0x13, 0x03, 0x10, 0xa4, 0x4a, + 0x9d, 0x02, 0x09, 0xb2, 0xb6, 0xe2, 0x00, 0x11, 0xc1, 0xf3, 0x3d, 0x68, + 0xa3, 0xd3, 0x03, 0xf8, 0x5e, 0xc5, 0xc5, 0x08, 0xc0, 0x40, 0x35, 0x92, + 0x02, 0x9b, 0x00, 0x00, 0x80, 0xb6, 0x7c, 0x1e, 0xe7, 0xce, 0x9f, 0x49, + 0x0d, 0xd0, 0x96, 0xcf, 0x03, 0x40, 0x0c, 0xe0, 0xc0, 0x5a, 0x0b, 0x25, + 0x1b, 0x48, 0x81, 0xa9, 0x02, 0xe8, 0xde, 0xb2, 0x35, 0x75, 0xf0, 0xa4, + 0xb4, 0xd6, 0x70, 0x1c, 0x07, 0xc6, 0x5a, 0x84, 0x69, 0x1d, 0x90, 0x52, + 0x82, 0x01, 0xe0, 0x3c, 0xaa, 0x1b, 0x9f, 0xbf, 0x7c, 0x6a, 0x2a, 0x38, + 0xe2, 0x31, 0xa2, 0x3a, 0x00, 0x28, 0x59, 0xbb, 0xb2, 0xd6, 0x48, 0x81, + 0x8a, 0x5f, 0xe6, 0x4d, 0x07, 0x4e, 0xaa, 0x61, 0x00, 0x29, 0x25, 0xc0, + 0x18, 0x9a, 0xdd, 0x86, 0x6b, 0x03, 0x10, 0x94, 0x2a, 0xd5, 0x2c, 0xad, + 0xe3, 0x77, 0x43, 0xa2, 0xcf, 0x32, 0x0c, 0x67, 0xba, 0xae, 0x3b, 0x29, + 0xe5, 0x98, 0x73, 0x8e, 0xd1, 0x5f, 0xa3, 0x20, 0xb2, 0xc3, 0xb5, 0x9e, + 0x8f, 0xdb, 0x20, 0xb4, 0x2e, 0x3d, 0x1d, 0x1a, 0x1e, 0xa6, 0x5c, 0x36, + 0x07, 0xc1, 0xc5, 0x84, 0x5b, 0xd6, 0xcd, 0x61, 0xf0, 0xed, 0xa0, 0xfd, + 0x1d, 0x86, 0x4f, 0xea, 0x3a, 0xd0, 0xd7, 0xd7, 0x57, 0x3e, 0xef, 0xb1, + 0x9e, 0x9d, 0x3d, 0xbd, 0x57, 0xae, 0x5c, 0xec, 0x08, 0x82, 0xbd, 0x5e, + 0x2e, 0xd7, 0x02, 0x6d, 0x74, 0x53, 0xe7, 0x02, 0xc6, 0x18, 0x84, 0x10, + 0x08, 0xc3, 0x10, 0x37, 0x6e, 0x5e, 0xff, 0xf5, 0xe1, 0xeb, 0xc7, 0x43, + 0x57, 0xcf, 0x5e, 0x75, 0x10, 0xef, 0x4c, 0x41, 0x10, 0x10, 0x10, 0x1d, + 0x34, 0xcb, 0x8d, 0x03, 0xc8, 0x00, 0xc8, 0x76, 0x77, 0x6f, 0xd9, 0x35, + 0x67, 0xde, 0xdc, 0xfd, 0x3d, 0xdb, 0x77, 0xb8, 0x85, 0x85, 0x05, 0xf8, + 0xbe, 0xdf, 0x30, 0xc0, 0xc8, 0xc8, 0x08, 0xde, 0xbc, 0x79, 0x4d, 0x17, + 0x2f, 0x5f, 0x50, 0x1f, 0xde, 0xbd, 0xdf, 0xdd, 0xdf, 0x7f, 0xe7, 0x32, + 0x00, 0x05, 0xa0, 0x14, 0x43, 0x50, 0x10, 0x04, 0x54, 0x9e, 0x03, 0x65, + 0x80, 0x2c, 0x80, 0xd6, 0x5b, 0xb7, 0xfa, 0xef, 0x16, 0x0a, 0x05, 0x31, + 0x34, 0xf4, 0x76, 0x9b, 0xef, 0xfb, 0xf3, 0x8c, 0x31, 0xb9, 0x46, 0x01, + 0x38, 0x17, 0xa3, 0x3f, 0x47, 0x7e, 0x0e, 0x3e, 0x7f, 0xf6, 0xe2, 0xe4, + 0xc0, 0xc0, 0xc0, 0x43, 0x00, 0x7e, 0x1c, 0xd8, 0x02, 0xa8, 0x14, 0x99, + 0x32, 0x00, 0xc5, 0x37, 0xc3, 0xb8, 0x83, 0x2c, 0x16, 0x8b, 0xe7, 0x8a, + 0xc5, 0xe2, 0x35, 0x00, 0x6e, 0x0c, 0x57, 0x76, 0xea, 0x6f, 0xa2, 0xc4, + 0xaf, 0x06, 0x20, 0xe3, 0x31, 0x7f, 0xc7, 0xd7, 0x0a, 0x80, 0x49, 0xf4, + 0x03, 0x2b, 0x7f, 0x1b, 0x26, 0xe7, 0x01, 0xa2, 0xc9, 0xe9, 0x60, 0x6c, + 0x8a, 0x1a, 0x11, 0x55, 0x35, 0x9b, 0xb8, 0xae, 0xe4, 0x7f, 0x0c, 0x40, + 0xb5, 0x12, 0x40, 0x13, 0x56, 0x32, 0x60, 0xb5, 0xea, 0x02, 0xfc, 0x2b, + 0x4d, 0xf9, 0xb7, 0xe1, 0x1f, 0x7a, 0xb2, 0xc9, 0xb4, 0x03, 0xd5, 0xde, + 0x5d, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, + 0x82 +}; +unsigned int zoom_out_png_len = 1057; +unsigned char go_next_png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, + 0x08, 0x06, 0x00, 0x00, 0x00, 0x73, 0x7a, 0x7a, 0xf4, 0x00, 0x00, 0x00, + 0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64, + 0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0d, + 0xd7, 0x00, 0x00, 0x0d, 0xd7, 0x01, 0x42, 0x28, 0x9b, 0x78, 0x00, 0x00, + 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, + 0x72, 0x65, 0x00, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x6b, 0x73, 0x63, + 0x61, 0x70, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x9b, 0xee, 0x3c, 0x1a, 0x00, + 0x00, 0x00, 0x13, 0x74, 0x45, 0x58, 0x74, 0x54, 0x69, 0x74, 0x6c, 0x65, + 0x00, 0x4f, 0x70, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x44, 0x72, 0x69, + 0x76, 0x65, 0x3e, 0x67, 0xba, 0x0c, 0x00, 0x00, 0x06, 0x03, 0x49, 0x44, + 0x41, 0x54, 0x58, 0x85, 0xed, 0x57, 0x6d, 0x6c, 0x14, 0x55, 0x17, 0x7e, + 0xee, 0xcc, 0x74, 0xb6, 0xdd, 0xed, 0x17, 0x4a, 0x30, 0x2d, 0xa8, 0x41, + 0x0d, 0xc6, 0x28, 0x51, 0x11, 0x91, 0x18, 0x35, 0x1b, 0x8d, 0xbe, 0x02, + 0x52, 0x63, 0xaa, 0xa0, 0x62, 0x09, 0x82, 0xb4, 0x36, 0x2a, 0x46, 0x37, + 0x1a, 0x81, 0x42, 0x57, 0x53, 0x35, 0x8a, 0xfb, 0x2a, 0x02, 0x02, 0x5a, + 0xca, 0x52, 0xac, 0x2d, 0xcb, 0x16, 0x94, 0x8f, 0x82, 0x81, 0xd0, 0x06, + 0x83, 0x56, 0x24, 0xd4, 0x68, 0xa5, 0xad, 0xa5, 0x18, 0x30, 0x42, 0x0b, + 0x6d, 0xb7, 0xbb, 0xdb, 0xdd, 0xed, 0xcc, 0xdc, 0x7b, 0x8f, 0x3f, 0x68, + 0x37, 0xad, 0x22, 0x7d, 0xbb, 0xaf, 0x86, 0x3f, 0xde, 0xe4, 0x24, 0x93, + 0x79, 0xe6, 0x3e, 0xe7, 0x99, 0xf3, 0x71, 0xcf, 0x0c, 0x23, 0x22, 0x5c, + 0xca, 0xa5, 0x5c, 0x52, 0xef, 0xff, 0x0a, 0x00, 0xa0, 0x25, 0xba, 0x71, + 0x5f, 0x5d, 0xcd, 0x64, 0x26, 0xd8, 0x42, 0x02, 0x66, 0x0a, 0x29, 0x77, + 0x98, 0x42, 0x7c, 0x94, 0xf3, 0x60, 0xce, 0x0f, 0x23, 0x26, 0x22, 0xa2, + 0x11, 0xdb, 0x9e, 0x03, 0x7b, 0xae, 0xff, 0xf6, 0xbb, 0x43, 0x22, 0x16, + 0x8b, 0x91, 0x94, 0x92, 0xc2, 0xbd, 0x61, 0x3a, 0xf8, 0x55, 0x2d, 0x6d, + 0xad, 0xde, 0xe2, 0x1a, 0x29, 0x57, 0x42, 0x02, 0xf6, 0xee, 0xdf, 0xb5, + 0x31, 0x14, 0x0e, 0x92, 0x94, 0x92, 0x38, 0xe7, 0x24, 0xa5, 0x24, 0x29, + 0x25, 0xd5, 0x1d, 0xdc, 0x4f, 0xe5, 0x9f, 0x95, 0x2d, 0x1e, 0x09, 0x57, + 0x42, 0x35, 0x60, 0x99, 0xd6, 0x03, 0x49, 0x5a, 0x12, 0x38, 0xe7, 0x90, + 0x52, 0x82, 0x73, 0x0e, 0x22, 0xc2, 0x3d, 0x77, 0xdd, 0x8b, 0xac, 0x31, + 0xd9, 0x6f, 0x95, 0x96, 0xad, 0x2b, 0xfe, 0x5f, 0xb9, 0x12, 0x12, 0x60, + 0x5a, 0xd6, 0xae, 0xae, 0xee, 0x6e, 0x10, 0x11, 0xa4, 0x94, 0x90, 0x52, + 0xc2, 0xb2, 0x2c, 0x48, 0x29, 0x71, 0xdf, 0xbd, 0x0f, 0x60, 0xdc, 0xb8, + 0xab, 0xdc, 0xab, 0xd6, 0xae, 0x7c, 0xf3, 0x9f, 0x13, 0x60, 0x1a, 0x95, + 0x47, 0x1b, 0x0e, 0xc3, 0x30, 0x8c, 0x21, 0x22, 0x4c, 0xd3, 0x04, 0xe7, + 0x1c, 0xff, 0xb9, 0x7f, 0x1a, 0xc6, 0x5f, 0x3d, 0x7e, 0xc9, 0x8a, 0xf7, + 0xde, 0x59, 0x31, 0x2c, 0x59, 0x22, 0x35, 0x40, 0x44, 0xf0, 0x96, 0x7f, + 0xb2, 0x68, 0xab, 0xbf, 0x92, 0x02, 0x81, 0x00, 0x45, 0x22, 0x11, 0x0a, + 0x87, 0xc3, 0x71, 0x33, 0x0c, 0x83, 0xa4, 0x94, 0xf4, 0xc5, 0xce, 0xed, + 0xe4, 0x2e, 0x29, 0x5e, 0xf9, 0xb7, 0x17, 0xe1, 0x80, 0xad, 0x5d, 0xbf, + 0xba, 0xb0, 0xfc, 0xd3, 0x8d, 0xb2, 0xb3, 0xab, 0x93, 0xc2, 0xe1, 0x30, + 0x05, 0x83, 0xc1, 0xb8, 0x0d, 0x74, 0xc8, 0xb6, 0xed, 0x7e, 0x5a, 0xbc, + 0xe4, 0x95, 0x8f, 0x00, 0xb0, 0x0b, 0x71, 0xa8, 0x6e, 0xb7, 0x3b, 0x91, + 0x2c, 0x00, 0x00, 0x26, 0xdf, 0x36, 0xe5, 0x48, 0x5d, 0xed, 0xfe, 0xd3, + 0xad, 0x6d, 0xc7, 0x1f, 0xba, 0xee, 0xda, 0x6b, 0x99, 0xae, 0xeb, 0x90, + 0x52, 0x02, 0x20, 0x08, 0xc1, 0x41, 0x04, 0xdc, 0x74, 0xd3, 0x44, 0x84, + 0x42, 0xc1, 0xdb, 0xc7, 0x8e, 0xcd, 0x1a, 0x57, 0x5f, 0x7f, 0x78, 0x97, + 0xd3, 0xe9, 0x1c, 0x32, 0x7c, 0xd8, 0xe0, 0x61, 0xb4, 0x63, 0x4f, 0xf5, + 0xad, 0x0a, 0x34, 0x17, 0xe7, 0x3c, 0x87, 0x48, 0xec, 0x90, 0x96, 0xf4, + 0xe4, 0xe6, 0x3e, 0xde, 0x30, 0x80, 0x97, 0x57, 0x95, 0xdf, 0xaa, 0x31, + 0xe6, 0xe2, 0x16, 0xcf, 0x21, 0xd0, 0x0e, 0x6e, 0x98, 0x9e, 0x05, 0x0b, + 0x9e, 0x6d, 0x78, 0xfb, 0xdd, 0x92, 0xa7, 0x1d, 0x76, 0x47, 0xe9, 0xac, + 0x47, 0x1f, 0x57, 0xec, 0x76, 0x07, 0x84, 0xe0, 0x71, 0x4e, 0x9b, 0xcd, + 0x86, 0x94, 0x14, 0x3b, 0xaa, 0xb7, 0xf9, 0x71, 0xe0, 0xc0, 0xbe, 0xf2, + 0xce, 0x73, 0x3d, 0xf3, 0x7d, 0x3e, 0x9f, 0xf8, 0x93, 0x80, 0x9d, 0x3b, + 0xb7, 0x4d, 0xb5, 0xd9, 0xed, 0x75, 0xb7, 0x4f, 0x9a, 0xa2, 0xa7, 0x67, + 0x64, 0xb0, 0x8e, 0x8e, 0x76, 0x3a, 0x72, 0xf4, 0xb0, 0x19, 0xee, 0x8d, + 0x3a, 0xe7, 0xcc, 0x9e, 0x53, 0x5f, 0x51, 0xe1, 0x9d, 0x6a, 0x4f, 0x75, + 0xd4, 0xdd, 0x7d, 0x97, 0x53, 0x1f, 0x95, 0x79, 0x19, 0x3b, 0x7d, 0xe6, + 0x37, 0xfa, 0xea, 0x50, 0x9d, 0x19, 0x0c, 0x07, 0x9d, 0x85, 0xcf, 0xbc, + 0x50, 0x5f, 0xfc, 0x46, 0x51, 0x9e, 0xc3, 0xee, 0xd8, 0xf8, 0xe4, 0x13, + 0x4f, 0xa9, 0x69, 0xa9, 0xa9, 0xe0, 0x7c, 0xa8, 0x08, 0x87, 0x23, 0x15, + 0x7e, 0xff, 0x56, 0xec, 0xde, 0x5b, 0x53, 0x79, 0xf2, 0xc4, 0xa9, 0xb9, + 0xb5, 0xb5, 0xb5, 0x1c, 0x18, 0xd4, 0x05, 0x9c, 0xa4, 0xeb, 0xe6, 0x89, + 0xb7, 0xe8, 0x69, 0x69, 0xe9, 0x8c, 0x5b, 0x16, 0x52, 0x92, 0x53, 0xd8, + 0xf8, 0xab, 0xaf, 0xd1, 0x15, 0x26, 0x5c, 0x00, 0x20, 0x40, 0xae, 0x3b, + 0xa6, 0xdc, 0xa9, 0x67, 0x66, 0x8c, 0x62, 0x9c, 0x5b, 0x48, 0x75, 0xa4, + 0xb2, 0x1b, 0x26, 0xdc, 0xa8, 0x33, 0x52, 0x5c, 0x00, 0xf0, 0xfa, 0xf2, + 0x92, 0xcd, 0x9d, 0x5d, 0x5d, 0x79, 0x1b, 0xca, 0x3e, 0x16, 0x81, 0x40, + 0x00, 0x8a, 0xa2, 0x40, 0x08, 0x01, 0x21, 0x04, 0xa2, 0xd1, 0x28, 0x42, + 0xa1, 0x10, 0x72, 0x73, 0x1f, 0xc3, 0x8c, 0x69, 0xd3, 0x9e, 0xb8, 0x22, + 0x7b, 0x4c, 0x55, 0x41, 0x41, 0x41, 0xd2, 0x10, 0x01, 0x42, 0x88, 0xe9, + 0xc9, 0xb6, 0x64, 0xd6, 0xdb, 0x1b, 0x42, 0x24, 0xd2, 0x8b, 0x9e, 0x9e, + 0x00, 0x6c, 0x36, 0x1b, 0x33, 0x0d, 0x6b, 0x3a, 0x00, 0x58, 0x96, 0x35, + 0xdd, 0x6e, 0x77, 0x0c, 0xc1, 0x53, 0xec, 0x29, 0xcc, 0xb2, 0xce, 0xe3, + 0x00, 0xf0, 0xee, 0xdb, 0xef, 0x55, 0x76, 0x77, 0x77, 0x7b, 0x2a, 0x2a, + 0x2b, 0x90, 0x9a, 0x9a, 0x06, 0x5d, 0xb7, 0x0d, 0x12, 0x11, 0x41, 0x28, + 0x14, 0xc4, 0xf4, 0x69, 0x33, 0x91, 0x91, 0x9e, 0x96, 0x1b, 0x08, 0x76, + 0x2d, 0x06, 0x06, 0x0d, 0x23, 0x12, 0xb2, 0xe6, 0xc4, 0x2f, 0x6d, 0xb9, + 0x99, 0x99, 0xa3, 0x58, 0x5f, 0x5f, 0x0c, 0x96, 0x69, 0xa1, 0x27, 0xd4, + 0x2d, 0x41, 0x54, 0x03, 0x00, 0x44, 0x54, 0xd3, 0xda, 0xda, 0x9c, 0x3b, + 0x7a, 0xf4, 0x98, 0x38, 0xde, 0xd1, 0xd9, 0x1e, 0xc7, 0x01, 0xe0, 0xb9, + 0x45, 0xcf, 0xcd, 0xcc, 0x48, 0x4f, 0x7b, 0xf1, 0xa5, 0x17, 0x5d, 0x10, + 0x42, 0x22, 0xdc, 0x1b, 0x8e, 0xa7, 0x41, 0x51, 0x14, 0x58, 0xdc, 0x82, + 0x77, 0x93, 0x17, 0x81, 0x40, 0xcf, 0x97, 0x90, 0xca, 0x8a, 0x21, 0x11, + 0x30, 0x0d, 0xc3, 0xf3, 0x73, 0x6b, 0x53, 0xec, 0xb7, 0xd3, 0x27, 0x65, + 0xcc, 0x88, 0xe0, 0x6c, 0x57, 0xbb, 0x3c, 0xde, 0xd6, 0xd6, 0x17, 0x35, + 0x2d, 0x0f, 0x00, 0x58, 0x7d, 0xa6, 0xa7, 0xe1, 0xfb, 0xef, 0x63, 0x6d, + 0xbf, 0xb4, 0xca, 0x48, 0xac, 0x17, 0xbf, 0x9e, 0x3e, 0x25, 0x7f, 0xfa, + 0xa9, 0xb1, 0x2f, 0x66, 0x44, 0x3d, 0x00, 0x50, 0xf8, 0x7c, 0xfe, 0x23, + 0x19, 0xe9, 0x69, 0xd5, 0xcb, 0x96, 0x2e, 0xb7, 0x81, 0x01, 0xed, 0x1d, + 0x67, 0xe2, 0x6f, 0x0f, 0x00, 0xaa, 0xaa, 0xc2, 0xbb, 0xc9, 0x8b, 0xaf, + 0xbf, 0x39, 0xb4, 0xab, 0x37, 0x14, 0x7d, 0xd8, 0xe7, 0xf3, 0xc5, 0xfe, + 0xd4, 0x05, 0x5e, 0x6f, 0xe9, 0x54, 0x45, 0x53, 0x5c, 0x9c, 0x5b, 0x33, + 0x40, 0xd8, 0x6d, 0x08, 0xe9, 0x29, 0x7c, 0xa6, 0xb0, 0x7e, 0x00, 0x5f, + 0xb5, 0xea, 0xbf, 0x53, 0xa1, 0x2a, 0x2e, 0x6e, 0xf1, 0x19, 0x4c, 0xc1, + 0x6e, 0xd3, 0x32, 0x3c, 0xaf, 0xbe, 0xbc, 0xb4, 0x3e, 0xbf, 0x30, 0x7f, + 0xd6, 0xe8, 0xcb, 0x2e, 0xaf, 0x58, 0x56, 0xb4, 0x5c, 0x13, 0x52, 0xa0, + 0xa3, 0xa3, 0x3d, 0xce, 0xa9, 0xaa, 0x2a, 0x92, 0x92, 0x74, 0x6c, 0xde, + 0xbc, 0x09, 0x47, 0x1b, 0x8e, 0x7e, 0x0e, 0xa9, 0xcc, 0xf6, 0xf9, 0x7c, + 0x66, 0xfc, 0x81, 0x0b, 0x1d, 0x0e, 0x6e, 0xb7, 0x5b, 0xb9, 0xd8, 0x01, + 0x34, 0x18, 0x5f, 0xb8, 0x70, 0xfe, 0x9c, 0x25, 0x45, 0xaf, 0xf1, 0x58, + 0x2c, 0x4a, 0xa1, 0x50, 0x88, 0x5a, 0x7e, 0x6e, 0x8e, 0x5b, 0xdb, 0x89, + 0xe3, 0x74, 0xea, 0xd4, 0x49, 0x2a, 0x29, 0x79, 0x83, 0x66, 0xcd, 0xce, + 0xf5, 0x39, 0x9d, 0x4e, 0xed, 0x8f, 0x5c, 0x43, 0x22, 0x30, 0xd2, 0x35, + 0x7f, 0xe1, 0xbc, 0xa7, 0xb3, 0xb3, 0xb2, 0x4a, 0x8b, 0x96, 0x16, 0x2b, + 0x96, 0x69, 0xe2, 0xec, 0xb9, 0x8e, 0x38, 0xa6, 0x69, 0x1a, 0x54, 0x55, + 0x43, 0xd9, 0xc6, 0x32, 0x34, 0x36, 0xfe, 0xf8, 0x19, 0xa4, 0x32, 0x77, + 0x70, 0xff, 0xc7, 0x6b, 0x23, 0x51, 0xe7, 0xf3, 0x16, 0xcc, 0xcd, 0xcf, + 0xce, 0x1a, 0xbb, 0x61, 0x59, 0x91, 0x5b, 0xb1, 0x4c, 0x13, 0x9d, 0x5d, + 0xe7, 0xa0, 0x28, 0x0a, 0x14, 0x45, 0x81, 0xae, 0xeb, 0xd0, 0xb4, 0x24, + 0x6c, 0x28, 0x2b, 0x45, 0x63, 0xe3, 0x8f, 0xde, 0x1b, 0x6f, 0x98, 0x98, + 0x77, 0x21, 0xe7, 0x00, 0x12, 0x8b, 0x40, 0xde, 0x82, 0xbc, 0xeb, 0xaf, + 0xca, 0xbe, 0xb2, 0xa9, 0x78, 0xb9, 0x9b, 0x19, 0x86, 0x81, 0x40, 0xa0, + 0x2b, 0x8e, 0x69, 0x9a, 0x06, 0x06, 0x86, 0x75, 0xeb, 0xd7, 0xe1, 0x58, + 0x4b, 0xd3, 0x27, 0xfe, 0xaa, 0xea, 0x02, 0xba, 0x88, 0x93, 0x84, 0xbe, + 0x09, 0x2d, 0xc3, 0x7c, 0xa9, 0x20, 0xbf, 0x80, 0x71, 0xce, 0x11, 0x0a, + 0x05, 0xa1, 0xaa, 0xe7, 0x69, 0x54, 0x55, 0x3b, 0x3f, 0xa4, 0xd6, 0xae, + 0x41, 0x53, 0x73, 0xf3, 0x1a, 0xbf, 0xaf, 0xfa, 0x85, 0x8b, 0x39, 0x07, + 0x12, 0x4c, 0x81, 0xb4, 0x44, 0x4e, 0x66, 0xe6, 0x28, 0x44, 0xa3, 0x11, + 0xa8, 0xaa, 0x0a, 0x55, 0x55, 0xa1, 0xeb, 0x3a, 0x18, 0x63, 0x58, 0xbd, + 0xe6, 0x43, 0xb4, 0xb4, 0xb4, 0x7c, 0xb0, 0x75, 0x8b, 0xff, 0xf9, 0xe1, + 0x9c, 0x8f, 0x48, 0x00, 0x3b, 0xbf, 0x54, 0xc6, 0x58, 0x92, 0x24, 0xfa, + 0xf2, 0xc8, 0x91, 0xef, 0xa0, 0x2a, 0x1a, 0x34, 0x55, 0x83, 0x4d, 0xb7, + 0x81, 0x24, 0x61, 0xe5, 0x87, 0xef, 0xa3, 0xa5, 0xb9, 0xe5, 0x7d, 0xdf, + 0x16, 0xff, 0x62, 0xc6, 0x98, 0xce, 0x18, 0x4b, 0xea, 0xdf, 0xc3, 0xfe, + 0x8a, 0x77, 0xd8, 0x14, 0x30, 0xc6, 0x14, 0x00, 0x6a, 0xbf, 0xd8, 0x64, + 0x00, 0x8e, 0x8e, 0x33, 0x67, 0xf7, 0x6d, 0xff, 0x7c, 0xdb, 0x3c, 0x9b, + 0x9e, 0x8c, 0x09, 0x13, 0x26, 0xa0, 0xed, 0x44, 0x1b, 0xaa, 0xb6, 0x54, + 0xa1, 0xe9, 0xd8, 0xb1, 0xf5, 0x35, 0xbb, 0xf7, 0xae, 0x06, 0x90, 0x09, + 0x20, 0x0a, 0x40, 0x02, 0x10, 0x00, 0x24, 0x63, 0x4c, 0x02, 0x10, 0x44, + 0x24, 0x87, 0xf0, 0x0f, 0x17, 0xa5, 0x7e, 0xf5, 0x03, 0x02, 0x34, 0x00, + 0x76, 0x00, 0x29, 0x93, 0xef, 0x98, 0x3c, 0x69, 0x5c, 0x76, 0xd6, 0x22, + 0x55, 0xd3, 0x26, 0x99, 0xa6, 0x79, 0x28, 0x18, 0x0c, 0xef, 0x39, 0x58, + 0x77, 0x70, 0x2f, 0x80, 0x3e, 0x00, 0x31, 0x00, 0x66, 0xbf, 0x80, 0x01, + 0x13, 0x00, 0xe4, 0x1f, 0xd3, 0x32, 0xe2, 0x2e, 0xe8, 0x17, 0x34, 0x60, + 0xea, 0xc0, 0x6d, 0x00, 0xd4, 0xef, 0x08, 0xfd, 0xd7, 0x04, 0x80, 0x86, + 0xab, 0x83, 0xff, 0xeb, 0x20, 0xfa, 0x3b, 0xd6, 0x25, 0xff, 0x37, 0xfc, + 0x1d, 0xb2, 0xd0, 0x94, 0xc5, 0xc1, 0xa5, 0x75, 0xe4, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 +}; +unsigned int go_next_png_len = 1701; +unsigned char go_previous_png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, + 0x08, 0x06, 0x00, 0x00, 0x00, 0x73, 0x7a, 0x7a, 0xf4, 0x00, 0x00, 0x00, + 0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64, + 0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0d, + 0xd7, 0x00, 0x00, 0x0d, 0xd7, 0x01, 0x42, 0x28, 0x9b, 0x78, 0x00, 0x00, + 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, + 0x72, 0x65, 0x00, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x6b, 0x73, 0x63, + 0x61, 0x70, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x9b, 0xee, 0x3c, 0x1a, 0x00, + 0x00, 0x00, 0x13, 0x74, 0x45, 0x58, 0x74, 0x54, 0x69, 0x74, 0x6c, 0x65, + 0x00, 0x4f, 0x70, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x44, 0x72, 0x69, + 0x76, 0x65, 0x3e, 0x67, 0xba, 0x0c, 0x00, 0x00, 0x05, 0xe5, 0x49, 0x44, + 0x41, 0x54, 0x58, 0x85, 0xed, 0x97, 0x6b, 0x4c, 0x14, 0x57, 0x14, 0xc7, + 0xff, 0x77, 0x67, 0x76, 0x67, 0x45, 0x58, 0x11, 0x16, 0x90, 0xa2, 0xf6, + 0xa1, 0xa6, 0x9f, 0x5c, 0x57, 0x50, 0xd3, 0xd4, 0x98, 0x56, 0xd4, 0xd6, + 0x68, 0xa9, 0x49, 0x8d, 0xd6, 0xb6, 0x6a, 0xac, 0x31, 0x18, 0x15, 0x11, + 0x04, 0xad, 0xa4, 0xb1, 0x74, 0xb1, 0xf5, 0x11, 0x04, 0xaa, 0xf8, 0xa8, + 0xa0, 0xb5, 0x56, 0xad, 0x52, 0x6c, 0x2b, 0x55, 0x11, 0xd7, 0x17, 0x15, + 0x95, 0xe2, 0xab, 0xa5, 0x62, 0xd4, 0x5d, 0xab, 0x16, 0xaa, 0x11, 0x14, + 0x77, 0x97, 0xd9, 0xd7, 0x3c, 0x6f, 0x3f, 0xb8, 0xac, 0x12, 0xd2, 0x20, + 0xa8, 0xf1, 0x4b, 0x4f, 0x72, 0x92, 0x49, 0xce, 0xdc, 0xf9, 0xff, 0xee, + 0xb9, 0xe7, 0xdc, 0x7b, 0x87, 0x50, 0x4a, 0xf1, 0x3c, 0x4d, 0xf3, 0x5c, + 0xd5, 0xff, 0x07, 0x00, 0xc0, 0x76, 0x65, 0x90, 0xf5, 0xd8, 0xc1, 0x44, + 0x42, 0xe8, 0x64, 0x50, 0x32, 0x9e, 0x52, 0xd4, 0xc8, 0x94, 0x5a, 0xc6, + 0x8d, 0x1e, 0x77, 0xb1, 0x4b, 0x04, 0x94, 0xd2, 0x4e, 0xf9, 0xe1, 0xa3, + 0xe5, 0x29, 0x67, 0x2f, 0xfc, 0xa6, 0x7a, 0x7d, 0x5e, 0x4a, 0x29, 0xa5, + 0x7e, 0xbf, 0x9f, 0x56, 0x9d, 0xac, 0x54, 0x7f, 0xde, 0x57, 0x3a, 0xaa, + 0xb3, 0xdf, 0xa2, 0x94, 0x76, 0x6e, 0x09, 0x0e, 0x1f, 0x3d, 0x98, 0x61, + 0x8c, 0x8c, 0x2a, 0x4c, 0x30, 0x0f, 0x23, 0x7a, 0x4e, 0x0f, 0x45, 0x51, + 0xa0, 0xd3, 0xe9, 0x60, 0x32, 0x99, 0x89, 0x28, 0x8a, 0xd3, 0xbb, 0x92, + 0x80, 0xc7, 0x5e, 0x02, 0xeb, 0xf1, 0xf2, 0xac, 0x28, 0x63, 0xf4, 0xf2, + 0x41, 0xa6, 0x04, 0x50, 0x4a, 0xa1, 0x28, 0x0a, 0x00, 0x40, 0x55, 0x55, + 0xe8, 0xb4, 0x1c, 0x24, 0x41, 0x7a, 0xe7, 0x99, 0x01, 0x58, 0x8f, 0x94, + 0x7f, 0x6e, 0x8c, 0x8a, 0xc9, 0x36, 0x9b, 0xe2, 0xa1, 0x28, 0x4a, 0x50, + 0x1c, 0x00, 0x08, 0x21, 0xb8, 0xd3, 0x74, 0x07, 0xa2, 0x24, 0x95, 0x3f, + 0x13, 0x80, 0x0a, 0xeb, 0xfe, 0x15, 0xd1, 0xd1, 0xbd, 0x96, 0x0c, 0x36, + 0xc5, 0x43, 0x96, 0x65, 0xc8, 0xb2, 0xdc, 0x46, 0x5c, 0x92, 0x44, 0x9c, + 0x3b, 0x7f, 0x06, 0x82, 0x24, 0xe7, 0x3f, 0x75, 0x80, 0xf2, 0x8a, 0x7d, + 0xf9, 0xbd, 0x62, 0x63, 0xd3, 0x07, 0x9b, 0x12, 0x20, 0x8a, 0x22, 0x24, + 0x49, 0x0a, 0xc6, 0x34, 0x1a, 0x0d, 0x44, 0x51, 0xc0, 0xa1, 0xc3, 0x15, + 0x68, 0xbe, 0x7f, 0x77, 0xf1, 0x9c, 0xe4, 0xf9, 0xbf, 0x77, 0x05, 0xe0, + 0xbf, 0xaa, 0x93, 0x94, 0x1d, 0xd8, 0xbb, 0xee, 0xfc, 0x1f, 0xe7, 0xa8, + 0xaa, 0xaa, 0xd4, 0xe7, 0xf3, 0x51, 0x97, 0xcb, 0x15, 0x74, 0x9e, 0xe7, + 0x69, 0xf3, 0xfd, 0x66, 0xba, 0x73, 0xf7, 0x76, 0x5a, 0xf8, 0xf5, 0x9a, + 0x05, 0x5d, 0xa9, 0xfe, 0x56, 0x6f, 0x97, 0x01, 0x8b, 0xc5, 0xa2, 0x31, + 0x27, 0x0c, 0xdc, 0xd4, 0xb7, 0xcf, 0x8b, 0xb3, 0xcc, 0xa6, 0x78, 0xf8, + 0xfd, 0x3e, 0x88, 0xa2, 0x18, 0x8c, 0x33, 0x0c, 0x03, 0x41, 0xf0, 0xe1, + 0xe0, 0xa1, 0x72, 0xea, 0x70, 0x38, 0xe6, 0xcd, 0x9f, 0x97, 0xb6, 0xb1, + 0x4b, 0x33, 0x0f, 0x18, 0x79, 0xf4, 0x30, 0x2a, 0x2d, 0x2d, 0x65, 0x58, + 0x8e, 0x7e, 0xf3, 0xf2, 0x4b, 0xfd, 0xa6, 0x0f, 0x1a, 0x18, 0x0f, 0x9f, + 0xcf, 0x0b, 0x41, 0x10, 0xda, 0x88, 0xfb, 0xfd, 0x7e, 0x1c, 0xac, 0xd8, + 0xaf, 0x3a, 0x9c, 0xce, 0xd9, 0x69, 0xa9, 0x19, 0x9b, 0x8b, 0x8b, 0x37, + 0x0c, 0x25, 0x2c, 0x93, 0xa1, 0x28, 0x4a, 0x12, 0x28, 0xac, 0x92, 0x20, + 0xae, 0x4e, 0x49, 0x49, 0x3b, 0xd5, 0x3a, 0x26, 0x2f, 0x6f, 0xe5, 0x50, + 0xc2, 0x30, 0x19, 0xb2, 0x2a, 0x27, 0x81, 0xc2, 0x2a, 0x88, 0xf2, 0xea, + 0xa5, 0x59, 0x4b, 0x4f, 0xb5, 0x03, 0xa8, 0xac, 0xac, 0x64, 0xef, 0x39, + 0x1a, 0xb7, 0xf7, 0x7f, 0x65, 0xc0, 0x94, 0x41, 0xa6, 0xc1, 0xf0, 0x78, + 0xdc, 0x10, 0x04, 0x7f, 0x50, 0x9c, 0x65, 0x59, 0x78, 0x7d, 0x3e, 0x1c, + 0x28, 0xdf, 0xa7, 0xf2, 0x6e, 0xd7, 0xcc, 0xf4, 0xd4, 0xc5, 0xdb, 0x8a, + 0x8b, 0x37, 0x98, 0x43, 0x0d, 0x86, 0xea, 0x51, 0x89, 0x63, 0xb8, 0xc8, + 0x08, 0x23, 0xf9, 0xe7, 0x56, 0x03, 0x3d, 0x76, 0xfc, 0x88, 0xe0, 0x72, + 0x38, 0x13, 0xd3, 0xd2, 0x32, 0xab, 0x73, 0x73, 0x97, 0x9b, 0xc3, 0x23, + 0x22, 0xab, 0x93, 0xc6, 0xbf, 0xcb, 0x45, 0x45, 0x45, 0x93, 0xfa, 0xfa, + 0x9b, 0x74, 0xdf, 0x81, 0x32, 0xe1, 0x9e, 0xe3, 0x5e, 0x62, 0xce, 0xd2, + 0xe5, 0xd5, 0x40, 0xe0, 0x2c, 0x28, 0x2a, 0x2a, 0xd2, 0x36, 0x35, 0xdf, + 0xde, 0x3d, 0xa0, 0xdf, 0x03, 0x71, 0x9e, 0x77, 0xc1, 0xeb, 0xf5, 0x04, + 0x5b, 0x8e, 0x10, 0x0d, 0x78, 0xb7, 0x1b, 0x65, 0xbf, 0xec, 0x55, 0x9c, + 0x2e, 0xe7, 0xb4, 0xf4, 0xd4, 0xc5, 0xdb, 0x00, 0x80, 0x6a, 0xc8, 0xc2, + 0x11, 0xc3, 0xdf, 0xe0, 0x22, 0x7a, 0x46, 0x12, 0x59, 0x96, 0x60, 0x08, + 0x33, 0x90, 0x41, 0x26, 0x33, 0x47, 0x35, 0x58, 0x04, 0x00, 0x44, 0x43, + 0x16, 0xbe, 0x35, 0xfa, 0x6d, 0xce, 0x68, 0x8c, 0x22, 0xb2, 0x2c, 0x21, + 0x3c, 0xbc, 0x27, 0x79, 0x6d, 0xd8, 0xeb, 0x1c, 0x0b, 0xed, 0xa2, 0xd6, + 0x89, 0x69, 0x00, 0x20, 0x2c, 0xa2, 0x5b, 0x3a, 0x21, 0x64, 0xe2, 0x80, + 0xfe, 0xaf, 0xa2, 0xa5, 0xc5, 0x09, 0x8f, 0xe7, 0xa1, 0xb8, 0x4e, 0xa7, + 0x43, 0x58, 0x98, 0x01, 0xc7, 0x8e, 0x1d, 0x41, 0x4b, 0x8b, 0x6b, 0x7d, + 0x66, 0xfa, 0x27, 0xdf, 0xb7, 0x0e, 0x96, 0x44, 0x69, 0x42, 0xf7, 0xd0, + 0xee, 0xc4, 0xed, 0x6e, 0x81, 0xc7, 0xe3, 0x86, 0xd3, 0xe9, 0x40, 0x48, + 0x48, 0x77, 0x22, 0x89, 0xd2, 0x58, 0x8b, 0xc5, 0xa2, 0x11, 0x25, 0x79, + 0x42, 0x98, 0xc1, 0xd0, 0x26, 0x6e, 0x30, 0x18, 0x88, 0x20, 0x0a, 0x63, + 0x2d, 0x16, 0x8b, 0x26, 0x08, 0xc0, 0xdf, 0xf7, 0x15, 0xf0, 0xbc, 0x7b, + 0x6f, 0xd5, 0xa9, 0x2a, 0x48, 0x92, 0x0c, 0x0a, 0x40, 0x56, 0x14, 0xc8, + 0x8a, 0x02, 0xde, 0xed, 0x86, 0x2c, 0x4b, 0x98, 0x3c, 0xe9, 0x03, 0x84, + 0x74, 0x0f, 0x99, 0x67, 0x59, 0xf6, 0xd9, 0x94, 0x56, 0x00, 0x55, 0x55, + 0xcb, 0xae, 0x5c, 0xbe, 0xac, 0x3a, 0x9c, 0x4e, 0x34, 0x36, 0x35, 0x82, + 0xe7, 0x79, 0xfc, 0xdd, 0x70, 0x83, 0x52, 0xd0, 0x8a, 0xec, 0xec, 0x6c, + 0x95, 0x52, 0x5a, 0x56, 0x77, 0xb1, 0xb6, 0x4d, 0xdc, 0x7e, 0xc3, 0x46, + 0x09, 0x21, 0x15, 0xd9, 0xd9, 0xd9, 0x6a, 0x10, 0x20, 0x39, 0x39, 0x59, + 0x92, 0x05, 0x3a, 0xf9, 0xfa, 0x8d, 0x6b, 0x3f, 0x9e, 0xae, 0x39, 0x0d, + 0x86, 0x61, 0x00, 0x20, 0x98, 0x85, 0xc6, 0xa6, 0x46, 0xa8, 0xaa, 0x82, + 0x59, 0x1f, 0xcf, 0x66, 0x7a, 0xf4, 0xe8, 0xb1, 0x63, 0xc9, 0xa7, 0x8b, + 0xa6, 0x02, 0x80, 0x5f, 0x92, 0xf2, 0xcf, 0x9e, 0xaf, 0x11, 0xae, 0xda, + 0xaf, 0x28, 0xbc, 0x87, 0xc7, 0x8d, 0xfa, 0xeb, 0xea, 0x85, 0x0b, 0x17, + 0xfc, 0xa2, 0xcf, 0x9f, 0x0b, 0x00, 0x5e, 0x51, 0xc8, 0x3f, 0x71, 0xf2, + 0x84, 0x70, 0xf1, 0xd2, 0x9f, 0x4a, 0x0b, 0xef, 0xc2, 0x15, 0xfb, 0x65, + 0xf5, 0xf4, 0xa9, 0x6a, 0xbf, 0x27, 0x10, 0x6f, 0xd7, 0x05, 0x16, 0x8b, + 0x85, 0xed, 0x11, 0x1e, 0xba, 0x23, 0x2e, 0xae, 0xf7, 0xfb, 0xc3, 0x87, + 0x8f, 0x80, 0x24, 0x8a, 0x90, 0x95, 0x87, 0x3b, 0x5f, 0x4c, 0x74, 0x0c, + 0x58, 0xad, 0x16, 0x6b, 0x0b, 0x0b, 0xd4, 0x5b, 0xb7, 0x6f, 0xcf, 0x5a, + 0x93, 0x5f, 0xb8, 0x75, 0xe5, 0xca, 0x65, 0x43, 0x35, 0x5a, 0x36, 0x43, + 0x96, 0xe4, 0x24, 0x42, 0x88, 0xd5, 0x27, 0x8a, 0xab, 0x73, 0x96, 0xe6, + 0x04, 0xab, 0x3c, 0x2b, 0x2b, 0x73, 0x28, 0xc3, 0x6a, 0x33, 0x64, 0x45, + 0x4e, 0x02, 0x21, 0x56, 0xc1, 0xeb, 0x5b, 0x5d, 0x50, 0x50, 0xd8, 0xbe, + 0x0b, 0x1e, 0x6d, 0x45, 0xdb, 0x5f, 0x57, 0xb7, 0xf6, 0x89, 0xeb, 0x3d, + 0x6d, 0xe4, 0xc8, 0x51, 0x90, 0x24, 0xb1, 0xcd, 0xf6, 0xdb, 0x2b, 0xa6, + 0x17, 0x38, 0x4e, 0x8f, 0xbc, 0x82, 0x5c, 0xda, 0xd0, 0x50, 0x3f, 0x7b, + 0xe3, 0xfa, 0xa2, 0x62, 0x3c, 0x81, 0xb5, 0x3b, 0x8e, 0x27, 0x4d, 0x9a, + 0xa4, 0xc8, 0x82, 0x32, 0xc3, 0x7e, 0xfd, 0xda, 0x96, 0xf2, 0x8a, 0xfd, + 0xe0, 0x38, 0x1d, 0x38, 0x4e, 0x07, 0x86, 0xd1, 0x80, 0x61, 0x34, 0xb8, + 0x7b, 0xaf, 0x09, 0x82, 0xe0, 0x47, 0xe6, 0xc2, 0x45, 0x24, 0x36, 0x36, + 0x6e, 0xd3, 0x8c, 0x99, 0xd3, 0xe6, 0x3c, 0x09, 0x40, 0xbb, 0x0c, 0x04, + 0x03, 0x84, 0x90, 0xcc, 0x25, 0x19, 0xeb, 0xfa, 0xc4, 0xf5, 0x9e, 0x3b, + 0xf1, 0xbd, 0x89, 0x50, 0x55, 0xb5, 0x4d, 0x26, 0x22, 0x23, 0x8c, 0xd0, + 0x77, 0xeb, 0x86, 0x2f, 0xbe, 0xcc, 0xc1, 0xd5, 0xab, 0x57, 0x16, 0x94, + 0xec, 0xda, 0xb3, 0xf6, 0xa9, 0x02, 0xb4, 0x5a, 0x6a, 0xda, 0xdc, 0x82, + 0xde, 0x71, 0x7d, 0xd3, 0xa6, 0x7e, 0x34, 0x15, 0x20, 0x68, 0x03, 0xd1, + 0x33, 0xbc, 0x27, 0xf4, 0xfa, 0x10, 0x58, 0x72, 0xb2, 0x61, 0xb7, 0xd9, + 0xc6, 0x94, 0x94, 0xec, 0x39, 0xd2, 0x59, 0x80, 0x0e, 0x6f, 0x44, 0x6b, + 0xbf, 0xda, 0x90, 0x6e, 0xb3, 0xdb, 0x57, 0x6d, 0xde, 0xb2, 0x19, 0x00, + 0x81, 0x4e, 0xa7, 0x07, 0xc3, 0xb0, 0x60, 0x18, 0x16, 0x2d, 0x3c, 0x0f, + 0x49, 0x12, 0x91, 0x32, 0x6f, 0x3e, 0x40, 0xe8, 0x87, 0x9d, 0x15, 0x7f, + 0x2c, 0x00, 0x00, 0xd8, 0x5c, 0xb4, 0x65, 0x89, 0xcd, 0x6e, 0xcb, 0x29, + 0x2c, 0x5c, 0x0b, 0x55, 0x7d, 0xb0, 0x39, 0x31, 0x0c, 0x03, 0x86, 0x61, + 0xe0, 0xf1, 0x7a, 0x10, 0x19, 0x69, 0x04, 0x05, 0x92, 0x9e, 0x2a, 0x00, + 0x79, 0x60, 0x0c, 0x21, 0x44, 0x4b, 0x08, 0xd1, 0xed, 0xdc, 0xbe, 0x6b, + 0x85, 0xcd, 0x6e, 0xb3, 0xe4, 0xe7, 0xe7, 0x41, 0x96, 0x24, 0x70, 0x3a, + 0x0e, 0x2c, 0xc3, 0x82, 0x65, 0xb4, 0x38, 0x73, 0xb6, 0x06, 0x54, 0x45, + 0x55, 0xe0, 0x5d, 0x86, 0x10, 0x42, 0xba, 0x0c, 0x40, 0x08, 0xd1, 0x10, + 0x42, 0xb4, 0x00, 0x74, 0x01, 0xe7, 0x00, 0xe8, 0x01, 0x84, 0xff, 0xb4, + 0x67, 0xef, 0x77, 0x75, 0x97, 0xea, 0xf2, 0x56, 0xac, 0x5a, 0x89, 0xda, + 0xda, 0x5a, 0x50, 0x0a, 0x5c, 0xba, 0x54, 0x87, 0x1f, 0x4a, 0x4b, 0x70, + 0xb3, 0xa1, 0xfe, 0x5b, 0x00, 0x46, 0x00, 0xa1, 0x00, 0x74, 0x01, 0x98, + 0x0e, 0x33, 0xdc, 0xae, 0x08, 0x03, 0xf4, 0x4c, 0x00, 0xee, 0x51, 0x6f, + 0x05, 0xd1, 0x0f, 0x19, 0x32, 0x64, 0x70, 0xec, 0x0b, 0x31, 0x53, 0x39, + 0x3d, 0xf7, 0xa6, 0x28, 0x88, 0xbf, 0xde, 0x6f, 0x6e, 0x2e, 0x39, 0x79, + 0xb2, 0xba, 0x0a, 0x80, 0x1f, 0x80, 0x07, 0x80, 0x0c, 0x40, 0x01, 0xa0, + 0xd2, 0x0e, 0xaa, 0xbc, 0xc3, 0x2e, 0x08, 0x00, 0x3d, 0xea, 0x08, 0x00, + 0x11, 0x00, 0x34, 0xe0, 0x6a, 0xeb, 0x73, 0x47, 0x82, 0x9d, 0x06, 0x78, + 0xd6, 0xf6, 0xdc, 0xff, 0x0d, 0xff, 0x05, 0x05, 0x21, 0x89, 0x68, 0xc6, + 0xaf, 0xc4, 0x15, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, + 0x42, 0x60, 0x82 +}; +unsigned int go_previous_png_len = 1671; +unsigned char go_up_png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, + 0x08, 0x06, 0x00, 0x00, 0x00, 0x73, 0x7a, 0x7a, 0xf4, 0x00, 0x00, 0x00, + 0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64, + 0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0d, + 0xd7, 0x00, 0x00, 0x0d, 0xd7, 0x01, 0x42, 0x28, 0x9b, 0x78, 0x00, 0x00, + 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, + 0x72, 0x65, 0x00, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x6b, 0x73, 0x63, + 0x61, 0x70, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x9b, 0xee, 0x3c, 0x1a, 0x00, + 0x00, 0x00, 0x13, 0x74, 0x45, 0x58, 0x74, 0x54, 0x69, 0x74, 0x6c, 0x65, + 0x00, 0x4f, 0x70, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x44, 0x72, 0x69, + 0x76, 0x65, 0x3e, 0x67, 0xba, 0x0c, 0x00, 0x00, 0x05, 0xe7, 0x49, 0x44, + 0x41, 0x54, 0x58, 0x85, 0xbd, 0x56, 0x7b, 0x6c, 0x93, 0x55, 0x14, 0xff, + 0xdd, 0xaf, 0xdd, 0xc3, 0x5a, 0x19, 0x45, 0x11, 0x0c, 0x23, 0x80, 0x88, + 0xc0, 0x30, 0xf2, 0x50, 0x54, 0x34, 0xc1, 0xc5, 0xa8, 0x88, 0xca, 0x00, + 0x61, 0x43, 0xd1, 0x45, 0x65, 0x44, 0x41, 0x0d, 0x2a, 0xe3, 0x35, 0x24, + 0x68, 0x21, 0x10, 0x1c, 0xd3, 0x89, 0xc8, 0x50, 0xe7, 0x93, 0x47, 0x94, + 0x96, 0x97, 0xdd, 0x56, 0x70, 0x28, 0x0c, 0xc9, 0x20, 0xba, 0x0d, 0x1c, + 0x3e, 0x88, 0x1a, 0x9d, 0x8f, 0x04, 0x75, 0x6c, 0xa5, 0xed, 0xda, 0x7e, + 0xdf, 0xbd, 0xb7, 0xdf, 0x3d, 0xfe, 0xc1, 0x68, 0xaa, 0x63, 0x6c, 0xad, + 0xe8, 0x49, 0xce, 0x1f, 0xdf, 0x77, 0xce, 0xf9, 0xfd, 0x7e, 0x39, 0xf7, + 0xdc, 0x9b, 0xc3, 0x88, 0x08, 0xc9, 0x5a, 0x43, 0x43, 0x43, 0x8a, 0xcf, + 0xdf, 0x5c, 0x64, 0xb7, 0x85, 0xd6, 0x8e, 0x1b, 0x97, 0xab, 0x27, 0x83, + 0xc1, 0x92, 0x15, 0x50, 0x53, 0x53, 0x63, 0x15, 0xa6, 0xfe, 0xa1, 0xcd, + 0x66, 0x9b, 0xa6, 0x47, 0x22, 0x1f, 0x47, 0x05, 0x26, 0x4f, 0x9c, 0x38, + 0x91, 0x27, 0x8a, 0xa3, 0x25, 0x43, 0xee, 0x76, 0xbb, 0x2d, 0x52, 0x45, + 0x36, 0x0d, 0x1c, 0x30, 0x68, 0xda, 0x2d, 0x37, 0x8d, 0xc7, 0xe0, 0x2b, + 0x87, 0x4c, 0xb0, 0xa4, 0xd2, 0x76, 0xb7, 0xdb, 0x9d, 0xfa, 0x9f, 0x0b, + 0x70, 0x3a, 0x9d, 0x5a, 0x46, 0x2f, 0xfb, 0x3b, 0x03, 0x32, 0x07, 0x3e, + 0x30, 0x64, 0xf0, 0x50, 0x70, 0x6e, 0x60, 0xd0, 0xc0, 0xc1, 0x18, 0xd0, + 0x7f, 0xd0, 0xbd, 0xa9, 0x17, 0x59, 0xb6, 0xd5, 0xd4, 0xd4, 0x58, 0x13, + 0x02, 0x24, 0xa2, 0x44, 0x9c, 0x55, 0xef, 0xaf, 0x7a, 0xeb, 0xbb, 0x1f, + 0x4e, 0x10, 0x11, 0x91, 0x52, 0x2a, 0xe6, 0x44, 0x44, 0xdf, 0x9c, 0xf8, + 0x8a, 0x3e, 0x74, 0x6f, 0x71, 0xb9, 0x5c, 0x2e, 0x4b, 0x77, 0x31, 0x13, + 0xea, 0x40, 0xf5, 0xfe, 0x3d, 0x1b, 0xfa, 0xf7, 0x1b, 0x58, 0x70, 0xf5, + 0x55, 0xc3, 0xa0, 0x94, 0xea, 0xe0, 0x59, 0xc3, 0xae, 0xc1, 0xd5, 0x57, + 0x0d, 0xcf, 0xd5, 0x8d, 0xe0, 0x26, 0xa7, 0xd3, 0xd9, 0x2d, 0xec, 0x6e, + 0xb7, 0x6b, 0xdf, 0xa7, 0xde, 0x75, 0xfd, 0xae, 0xc8, 0x9c, 0x3b, 0x74, + 0xc8, 0x70, 0x98, 0xa6, 0x09, 0xa5, 0x54, 0x87, 0x1c, 0xa5, 0x14, 0x46, + 0x8f, 0x1a, 0x0d, 0x21, 0xc5, 0xcc, 0x88, 0x61, 0x08, 0x00, 0xb3, 0x00, + 0x9c, 0x7f, 0xca, 0xbb, 0xd3, 0xa6, 0x8f, 0xf7, 0x79, 0xd7, 0x36, 0x1e, + 0x3f, 0x4a, 0x4a, 0x29, 0x92, 0x52, 0x92, 0x61, 0x18, 0x31, 0xe7, 0x9c, + 0xff, 0xed, 0x5b, 0x4a, 0x49, 0x4a, 0x29, 0x3a, 0x78, 0x70, 0x3f, 0xbd, + 0xfc, 0xea, 0x4b, 0x6f, 0x12, 0x11, 0x3b, 0x1f, 0x76, 0x97, 0xe4, 0xde, + 0x6a, 0xcf, 0xaa, 0xfa, 0x63, 0x75, 0xa4, 0x94, 0x22, 0xce, 0x39, 0x85, + 0xc3, 0xe1, 0x98, 0xeb, 0xba, 0x1e, 0xf3, 0xf8, 0xff, 0x9c, 0x73, 0x52, + 0x4a, 0xd1, 0xde, 0xea, 0x3d, 0xb4, 0xba, 0x78, 0xe5, 0x6b, 0x49, 0xcf, + 0x80, 0x77, 0xaf, 0xe7, 0xf9, 0x4b, 0x1d, 0xbd, 0x97, 0x8e, 0x19, 0x79, + 0x1d, 0xa4, 0x94, 0x10, 0x42, 0xc4, 0xce, 0x1b, 0x00, 0x42, 0xa1, 0x36, + 0xec, 0xae, 0xd8, 0x89, 0x40, 0xc0, 0x0f, 0xc6, 0x58, 0x2c, 0x26, 0x84, + 0x80, 0x10, 0x02, 0x77, 0xde, 0x3e, 0x01, 0x59, 0xc3, 0xae, 0x79, 0xf2, + 0x05, 0xe7, 0xb2, 0xd2, 0xce, 0x38, 0x3a, 0x15, 0xe0, 0xf1, 0xee, 0x2e, + 0x72, 0x38, 0x7a, 0xbd, 0x70, 0xfd, 0x98, 0x1b, 0x20, 0x84, 0x80, 0x61, + 0x18, 0x31, 0x02, 0xc6, 0x18, 0xc2, 0xe1, 0x10, 0xaa, 0xf6, 0x56, 0x9a, + 0xbe, 0xd6, 0x96, 0xe2, 0x8f, 0x2a, 0x76, 0x71, 0xbf, 0xff, 0xef, 0x22, + 0x38, 0xe7, 0xe0, 0x9c, 0x23, 0xe7, 0xde, 0xc9, 0x18, 0x3e, 0x7c, 0xc4, + 0x33, 0x8b, 0x96, 0x2c, 0x78, 0xb1, 0xdb, 0x02, 0x76, 0x57, 0xed, 0x2c, + 0xec, 0xd5, 0xd3, 0xb1, 0xfa, 0xc6, 0xb1, 0x37, 0x43, 0x4a, 0x01, 0xc3, + 0xd0, 0x41, 0xa4, 0x40, 0xa4, 0xa0, 0x69, 0x0c, 0x91, 0x48, 0x18, 0xde, + 0xbd, 0x15, 0x66, 0x30, 0x18, 0xc8, 0x7f, 0x62, 0xce, 0xbc, 0xc5, 0xc1, + 0xb6, 0x60, 0xee, 0xf6, 0x9d, 0xdb, 0x64, 0x30, 0x18, 0x80, 0xa6, 0xb1, + 0x58, 0x2e, 0xe7, 0x06, 0x38, 0x37, 0x90, 0x3b, 0x7d, 0x06, 0x46, 0x64, + 0x8d, 0x58, 0x34, 0x6f, 0xfe, 0x53, 0x2b, 0xff, 0xc9, 0xd5, 0xe1, 0x29, + 0xde, 0xe1, 0xd9, 0x71, 0xad, 0xa3, 0x47, 0x46, 0x63, 0xf6, 0xf8, 0xdb, + 0x20, 0x04, 0x87, 0xae, 0x47, 0x62, 0x31, 0x8b, 0xc5, 0x02, 0xce, 0x39, + 0x2a, 0xaa, 0x3c, 0x2a, 0x18, 0x0c, 0x3e, 0xf2, 0xcc, 0xbc, 0xc2, 0xcd, + 0x67, 0x63, 0xab, 0xd6, 0xac, 0x98, 0x9a, 0x9e, 0x9e, 0xee, 0x7a, 0x20, + 0x6f, 0xa6, 0xd5, 0x6e, 0xbf, 0x04, 0xa6, 0x19, 0x8d, 0xd5, 0xa5, 0xa7, + 0x5f, 0x84, 0xb4, 0xb4, 0x74, 0x94, 0xbd, 0xbe, 0x01, 0x8d, 0xc7, 0x8f, + 0x4f, 0x29, 0x7f, 0xbd, 0xfc, 0xa3, 0x4e, 0x3b, 0x10, 0x15, 0xc6, 0x13, + 0xa3, 0x46, 0x8e, 0x86, 0x94, 0x12, 0xa1, 0x70, 0x08, 0xa6, 0x52, 0x30, + 0x95, 0x02, 0x98, 0x06, 0x83, 0x73, 0x54, 0x78, 0x3d, 0x14, 0x38, 0x7d, + 0x7a, 0x76, 0x3c, 0x39, 0x00, 0x3c, 0xb7, 0x64, 0xf9, 0x2e, 0x9f, 0xcf, + 0xf7, 0xe0, 0xfb, 0x9b, 0xdf, 0x37, 0x83, 0xa1, 0x20, 0x18, 0xd3, 0x62, + 0xb5, 0xe1, 0x48, 0x18, 0x42, 0x08, 0xcc, 0xbc, 0x7f, 0x26, 0x64, 0xd4, + 0x98, 0x1e, 0x5f, 0xd7, 0xe1, 0x1d, 0x90, 0x42, 0xe6, 0x64, 0xf4, 0xe8, + 0x89, 0xb6, 0xb6, 0x20, 0x4c, 0xd3, 0x3c, 0x93, 0x64, 0xb5, 0x82, 0x73, + 0x03, 0x95, 0x55, 0x1e, 0xf2, 0xfb, 0x7d, 0x8f, 0x2f, 0x98, 0x5f, 0xf4, + 0x6e, 0x59, 0x79, 0xd9, 0x58, 0x0b, 0x43, 0xa1, 0x69, 0x9a, 0x93, 0x00, + 0x54, 0x0b, 0x69, 0x94, 0xac, 0x5a, 0xb1, 0xc6, 0xb5, 0x60, 0xf1, 0xb3, + 0x29, 0x6f, 0xbd, 0x5d, 0xbe, 0xa9, 0xe0, 0xd1, 0x02, 0xcd, 0x66, 0xbb, + 0x18, 0xd1, 0xe8, 0x99, 0x4e, 0x84, 0x42, 0x6d, 0xc8, 0xc8, 0xe8, 0x09, + 0xc9, 0xa3, 0x77, 0xc5, 0xf3, 0x75, 0xe8, 0x80, 0x90, 0xa2, 0xe2, 0xb4, + 0xdf, 0x87, 0xd4, 0xd4, 0x54, 0x90, 0x22, 0x68, 0x9a, 0x06, 0xc1, 0x05, + 0x2a, 0xbd, 0x1e, 0xb4, 0xb6, 0xfa, 0x9e, 0x5c, 0x30, 0xbf, 0xa8, 0xfc, + 0x8d, 0x37, 0xd6, 0x67, 0x65, 0xd8, 0xed, 0x9f, 0x4d, 0xc9, 0xb9, 0x2f, + 0xef, 0xb1, 0x82, 0xb9, 0xb6, 0x89, 0x13, 0xee, 0x99, 0x6c, 0xb7, 0xf7, + 0xd8, 0x57, 0x52, 0xb2, 0x26, 0xbb, 0xe4, 0xc5, 0xd2, 0xad, 0xcd, 0xcd, + 0x2d, 0xb3, 0x37, 0x6e, 0xdc, 0x48, 0xe1, 0x50, 0x18, 0x9a, 0xa6, 0x41, + 0x29, 0x05, 0x22, 0x42, 0x5d, 0xfd, 0xe7, 0x90, 0x52, 0xd6, 0x9e, 0x57, + 0x80, 0x34, 0x45, 0xf9, 0xa7, 0xfb, 0x3f, 0x51, 0xbf, 0xfe, 0xf6, 0x2b, + 0x14, 0x29, 0x9c, 0x3c, 0x79, 0x12, 0x9e, 0xca, 0x5d, 0x38, 0x75, 0xaa, + 0xe5, 0xe9, 0xc5, 0x0b, 0x8b, 0x36, 0x02, 0x40, 0x94, 0xd8, 0xa2, 0x5b, + 0xc7, 0xdf, 0x96, 0xd6, 0xfb, 0xb2, 0xde, 0x8c, 0x73, 0x03, 0xf6, 0x8b, + 0xed, 0x6c, 0xcc, 0xc8, 0xeb, 0xd2, 0xa1, 0x69, 0x0b, 0x01, 0xa0, 0x6c, + 0x7d, 0xd9, 0xbb, 0x7f, 0x36, 0xff, 0x31, 0x67, 0xdd, 0xfa, 0x52, 0x6a, + 0x6c, 0xfc, 0x12, 0x52, 0x4a, 0x7c, 0xfd, 0xed, 0xd7, 0xd8, 0xb2, 0x75, + 0x2b, 0x29, 0x06, 0x67, 0x3c, 0xdf, 0x39, 0xf7, 0x81, 0x75, 0xeb, 0x8a, + 0x87, 0x46, 0x09, 0x45, 0xca, 0x54, 0x77, 0x98, 0xa6, 0x59, 0x19, 0x55, + 0xd1, 0x0f, 0x96, 0x2d, 0x79, 0xbe, 0xe6, 0x6c, 0x7c, 0xfd, 0x86, 0x52, + 0xff, 0xc3, 0xf9, 0xb3, 0x32, 0x2c, 0x16, 0x0d, 0x42, 0x08, 0xb4, 0xfa, + 0x5a, 0xa1, 0x94, 0xc2, 0xf6, 0x1d, 0x6e, 0x31, 0x64, 0xf0, 0x57, 0xb6, + 0xdc, 0x5c, 0x97, 0x09, 0x00, 0xf9, 0xf9, 0x79, 0x43, 0x85, 0xa4, 0x67, + 0x89, 0x28, 0x07, 0x0c, 0x5e, 0x28, 0x6d, 0xb3, 0xcb, 0xe5, 0x3a, 0xd8, + 0xa5, 0x80, 0xae, 0xec, 0x95, 0x57, 0x5f, 0x7a, 0x6f, 0xdc, 0x4d, 0x37, + 0xe7, 0x67, 0x66, 0xf6, 0xd7, 0x22, 0x91, 0x30, 0xf4, 0x88, 0x8e, 0xdf, + 0x9b, 0x7f, 0xa7, 0xa3, 0xf5, 0x0d, 0x7b, 0x8a, 0x96, 0x2c, 0xbb, 0x27, + 0x11, 0xac, 0xa4, 0x16, 0x12, 0x5d, 0x8a, 0xe2, 0xc3, 0x47, 0x6a, 0x79, + 0xe3, 0xf1, 0x63, 0xa6, 0xcf, 0xd7, 0x8a, 0xa6, 0x5f, 0x7e, 0x52, 0xf5, + 0xf5, 0x75, 0x7a, 0x84, 0xf3, 0xb5, 0x89, 0x62, 0x25, 0xbd, 0x92, 0xad, + 0x5c, 0xb3, 0x72, 0x6c, 0x8a, 0xc6, 0x0a, 0xa5, 0x8c, 0x4e, 0x62, 0x8c, + 0x55, 0x0b, 0x83, 0x97, 0xac, 0x58, 0xb1, 0xba, 0xb6, 0xeb, 0xca, 0x0b, + 0x24, 0xe0, 0x42, 0x59, 0x62, 0xeb, 0x53, 0x9c, 0x2d, 0x5f, 0x5e, 0x34, + 0xd6, 0x62, 0xb5, 0x16, 0x4a, 0x53, 0x4d, 0x62, 0x0c, 0xd5, 0x5c, 0xc8, + 0x92, 0xe2, 0xd5, 0xc5, 0xff, 0x4f, 0x07, 0x96, 0x3a, 0x97, 0x66, 0xf5, + 0x71, 0x5c, 0xda, 0x30, 0x7d, 0xda, 0x8c, 0xb4, 0x3e, 0x7d, 0xfa, 0xb2, + 0xa6, 0xa6, 0x9f, 0x68, 0xfb, 0x4e, 0xb7, 0xd1, 0xdc, 0xd2, 0x72, 0x77, + 0xe9, 0xda, 0xd2, 0x9a, 0x44, 0xb0, 0x92, 0x1a, 0x42, 0x0b, 0xb4, 0x45, + 0x39, 0x39, 0x53, 0xd3, 0xfa, 0xf6, 0xbd, 0x82, 0x71, 0xce, 0xe1, 0x70, + 0x38, 0x58, 0xf6, 0xad, 0xd9, 0xe9, 0x9a, 0xc6, 0x16, 0x26, 0x8a, 0x95, + 0x94, 0x80, 0xa8, 0x94, 0x53, 0x1c, 0x3d, 0x1d, 0x4c, 0xd7, 0x23, 0x90, + 0x92, 0x23, 0x10, 0xf4, 0xc3, 0xe1, 0x70, 0x30, 0x61, 0x18, 0xb7, 0xe7, + 0xe5, 0xe5, 0x59, 0x2e, 0xb8, 0x00, 0xc6, 0x98, 0xc6, 0x18, 0xb3, 0x32, + 0xc6, 0x52, 0x18, 0x63, 0x69, 0x52, 0x46, 0x2b, 0x8f, 0x35, 0x1e, 0x53, + 0x81, 0x40, 0x00, 0x2d, 0x2d, 0x2d, 0x08, 0x87, 0x23, 0x38, 0xf1, 0xdd, + 0xb7, 0x44, 0x44, 0x07, 0xdc, 0x6e, 0x77, 0x4a, 0x7b, 0x9e, 0x95, 0x31, + 0xd6, 0x25, 0x7e, 0xa7, 0x43, 0xc8, 0x18, 0x63, 0x00, 0x2c, 0xed, 0x22, + 0xcf, 0xba, 0x0d, 0x80, 0xed, 0x8b, 0xba, 0xba, 0x0f, 0x34, 0x86, 0xe9, + 0xa7, 0xae, 0x6f, 0x4e, 0xc9, 0xcc, 0xec, 0xa7, 0xfd, 0xfc, 0x4b, 0x93, + 0xaa, 0xad, 0x3d, 0x22, 0x7e, 0xf8, 0xfe, 0xfb, 0xad, 0x00, 0x2e, 0x07, + 0xa0, 0x03, 0x08, 0x03, 0x50, 0x8c, 0x31, 0x05, 0x40, 0x01, 0x30, 0xe9, + 0x1c, 0x03, 0xd7, 0xa9, 0x00, 0x22, 0xa2, 0xf6, 0x62, 0x86, 0x33, 0x9b, + 0x2d, 0x01, 0x10, 0x00, 0xac, 0x87, 0x0e, 0x1c, 0xfa, 0x26, 0x55, 0xb3, + 0x3c, 0x74, 0xda, 0xef, 0x2f, 0xb0, 0x5a, 0xac, 0xd9, 0x42, 0xc8, 0xc3, + 0x4d, 0x3f, 0xfe, 0xf8, 0xf6, 0x81, 0x03, 0x9f, 0x1d, 0x6e, 0xcf, 0x11, + 0x71, 0x35, 0x04, 0x40, 0x9d, 0x8b, 0x1c, 0x48, 0xf0, 0x16, 0xb4, 0x77, + 0x25, 0xde, 0xe3, 0xcf, 0xdb, 0x8c, 0x27, 0xed, 0x8c, 0xf0, 0x5f, 0x09, + 0xf8, 0x2f, 0x2c, 0xa9, 0x5b, 0x70, 0x21, 0xed, 0x2f, 0xc1, 0x0b, 0x20, + 0xa9, 0x9d, 0x93, 0x25, 0x29, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, + 0x44, 0xae, 0x42, 0x60, 0x82 +}; +unsigned int go_up_png_len = 1673; +unsigned char go_down_png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, + 0x08, 0x06, 0x00, 0x00, 0x00, 0x73, 0x7a, 0x7a, 0xf4, 0x00, 0x00, 0x00, + 0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64, + 0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0d, + 0xd7, 0x00, 0x00, 0x0d, 0xd7, 0x01, 0x42, 0x28, 0x9b, 0x78, 0x00, 0x00, + 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, + 0x72, 0x65, 0x00, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x6b, 0x73, 0x63, + 0x61, 0x70, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x9b, 0xee, 0x3c, 0x1a, 0x00, + 0x00, 0x00, 0x13, 0x74, 0x45, 0x58, 0x74, 0x54, 0x69, 0x74, 0x6c, 0x65, + 0x00, 0x4f, 0x70, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x44, 0x72, 0x69, + 0x76, 0x65, 0x3e, 0x67, 0xba, 0x0c, 0x00, 0x00, 0x06, 0x22, 0x49, 0x44, + 0x41, 0x54, 0x58, 0x85, 0xc5, 0x57, 0x6b, 0x70, 0x54, 0x45, 0x16, 0xfe, + 0xfa, 0x3e, 0x32, 0x99, 0x41, 0x32, 0x99, 0x41, 0x89, 0xc1, 0x72, 0x6b, + 0x2d, 0xcb, 0x07, 0xb0, 0xba, 0x3f, 0x76, 0xb1, 0xd0, 0x5a, 0x75, 0xab, + 0xd6, 0xc7, 0x2e, 0x12, 0x85, 0x8a, 0x41, 0x31, 0xa5, 0x31, 0x24, 0x24, + 0xc1, 0x84, 0x09, 0x90, 0x51, 0x16, 0x75, 0xd1, 0x20, 0x42, 0x2d, 0x89, + 0xae, 0xa8, 0x71, 0x42, 0x06, 0x82, 0x62, 0x45, 0x19, 0x06, 0x14, 0x45, + 0x57, 0x01, 0x63, 0x45, 0xb7, 0x90, 0x97, 0x29, 0x25, 0x0a, 0x81, 0xc4, + 0x37, 0x43, 0x32, 0x93, 0xf7, 0x4c, 0x1e, 0x73, 0x73, 0xef, 0xed, 0x3e, + 0xfb, 0x23, 0x0f, 0xc2, 0x2b, 0x66, 0x52, 0xae, 0xdb, 0x55, 0xe7, 0xcf, + 0xed, 0x3e, 0xdf, 0xf7, 0x75, 0x9f, 0xd3, 0x7d, 0xce, 0x65, 0x44, 0x84, + 0xf1, 0x8c, 0xea, 0xea, 0x0f, 0x67, 0x90, 0xc4, 0x8a, 0x88, 0x28, 0x85, + 0x81, 0xed, 0x21, 0x2e, 0x4a, 0x6f, 0xbf, 0xfd, 0x6f, 0xfb, 0x62, 0xc5, + 0x61, 0xe3, 0x11, 0x50, 0x5d, 0xfd, 0xc1, 0x34, 0x8b, 0x6d, 0x42, 0xed, + 0xf4, 0xa9, 0xbf, 0xb3, 0x24, 0x4c, 0xb4, 0xb3, 0xd6, 0xd6, 0x10, 0x1d, + 0x6f, 0x3c, 0xa6, 0xf5, 0xf4, 0xf6, 0xcc, 0x9a, 0xfd, 0xd7, 0x39, 0x35, + 0xb1, 0x60, 0x49, 0x31, 0xb3, 0x03, 0x10, 0x12, 0x7b, 0x6c, 0xea, 0xd5, + 0xd3, 0x2c, 0x09, 0x13, 0xed, 0x4c, 0xd3, 0xa2, 0x50, 0x14, 0x95, 0x25, + 0x27, 0x5d, 0x16, 0x0f, 0xc2, 0xa3, 0xb1, 0x62, 0x8d, 0x4b, 0x00, 0x88, + 0xe6, 0x58, 0x2c, 0x16, 0xa6, 0x69, 0x7d, 0x30, 0x0c, 0x1d, 0xe1, 0x48, + 0x17, 0x64, 0x45, 0x66, 0x86, 0x61, 0xde, 0xe6, 0xf7, 0xfb, 0xe5, 0xff, + 0xb9, 0x00, 0xd3, 0xe4, 0x3b, 0x4f, 0x06, 0x7e, 0x12, 0x5d, 0xe1, 0x30, + 0xda, 0xda, 0xdb, 0xd0, 0xdb, 0xdb, 0x87, 0xf6, 0x8e, 0x56, 0x12, 0x42, + 0x7c, 0x94, 0x96, 0x96, 0xc6, 0x63, 0xc1, 0x52, 0xc6, 0x23, 0x40, 0xe7, + 0x7c, 0xdd, 0x77, 0x3f, 0x7c, 0x3b, 0xcf, 0x99, 0xe8, 0x8c, 0xb3, 0xc4, + 0x5b, 0xe4, 0xbe, 0x68, 0x8f, 0x08, 0x06, 0x5b, 0x34, 0x93, 0x1b, 0x25, + 0xb1, 0x62, 0x8d, 0x2b, 0x09, 0x01, 0xe0, 0xad, 0x5d, 0xbe, 0x19, 0x10, + 0x52, 0x91, 0x10, 0x22, 0x85, 0x04, 0xf6, 0xe8, 0x5c, 0x2b, 0x4d, 0x9f, + 0x97, 0xf1, 0xeb, 0xdc, 0x82, 0x5f, 0x72, 0x8c, 0x2b, 0x04, 0x00, 0xe0, + 0xf3, 0x55, 0xcd, 0x20, 0x09, 0x45, 0x5c, 0x98, 0x29, 0x24, 0xb0, 0x87, + 0xeb, 0x66, 0x69, 0x46, 0x46, 0xd6, 0xaf, 0x73, 0x02, 0x55, 0xfe, 0xaa, + 0x69, 0x13, 0x6d, 0xd6, 0xda, 0x9b, 0x66, 0xde, 0x6c, 0x71, 0x24, 0x3a, + 0x59, 0x53, 0xd3, 0x29, 0xda, 0x7f, 0xf0, 0x33, 0x2d, 0xd2, 0xd5, 0x35, + 0x2b, 0x3b, 0x3b, 0xaf, 0x26, 0x16, 0xac, 0xf1, 0x5d, 0x43, 0xce, 0x1f, + 0xbb, 0xe1, 0x0f, 0x33, 0x2d, 0x4e, 0x87, 0x93, 0x69, 0x9a, 0x06, 0xab, + 0xd5, 0xca, 0xae, 0xbd, 0xe6, 0xda, 0x78, 0x92, 0x63, 0x7f, 0x07, 0xce, + 0x1b, 0x02, 0xff, 0xdb, 0x6f, 0xde, 0x28, 0x0c, 0x91, 0x61, 0x0a, 0x9e, + 0xc2, 0x05, 0xff, 0x37, 0x27, 0xfc, 0x2b, 0x33, 0x3d, 0xf3, 0xd8, 0xd0, + 0xbc, 0xc9, 0xcd, 0x39, 0x36, 0xdb, 0x04, 0xd6, 0xdb, 0xdb, 0x0b, 0xd3, + 0x34, 0xd0, 0x15, 0xee, 0x44, 0xbc, 0x35, 0x9e, 0x99, 0xba, 0x71, 0x9b, + 0xdf, 0xef, 0x97, 0x87, 0xae, 0x62, 0xd1, 0xdf, 0x8b, 0x6e, 0x22, 0xd3, + 0x4c, 0xe7, 0x9c, 0xdf, 0xc3, 0x05, 0xff, 0x84, 0xeb, 0x58, 0xeb, 0xf1, + 0x78, 0xbe, 0x3e, 0x83, 0x8c, 0x88, 0xce, 0xb0, 0xaa, 0xed, 0x55, 0x57, + 0x7d, 0xb0, 0xfb, 0x3d, 0xb3, 0xb3, 0xab, 0x83, 0x38, 0xe7, 0xd4, 0xd1, + 0xd9, 0x41, 0x3b, 0xdf, 0xd9, 0x21, 0x3c, 0x1b, 0x5e, 0x74, 0x0d, 0xad, + 0xa9, 0xdc, 0xec, 0x7d, 0xb5, 0xb6, 0xf6, 0x30, 0x3f, 0x19, 0xf8, 0x91, + 0x4e, 0x34, 0xd4, 0xd3, 0x91, 0x23, 0x5f, 0xd0, 0xc7, 0x9f, 0xec, 0x15, + 0x2f, 0x7b, 0xd6, 0xbf, 0x3f, 0xb4, 0xa6, 0xa8, 0xc8, 0x95, 0x53, 0xfa, + 0x7c, 0x89, 0x68, 0xef, 0x68, 0x27, 0x21, 0x38, 0x45, 0x22, 0x61, 0x5a, + 0xb3, 0xf6, 0x19, 0x91, 0x91, 0x95, 0xfe, 0x97, 0x91, 0x7c, 0xe7, 0x84, + 0x80, 0xf7, 0xeb, 0x4f, 0xdf, 0xf0, 0xc7, 0x99, 0xb2, 0xcd, 0x6a, 0x1b, + 0xd8, 0x59, 0x7c, 0x3c, 0x66, 0xdf, 0x75, 0x0f, 0x73, 0x38, 0x2e, 0x59, + 0xff, 0xfc, 0x0b, 0x25, 0x8b, 0x00, 0x40, 0x27, 0xbe, 0xee, 0xcb, 0xba, + 0xda, 0xfe, 0x13, 0x0d, 0xc7, 0x79, 0x38, 0x12, 0x46, 0x53, 0x28, 0x20, + 0x8e, 0x1e, 0x3d, 0x1a, 0x8d, 0x6a, 0x7a, 0x09, 0x00, 0x14, 0x2e, 0x5b, + 0x9c, 0x39, 0x79, 0x4a, 0x72, 0xb9, 0x6b, 0x71, 0x21, 0xb3, 0x5a, 0xad, + 0x68, 0xef, 0x68, 0x87, 0xa2, 0x28, 0x58, 0xb4, 0xa8, 0x80, 0x99, 0xfd, + 0x3c, 0x67, 0x24, 0xdf, 0x39, 0x02, 0x0c, 0xc3, 0xb8, 0xc5, 0x6e, 0xb7, + 0xa3, 0xbb, 0xa7, 0x1b, 0x9a, 0xa6, 0xa1, 0xb3, 0xb3, 0x03, 0x51, 0x2d, + 0x8a, 0xd4, 0xb9, 0xf7, 0x62, 0xd2, 0xa4, 0x8b, 0xcb, 0xd6, 0xfe, 0x73, + 0xd5, 0xc2, 0xdc, 0xcc, 0xdc, 0x63, 0x5a, 0x9f, 0x76, 0x6b, 0x43, 0xc3, + 0x89, 0xed, 0x07, 0x0e, 0xec, 0xef, 0x6b, 0x6c, 0xfc, 0xe6, 0xdd, 0x68, + 0xbf, 0x7e, 0x87, 0x7b, 0x89, 0xbb, 0xc6, 0xb5, 0x34, 0x3f, 0x3d, 0x69, + 0x72, 0xd2, 0xc6, 0xa5, 0x8b, 0x97, 0x31, 0xbd, 0x5f, 0x47, 0x67, 0x67, + 0x07, 0x74, 0x5d, 0x47, 0x38, 0x12, 0xc6, 0x45, 0x13, 0x2e, 0x82, 0x6e, + 0x18, 0xb3, 0x8a, 0x8b, 0x8b, 0x4f, 0xf3, 0x9e, 0x1d, 0x82, 0x72, 0x6f, + 0x99, 0xa7, 0xb5, 0xb5, 0x85, 0xba, 0xbb, 0xbb, 0xe9, 0xa7, 0x93, 0x3f, + 0x0e, 0x5b, 0x77, 0x77, 0x84, 0x74, 0x5d, 0x27, 0x4f, 0x79, 0x99, 0x58, + 0xb9, 0x72, 0x45, 0xe6, 0xd9, 0x7e, 0x44, 0x84, 0x7c, 0x57, 0xde, 0xbc, + 0xe2, 0xd5, 0x2b, 0xcd, 0xfe, 0xfe, 0x7e, 0xea, 0xee, 0x39, 0xd3, 0xbf, + 0x39, 0xd8, 0x44, 0x1f, 0xd7, 0x54, 0x53, 0xda, 0x7d, 0xa9, 0x5b, 0x47, + 0x0d, 0x81, 0xa1, 0xe9, 0xbe, 0x3d, 0x7b, 0x3f, 0x44, 0x4f, 0x6f, 0x0f, + 0x24, 0x49, 0x02, 0xe7, 0x1c, 0x9c, 0x73, 0xb4, 0xb5, 0xb7, 0x41, 0xd3, + 0x34, 0x2c, 0xc8, 0xcc, 0x66, 0x76, 0xe7, 0xa4, 0x8d, 0xee, 0xe5, 0xee, + 0x07, 0x47, 0xfa, 0x2d, 0x2a, 0xc8, 0x99, 0x9b, 0x68, 0x77, 0x56, 0x2d, + 0x77, 0x3f, 0x2e, 0xeb, 0x86, 0x8e, 0xb6, 0xb6, 0xd6, 0x61, 0x5f, 0xc6, + 0x24, 0xe8, 0xba, 0x81, 0xf7, 0x76, 0xed, 0x02, 0x23, 0x7a, 0x65, 0xd4, + 0x10, 0x14, 0x14, 0x2c, 0xa9, 0x09, 0x04, 0x4f, 0xb9, 0xdf, 0xdd, 0xf5, + 0x36, 0x4c, 0xd3, 0x84, 0xc4, 0x24, 0x70, 0xd3, 0x04, 0x37, 0x4d, 0xb4, + 0xb4, 0x04, 0xa1, 0x69, 0x1a, 0xf2, 0xf3, 0x0a, 0x24, 0xa7, 0x23, 0x71, + 0xb3, 0xcb, 0x95, 0x3f, 0x1f, 0x00, 0xf2, 0xf2, 0xb2, 0x53, 0x12, 0x13, + 0x1c, 0xbe, 0x27, 0x56, 0x3c, 0xa9, 0x18, 0x86, 0x8e, 0x50, 0xb0, 0x79, + 0xd8, 0x47, 0x62, 0x0c, 0x82, 0x9b, 0x28, 0x7b, 0xe5, 0x25, 0x04, 0x4e, + 0x05, 0x56, 0xfb, 0x7c, 0x3b, 0x3e, 0x1d, 0xc9, 0x77, 0xc1, 0x87, 0x68, + 0xf5, 0x9a, 0xa7, 0x56, 0x24, 0xda, 0x9d, 0x6b, 0x66, 0xcf, 0xbe, 0x1b, + 0x44, 0x80, 0x61, 0xe8, 0xc3, 0x73, 0x97, 0x5e, 0x9a, 0x0c, 0x55, 0x55, + 0xf1, 0xec, 0x9a, 0x55, 0xbc, 0x25, 0x14, 0x7a, 0x2e, 0xc1, 0x9e, 0x58, + 0xb8, 0xaa, 0x78, 0xb5, 0x45, 0x70, 0x8e, 0xa6, 0xe6, 0xa6, 0xe1, 0x75, + 0xaa, 0xa2, 0x82, 0x31, 0x86, 0x72, 0x6f, 0x39, 0xbe, 0xff, 0xf6, 0xbb, + 0x75, 0xbe, 0xad, 0xfe, 0xe5, 0x67, 0xf3, 0x8c, 0xfa, 0x12, 0x3e, 0xf1, + 0x8f, 0xe5, 0x4f, 0x5d, 0x7c, 0xc9, 0xe4, 0xa7, 0x53, 0xe7, 0xde, 0x0b, + 0x80, 0x60, 0x18, 0xc6, 0xf0, 0x5c, 0x52, 0x52, 0x32, 0x64, 0x49, 0x42, + 0x49, 0xe9, 0x3a, 0xb8, 0x8b, 0x1e, 0x05, 0x11, 0x10, 0x0c, 0x9d, 0x26, + 0x57, 0x14, 0x05, 0x92, 0x24, 0x63, 0x43, 0x45, 0x39, 0x1a, 0x1b, 0x1a, + 0x5f, 0xf0, 0x6d, 0xf5, 0x2f, 0x3d, 0x1f, 0xc7, 0xcf, 0x3e, 0xc5, 0xcb, + 0xdc, 0x4b, 0x9e, 0x4d, 0x4e, 0x9e, 0xf2, 0xf8, 0xfc, 0xfb, 0xef, 0x07, + 0x11, 0x60, 0x9a, 0xe6, 0x69, 0x11, 0x93, 0x93, 0x60, 0xb5, 0xda, 0x10, + 0xd5, 0xa2, 0x08, 0x85, 0x82, 0xc3, 0xdf, 0x65, 0x59, 0x81, 0x2c, 0xcb, + 0xd8, 0x50, 0xe1, 0x41, 0x7d, 0xfd, 0xf1, 0x32, 0xbf, 0x6f, 0x7b, 0xc1, + 0x85, 0xf0, 0xc7, 0x54, 0x0b, 0x1e, 0xc9, 0xcf, 0x2b, 0xf9, 0xcd, 0xe5, + 0x97, 0xbb, 0x1f, 0xca, 0x78, 0x18, 0x20, 0xc0, 0xe4, 0xa7, 0x45, 0x24, + 0x24, 0xd8, 0x11, 0x89, 0x84, 0x47, 0x90, 0xcb, 0x90, 0x24, 0x19, 0x5e, + 0xef, 0x06, 0x7c, 0x75, 0xec, 0x6b, 0xef, 0xf6, 0xad, 0x3b, 0x72, 0x69, + 0x14, 0x92, 0x31, 0x17, 0xa3, 0x05, 0x59, 0x0f, 0xad, 0xff, 0xed, 0x15, + 0x57, 0xba, 0x72, 0x16, 0xe6, 0x02, 0x20, 0x70, 0x7e, 0x6e, 0xe3, 0x23, + 0x4b, 0x32, 0x24, 0x59, 0x42, 0x85, 0xb7, 0x02, 0x75, 0x75, 0x47, 0x5e, + 0xf5, 0xfb, 0x76, 0x2c, 0x18, 0x8d, 0x1c, 0x88, 0xa1, 0x18, 0x55, 0x6e, + 0xda, 0x52, 0x58, 0x5f, 0x5f, 0xef, 0xa9, 0xa8, 0xf0, 0x40, 0x96, 0x65, + 0xc4, 0xa9, 0x71, 0x90, 0x65, 0x79, 0xd8, 0x54, 0x55, 0x85, 0x1a, 0xa7, + 0xa2, 0xb2, 0x72, 0x13, 0xea, 0xea, 0x8e, 0xbc, 0x31, 0x7d, 0xea, 0x75, + 0x59, 0x3f, 0x47, 0x0e, 0xc4, 0x58, 0x8e, 0x19, 0x63, 0x2c, 0xed, 0xbe, + 0x54, 0xef, 0xf5, 0xd7, 0xff, 0x3e, 0xeb, 0x91, 0xbc, 0x7c, 0x00, 0x04, + 0x21, 0x04, 0x24, 0x49, 0x82, 0x24, 0x49, 0xd8, 0xb8, 0xc9, 0x8b, 0xc3, + 0x87, 0x0f, 0xf9, 0x49, 0x48, 0xf3, 0xb7, 0x6d, 0xdb, 0x36, 0xa6, 0xde, + 0x30, 0xa6, 0x72, 0x4c, 0x44, 0x34, 0x7d, 0xea, 0x75, 0x39, 0x5f, 0xd5, + 0x7d, 0xb9, 0xa5, 0x62, 0x63, 0xf9, 0xc0, 0x49, 0xc4, 0xc5, 0x41, 0x51, + 0x54, 0x6c, 0x7e, 0x6d, 0x33, 0x0e, 0x1d, 0x3e, 0xb4, 0xb3, 0x25, 0xd4, + 0xfe, 0xc0, 0x58, 0xc9, 0x81, 0x31, 0x76, 0x44, 0x8c, 0x31, 0x69, 0x50, + 0x2c, 0x03, 0x20, 0x39, 0x1c, 0x0e, 0x97, 0x29, 0xc4, 0x04, 0x45, 0xf1, + 0xa6, 0xe6, 0x64, 0xe7, 0x62, 0xcb, 0xeb, 0xaf, 0x61, 0xdf, 0xbe, 0xff, + 0xec, 0x3e, 0xb8, 0xff, 0xf3, 0xac, 0x40, 0x20, 0xa0, 0x30, 0xc6, 0x18, + 0x00, 0x02, 0x20, 0x88, 0x48, 0x8c, 0x8a, 0x7d, 0xa1, 0x10, 0x0c, 0x82, + 0xc8, 0x83, 0xc4, 0x43, 0x66, 0x1b, 0x34, 0xab, 0xaa, 0xaa, 0x13, 0xef, + 0x9c, 0x75, 0x47, 0xc9, 0x65, 0x53, 0xa6, 0xfc, 0xb9, 0xb9, 0x39, 0x78, + 0x70, 0xef, 0xee, 0x8f, 0x0a, 0xa3, 0xd1, 0x68, 0x17, 0x80, 0xe8, 0xa0, + 0xf5, 0x02, 0x10, 0x23, 0x8c, 0x9f, 0x2f, 0x27, 0x46, 0xcd, 0x81, 0xc1, + 0x9d, 0x8f, 0x14, 0xa1, 0x0e, 0x0a, 0x88, 0x07, 0x60, 0xb1, 0xd9, 0x6c, + 0xb6, 0x9b, 0x6f, 0xfd, 0xd3, 0xc2, 0x03, 0x9f, 0x1d, 0xac, 0x0c, 0x87, + 0xc3, 0x3d, 0x00, 0xb4, 0x41, 0x8b, 0x02, 0xd0, 0xcf, 0x22, 0x3f, 0xef, + 0x49, 0xc4, 0x9c, 0x84, 0x18, 0x08, 0xc3, 0x90, 0x8d, 0xfc, 0x0b, 0xe2, + 0x18, 0x38, 0x76, 0xc2, 0x40, 0xba, 0x8c, 0x09, 0xf8, 0xff, 0xde, 0x96, + 0x8f, 0xaf, 0x29, 0xfd, 0x05, 0xc7, 0x7f, 0x01, 0x0d, 0x13, 0x7d, 0x85, + 0x4b, 0xbd, 0xae, 0xde, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, + 0xae, 0x42, 0x60, 0x82 +}; +unsigned int go_down_png_len = 1732; +unsigned char folder_new_png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, + 0x08, 0x06, 0x00, 0x00, 0x00, 0x73, 0x7a, 0x7a, 0xf4, 0x00, 0x00, 0x00, + 0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64, + 0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0d, + 0xd7, 0x00, 0x00, 0x0d, 0xd7, 0x01, 0x42, 0x28, 0x9b, 0x78, 0x00, 0x00, + 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, + 0x72, 0x65, 0x00, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x6b, 0x73, 0x63, + 0x61, 0x70, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x9b, 0xee, 0x3c, 0x1a, 0x00, + 0x00, 0x00, 0x0e, 0x74, 0x45, 0x58, 0x74, 0x54, 0x69, 0x74, 0x6c, 0x65, + 0x00, 0x46, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x21, 0x54, 0xaa, 0x60, + 0x41, 0x00, 0x00, 0x00, 0x17, 0x74, 0x45, 0x58, 0x74, 0x41, 0x75, 0x74, + 0x68, 0x6f, 0x72, 0x00, 0x4c, 0x61, 0x70, 0x6f, 0x20, 0x43, 0x61, 0x6c, + 0x61, 0x6d, 0x61, 0x6e, 0x64, 0x72, 0x65, 0x69, 0xdf, 0x91, 0x1a, 0x2a, + 0x00, 0x00, 0x00, 0x29, 0x74, 0x45, 0x58, 0x74, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x42, 0x61, 0x73, 0x65, + 0x64, 0x20, 0x6f, 0x66, 0x20, 0x4a, 0x61, 0x6b, 0x75, 0x62, 0x20, 0x53, + 0x74, 0x65, 0x69, 0x6e, 0x65, 0x72, 0x20, 0x64, 0x65, 0x73, 0x69, 0x67, + 0x6e, 0xa0, 0x84, 0x05, 0x73, 0x00, 0x00, 0x04, 0xda, 0x49, 0x44, 0x41, + 0x54, 0x58, 0xc3, 0xcd, 0x96, 0x4d, 0x8c, 0x14, 0x55, 0x10, 0xc7, 0x7f, + 0xf5, 0xba, 0xa7, 0x67, 0x67, 0x66, 0xbf, 0x70, 0x65, 0x05, 0x54, 0x40, + 0x20, 0x0b, 0xca, 0xa2, 0x22, 0x86, 0x84, 0x68, 0x22, 0xd1, 0x68, 0xa2, + 0x89, 0x1c, 0x4c, 0xbc, 0xe8, 0x41, 0x21, 0xf1, 0xa0, 0x26, 0x26, 0x7a, + 0xf3, 0x60, 0x00, 0x0f, 0x1e, 0x38, 0x9a, 0x78, 0xf0, 0x60, 0x4c, 0x4c, + 0x3c, 0xa8, 0x17, 0x0e, 0x1e, 0x94, 0x8b, 0x24, 0xa2, 0xc1, 0xf8, 0x15, + 0x40, 0x3e, 0x25, 0xa8, 0x51, 0xcc, 0xae, 0xeb, 0xc2, 0xb2, 0xbb, 0x33, + 0xd3, 0xd3, 0xfd, 0x5e, 0x95, 0x87, 0x99, 0x9d, 0x65, 0xd8, 0x55, 0x48, + 0x58, 0x36, 0x56, 0x3a, 0xe9, 0xee, 0x4a, 0xbf, 0xfa, 0xff, 0xfb, 0xff, + 0xaa, 0xea, 0x95, 0x70, 0x83, 0xcc, 0x6c, 0x5b, 0xa9, 0x56, 0x9b, 0xe8, + 0x77, 0xae, 0x2b, 0x51, 0x4d, 0xb3, 0x72, 0x79, 0x6a, 0x42, 0xe4, 0x8f, + 0xfa, 0x95, 0xdf, 0xc9, 0x82, 0x03, 0x5f, 0x58, 0xd3, 0x57, 0x2b, 0x96, + 0x86, 0x42, 0x70, 0xb7, 0x3a, 0xb4, 0x5f, 0xa0, 0xe0, 0x1c, 0x99, 0xaa, + 0x4d, 0x10, 0xb9, 0xf3, 0x69, 0x9a, 0x9e, 0x19, 0x18, 0x38, 0x3b, 0x79, + 0x43, 0x08, 0x54, 0xab, 0x9b, 0x57, 0x44, 0xf8, 0x7b, 0xd5, 0x74, 0xbd, + 0x1a, 0xab, 0x9c, 0xd9, 0x00, 0x52, 0x28, 0x22, 0x3e, 0x55, 0x63, 0xdc, + 0x09, 0xbf, 0x59, 0xb0, 0xd3, 0x16, 0xc9, 0x8f, 0xdd, 0xdd, 0xc7, 0x47, + 0x00, 0xe2, 0x85, 0x02, 0xbf, 0x78, 0x71, 0x75, 0x3f, 0x3e, 0xdf, 0x6c, + 0xb1, 0xdd, 0x67, 0x66, 0x9b, 0x04, 0x5b, 0x67, 0x52, 0x5a, 0xde, 0x55, + 0xde, 0x3f, 0x98, 0xa5, 0xaf, 0xfc, 0x2d, 0x76, 0xfa, 0x0f, 0x35, 0x39, + 0x2b, 0x4e, 0xba, 0x25, 0x18, 0x66, 0xeb, 0x0f, 0x89, 0x9c, 0x9e, 0x6a, + 0x13, 0x78, 0x73, 0xd7, 0x3d, 0x9f, 0x0a, 0x3c, 0x71, 0x35, 0x55, 0x04, + 0x72, 0x8c, 0xcf, 0xbc, 0x8b, 0x5e, 0xdb, 0xf3, 0xde, 0x0f, 0x67, 0x67, + 0xfc, 0x45, 0x57, 0x19, 0x52, 0xb1, 0xf5, 0xa6, 0xb6, 0x09, 0xd3, 0xfb, + 0xc5, 0xf5, 0xae, 0x2a, 0x24, 0xaf, 0xaa, 0x73, 0xb7, 0xbb, 0xa4, 0xf8, + 0xfa, 0xcd, 0x69, 0xfd, 0xe5, 0xa5, 0x42, 0xb5, 0x4f, 0x10, 0x53, 0x64, + 0xba, 0x76, 0xa9, 0x30, 0x06, 0x7c, 0xd7, 0x06, 0x7b, 0x73, 0xe7, 0x3d, + 0xb6, 0xe5, 0x91, 0x67, 0x31, 0x0d, 0x4d, 0x20, 0x91, 0x56, 0x32, 0xd9, + 0x95, 0xd9, 0xc5, 0xe8, 0xef, 0x27, 0xeb, 0xe7, 0xcf, 0x1d, 0x4b, 0xcd, + 0xec, 0xc5, 0xdd, 0xef, 0x1f, 0xf9, 0x68, 0x64, 0xe4, 0xee, 0x4a, 0x4f, + 0xd9, 0x1e, 0x35, 0xd1, 0xed, 0x91, 0x5b, 0xfa, 0xb0, 0xb8, 0xcd, 0xc3, + 0x71, 0xbc, 0xc3, 0x47, 0xf1, 0x83, 0x31, 0xc4, 0x02, 0xa0, 0x7a, 0x38, + 0xf7, 0xd9, 0xfe, 0x58, 0xc3, 0xa9, 0x13, 0x41, 0xcf, 0x1c, 0x10, 0xdc, + 0xc1, 0x72, 0x4f, 0xf5, 0x40, 0x9b, 0xc0, 0xde, 0x9d, 0x77, 0xdb, 0xf0, + 0xb6, 0x27, 0x99, 0xbc, 0xf0, 0xd7, 0x55, 0xc4, 0x16, 0x92, 0xae, 0x32, + 0x91, 0x13, 0xce, 0x9d, 0xf8, 0x7a, 0x3c, 0x6f, 0xd4, 0x07, 0xba, 0xfb, + 0x60, 0xf5, 0x06, 0x63, 0xe5, 0x7a, 0x65, 0x78, 0xeb, 0x6e, 0xba, 0xca, + 0x4f, 0xff, 0xeb, 0x6a, 0x9f, 0xff, 0xcc, 0x99, 0xa3, 0x4f, 0x9d, 0x5b, + 0xb5, 0xc1, 0xf6, 0x52, 0x95, 0xcf, 0xe3, 0xcb, 0x7e, 0x0c, 0x55, 0x50, + 0xb5, 0x7f, 0x29, 0x2b, 0x00, 0xc3, 0xcc, 0xc8, 0xa7, 0x26, 0x89, 0x0b, + 0x09, 0x6b, 0x37, 0x3d, 0x3c, 0x50, 0x2c, 0x95, 0x29, 0x55, 0xaa, 0x0c, + 0xdc, 0x32, 0xc2, 0x4d, 0x83, 0x23, 0x34, 0xd2, 0x7d, 0x14, 0x8a, 0xc3, + 0x44, 0xd1, 0x9d, 0x73, 0x63, 0xe8, 0x18, 0xf5, 0xe9, 0x97, 0xa8, 0x57, + 0x6d, 0x8d, 0x28, 0x89, 0xf4, 0x90, 0x74, 0x10, 0x68, 0x64, 0x19, 0x69, + 0x23, 0x9b, 0xbb, 0x10, 0x08, 0x41, 0x69, 0x64, 0x39, 0xf5, 0x34, 0x23, + 0xf7, 0xda, 0x22, 0xf3, 0x27, 0x00, 0xdd, 0xbd, 0x9e, 0xb5, 0x43, 0x75, + 0x82, 0xab, 0x51, 0xe9, 0x6b, 0x10, 0x17, 0xdf, 0xa6, 0x52, 0x79, 0x07, + 0x70, 0x1d, 0x71, 0x1a, 0xe9, 0xbb, 0xa4, 0xe9, 0x5f, 0x68, 0x0e, 0xe6, + 0xc8, 0x6c, 0x8a, 0xac, 0x83, 0x40, 0xb5, 0x5a, 0xa7, 0x5a, 0x4b, 0xe7, + 0xca, 0x16, 0x94, 0x5a, 0xbd, 0xc1, 0x92, 0xde, 0x2e, 0x86, 0x56, 0x0e, + 0xe0, 0xa4, 0x53, 0x25, 0x17, 0x29, 0x83, 0xfd, 0x97, 0xa8, 0xc4, 0x8e, + 0x90, 0x05, 0x84, 0x53, 0xf3, 0xe6, 0xb2, 0xc8, 0x28, 0x3e, 0x2d, 0x52, + 0x2e, 0xf7, 0x72, 0xfc, 0xab, 0xca, 0xf3, 0x5b, 0x1f, 0x3b, 0xfa, 0xf1, + 0x2c, 0x01, 0x8c, 0xf3, 0xa3, 0xe3, 0x5c, 0x18, 0xfb, 0x7b, 0x8e, 0xf4, + 0x86, 0xb2, 0x61, 0xf5, 0x20, 0x6b, 0xd6, 0xdd, 0xc5, 0x03, 0x8f, 0x3f, + 0x43, 0x5c, 0x28, 0xce, 0x93, 0x1a, 0xa7, 0x11, 0x77, 0x02, 0xdc, 0xc9, + 0x16, 0x41, 0x41, 0xf5, 0x04, 0xea, 0xbf, 0x45, 0xdc, 0x1d, 0x44, 0xf1, + 0x83, 0x88, 0x0c, 0xd1, 0xb3, 0x24, 0xa3, 0xa7, 0x77, 0x03, 0x87, 0x3e, + 0xfd, 0x66, 0xbb, 0xc8, 0xaf, 0x69, 0x0c, 0xf0, 0xe1, 0xbe, 0xe7, 0xde, + 0x0d, 0x6a, 0x4d, 0xce, 0xcb, 0x6e, 0x9b, 0x13, 0x3b, 0x98, 0xb0, 0x66, + 0xe3, 0x36, 0x86, 0xb7, 0x3c, 0x84, 0x4f, 0xab, 0xe4, 0xf5, 0xa9, 0xb9, + 0xf8, 0xae, 0x84, 0x2b, 0xf4, 0xe1, 0xa2, 0x5b, 0xd0, 0xc2, 0x28, 0xaa, + 0xaf, 0x60, 0xfa, 0x1d, 0x22, 0x19, 0x66, 0x45, 0x84, 0x3b, 0x09, 0xa1, + 0x8f, 0x90, 0x2d, 0x47, 0x64, 0x19, 0x13, 0xe3, 0xcd, 0x7f, 0x8f, 0xcd, + 0x90, 0x0f, 0xde, 0xf2, 0x2f, 0xec, 0xd8, 0xb5, 0x1b, 0xe7, 0xa2, 0xf9, + 0x13, 0x50, 0x95, 0x2c, 0x9d, 0xa6, 0x51, 0xbb, 0x34, 0x93, 0x8d, 0xf3, + 0x58, 0x8c, 0x84, 0xe5, 0x44, 0x71, 0x8e, 0xfa, 0x18, 0x9f, 0x8f, 0xe3, + 0xa2, 0x8d, 0x40, 0x8e, 0x59, 0x01, 0xd3, 0x6e, 0x2c, 0x2c, 0x41, 0xfd, + 0x32, 0x22, 0x77, 0x3b, 0x8d, 0xfa, 0xcc, 0x2a, 0x20, 0xcf, 0x3d, 0x3e, + 0xad, 0x92, 0xd5, 0x27, 0xaf, 0xaf, 0x1d, 0xfa, 0x12, 0x9a, 0xad, 0xc4, + 0x15, 0xba, 0x70, 0x51, 0x3f, 0xe2, 0xea, 0x88, 0x04, 0x4c, 0x23, 0xcc, + 0xca, 0xa8, 0xef, 0x47, 0xfd, 0x20, 0x94, 0xba, 0xf1, 0xde, 0xcf, 0xd0, + 0x06, 0xff, 0x46, 0xc0, 0x00, 0x6d, 0x35, 0xa1, 0xeb, 0xb3, 0x84, 0x10, + 0x6e, 0x43, 0xdc, 0x20, 0x42, 0x1d, 0x9c, 0x81, 0x39, 0x54, 0xbb, 0xc0, + 0x92, 0x26, 0xa8, 0x1a, 0x3e, 0x84, 0x59, 0x05, 0x82, 0x0f, 0x60, 0x86, + 0xa9, 0x2e, 0xdc, 0xa9, 0xa8, 0x31, 0xd0, 0x73, 0x85, 0x57, 0xdb, 0xdd, + 0x35, 0xf8, 0x16, 0x81, 0xbd, 0x7b, 0xf6, 0xc8, 0x4d, 0xb5, 0xef, 0x31, + 0xb3, 0x76, 0x1b, 0xbe, 0xf1, 0x66, 0xf8, 0xe0, 0xad, 0xad, 0x80, 0xf7, + 0x1e, 0xc3, 0x50, 0xd3, 0xc5, 0x81, 0x37, 0xf0, 0xfe, 0xf2, 0x2d, 0x08, + 0x01, 0x4c, 0x17, 0x4d, 0x01, 0x33, 0x6d, 0x62, 0x5e, 0x5e, 0x05, 0xb6, + 0xc0, 0x39, 0xf0, 0xdf, 0x04, 0x6c, 0xb6, 0x0a, 0xee, 0x3a, 0x7e, 0x5c, + 0x4e, 0x0d, 0x98, 0x99, 0xa9, 0x98, 0x2d, 0x92, 0x02, 0xea, 0x67, 0x09, + 0x7c, 0x02, 0x6c, 0x0c, 0x39, 0xa6, 0xba, 0x68, 0x0a, 0x78, 0x9f, 0xa3, + 0x41, 0xad, 0x73, 0x0b, 0x34, 0x2c, 0x50, 0x1f, 0xb8, 0x06, 0x02, 0x79, + 0x83, 0x7c, 0x46, 0x81, 0x8d, 0x63, 0x63, 0x52, 0xef, 0x52, 0x33, 0x53, + 0x6c, 0x91, 0xaa, 0x20, 0x64, 0x59, 0x67, 0x23, 0xf2, 0x3e, 0xa0, 0xde, + 0x63, 0xa6, 0xf3, 0x1d, 0xa2, 0x5c, 0x8b, 0xab, 0x3d, 0x38, 0x5c, 0xc5, + 0x69, 0x40, 0x96, 0xa7, 0xb3, 0x8d, 0xa8, 0x59, 0x86, 0xde, 0x70, 0x11, + 0x51, 0x52, 0x41, 0x10, 0x68, 0xcd, 0x83, 0xcd, 0xb9, 0xb0, 0xf9, 0x2e, + 0x4d, 0x07, 0x20, 0xed, 0x79, 0x51, 0x44, 0x9a, 0xe1, 0xcd, 0x5a, 0x03, + 0x4a, 0x0b, 0xc2, 0x0c, 0xc3, 0x5a, 0xd8, 0xd6, 0x9a, 0x2b, 0xad, 0x75, + 0x19, 0x8d, 0x5a, 0x8a, 0x0f, 0xcd, 0x2d, 0x70, 0x7b, 0x0e, 0x1e, 0x54, + 0x9f, 0x87, 0xd0, 0xc8, 0x72, 0x70, 0x09, 0xe6, 0x12, 0xcc, 0x15, 0x20, + 0x9a, 0x79, 0x4e, 0xc0, 0x15, 0xb0, 0x28, 0x01, 0x97, 0xb4, 0xfc, 0x85, + 0xd9, 0xfb, 0x65, 0xdf, 0xe2, 0x0a, 0xed, 0x18, 0xb3, 0xb1, 0x92, 0xce, + 0xb8, 0x2e, 0x61, 0x7a, 0x7a, 0x12, 0xef, 0xc3, 0x04, 0x20, 0x31, 0x90, + 0x64, 0x79, 0xfe, 0xdb, 0xf7, 0x5f, 0x7c, 0x3c, 0xb4, 0x62, 0xc5, 0xb2, + 0x79, 0xb5, 0x96, 0xd9, 0x91, 0xe6, 0xda, 0x5b, 0x5d, 0x87, 0xf8, 0xd6, + 0xb1, 0x07, 0x47, 0x8e, 0x1c, 0xb3, 0x34, 0xcb, 0x8f, 0x01, 0x85, 0x18, + 0x28, 0x1d, 0xfb, 0x65, 0xe2, 0x80, 0x73, 0x5f, 0xae, 0x05, 0x89, 0x16, + 0xa9, 0x11, 0x65, 0x87, 0x7f, 0x1a, 0xdd, 0x0f, 0x24, 0x02, 0x24, 0xc0, + 0x72, 0xa0, 0x6f, 0xce, 0x14, 0x79, 0xa3, 0x4e, 0xa2, 0xe6, 0xb1, 0x38, + 0x0a, 0x5c, 0x68, 0x65, 0x19, 0xb2, 0x48, 0xe0, 0x1d, 0xd5, 0xc8, 0xff, + 0xc1, 0xfe, 0x01, 0x69, 0x12, 0xa7, 0x19, 0x81, 0x1d, 0xc5, 0xbf, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 +}; +unsigned int folder_new_png_len = 1487; +unsigned char emblem_documents_png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, + 0x08, 0x06, 0x00, 0x00, 0x00, 0x73, 0x7a, 0x7a, 0xf4, 0x00, 0x00, 0x00, + 0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64, + 0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0d, + 0xd7, 0x00, 0x00, 0x0d, 0xd7, 0x01, 0x42, 0x28, 0x9b, 0x78, 0x00, 0x00, + 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, + 0x72, 0x65, 0x00, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x6b, 0x73, 0x63, + 0x61, 0x70, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x9b, 0xee, 0x3c, 0x1a, 0x00, + 0x00, 0x06, 0x48, 0x49, 0x44, 0x41, 0x54, 0x58, 0x85, 0xa5, 0x57, 0x6b, + 0x4c, 0x93, 0x67, 0x14, 0xae, 0xb7, 0xa1, 0x4b, 0xe6, 0x96, 0xfd, 0xd8, + 0x8f, 0x2d, 0x66, 0x09, 0x61, 0xc9, 0x92, 0xed, 0xaf, 0x71, 0xbf, 0xcd, + 0xe2, 0xb2, 0xc4, 0xec, 0xcf, 0x62, 0xf6, 0x83, 0x90, 0x88, 0xe8, 0x1c, + 0x0a, 0x8a, 0x56, 0x4b, 0xaf, 0x28, 0x20, 0x58, 0x10, 0xc1, 0x65, 0x0a, + 0x73, 0x4e, 0xf1, 0x16, 0x99, 0x46, 0xe7, 0x06, 0x3a, 0x44, 0x45, 0x11, + 0xb9, 0x28, 0xe5, 0x22, 0x52, 0xa1, 0x37, 0x6e, 0x2d, 0x42, 0xb9, 0x09, + 0x08, 0x6d, 0xb9, 0xf6, 0xec, 0x7d, 0x5e, 0xfa, 0x76, 0x1f, 0xb5, 0xe5, + 0xe2, 0x48, 0x4e, 0xda, 0xaf, 0xdf, 0x77, 0xde, 0xf3, 0x9c, 0xe7, 0x3c, + 0xe7, 0x7c, 0x07, 0xd9, 0x91, 0xec, 0x23, 0x9f, 0x1c, 0xcf, 0xc9, 0xbc, + 0x90, 0x71, 0x2c, 0x7d, 0x42, 0x9f, 0x99, 0x46, 0x8b, 0x35, 0x3c, 0x0f, + 0x3f, 0xf8, 0x13, 0x91, 0xec, 0x6d, 0x4d, 0x86, 0x43, 0x0c, 0x86, 0xa7, + 0xde, 0xa9, 0xa9, 0x29, 0xf2, 0x7a, 0xbd, 0x8b, 0xb6, 0xa9, 0xe9, 0x29, + 0xaa, 0xad, 0x35, 0x78, 0xe1, 0xff, 0xbf, 0x00, 0x20, 0x13, 0x04, 0x1f, + 0x18, 0x18, 0xa0, 0xde, 0xde, 0x5e, 0xea, 0xeb, 0xeb, 0xa3, 0xfe, 0xfe, + 0x7e, 0x7e, 0x0d, 0x1b, 0x1c, 0x1c, 0x0c, 0x6a, 0x43, 0x43, 0x43, 0x34, + 0x3d, 0x3d, 0xcd, 0x99, 0x90, 0xc9, 0x64, 0xcb, 0xde, 0x1a, 0x00, 0xe8, + 0x44, 0x46, 0x22, 0xb0, 0x08, 0x2e, 0x02, 0xbd, 0x7a, 0xf5, 0x2a, 0xa4, + 0xc1, 0x0f, 0xfe, 0x0c, 0xc0, 0x2a, 0x66, 0x2b, 0x98, 0x2d, 0x5f, 0x2a, + 0x18, 0x3f, 0x00, 0x04, 0x2e, 0xaf, 0x78, 0x40, 0x77, 0x4b, 0xff, 0x59, + 0xd0, 0xf0, 0x1c, 0x18, 0x10, 0x00, 0xb6, 0x6f, 0xdf, 0xfa, 0x15, 0x0b, + 0xbc, 0xda, 0x07, 0x64, 0x25, 0x80, 0x2c, 0x19, 0x80, 0xc8, 0x1a, 0x99, + 0xe1, 0x70, 0xd8, 0xf0, 0xf0, 0x30, 0x8d, 0x8c, 0x8c, 0x04, 0x35, 0xdc, + 0x13, 0x00, 0xd2, 0xd2, 0x52, 0xdd, 0x4a, 0x75, 0xe2, 0xa8, 0x4a, 0xa3, + 0xbc, 0xbd, 0x6f, 0xdf, 0x9e, 0x1f, 0x63, 0x63, 0xb7, 0x85, 0xfb, 0x18, + 0x59, 0x90, 0x0d, 0x3f, 0x00, 0x04, 0x5f, 0x2c, 0x03, 0x8f, 0x2b, 0x1f, + 0xd2, 0xeb, 0xd7, 0xaf, 0xfd, 0x00, 0x1c, 0x0e, 0x07, 0x4d, 0x4e, 0x4e, + 0x52, 0x57, 0x57, 0x17, 0x95, 0x3e, 0xb8, 0xef, 0x39, 0xaa, 0x4f, 0xf3, + 0xa8, 0x35, 0xca, 0x6e, 0xa5, 0x5a, 0xa1, 0xdf, 0xb2, 0x65, 0xcb, 0x3b, + 0x8b, 0x06, 0x20, 0xcd, 0x1a, 0x01, 0x60, 0xa3, 0xa3, 0xa3, 0x34, 0x36, + 0x36, 0x36, 0xc7, 0xf0, 0x1b, 0x4c, 0x00, 0x68, 0x6e, 0x6e, 0xe6, 0x7e, + 0xb8, 0x37, 0x3e, 0x3e, 0xce, 0xc5, 0xe9, 0x76, 0xbb, 0xa9, 0xe4, 0x6e, + 0x89, 0x47, 0xa5, 0x49, 0x34, 0xcc, 0x57, 0x12, 0x3f, 0x00, 0x50, 0xbf, + 0x14, 0x06, 0x10, 0x4c, 0x00, 0x30, 0x1a, 0x9b, 0xe6, 0x88, 0x13, 0xc9, + 0x00, 0xd0, 0xcc, 0xcc, 0x0c, 0xe9, 0x33, 0x8e, 0x8e, 0x47, 0x45, 0x45, + 0x7d, 0x14, 0xaa, 0x1c, 0x7e, 0x00, 0x22, 0x7b, 0x69, 0xd6, 0x2e, 0x97, + 0x8b, 0x67, 0x02, 0xf3, 0x78, 0x3c, 0xdc, 0xc4, 0x35, 0xee, 0x09, 0x00, + 0xd7, 0xae, 0x17, 0x50, 0xd5, 0x93, 0x72, 0x6a, 0x7a, 0xd1, 0x48, 0x76, + 0x7b, 0x27, 0xd7, 0x13, 0x80, 0x80, 0x89, 0x9c, 0x9f, 0xb3, 0xc7, 0x62, + 0x7e, 0x8a, 0xf9, 0xd2, 0x27, 0xce, 0x37, 0x40, 0xf8, 0x01, 0x20, 0x38, + 0x32, 0x5b, 0x0c, 0x03, 0x15, 0x55, 0x65, 0x1c, 0x84, 0x00, 0x60, 0x32, + 0x99, 0xc8, 0xd1, 0x65, 0x27, 0xe3, 0x8b, 0xe7, 0x54, 0xc9, 0x80, 0x74, + 0x76, 0xb6, 0xf3, 0x44, 0xa0, 0x0b, 0x88, 0x93, 0x05, 0x7e, 0x97, 0xd9, + 0x3b, 0x10, 0xe6, 0xbc, 0x00, 0xa4, 0xd9, 0x8b, 0xac, 0x51, 0xd3, 0x89, + 0x89, 0x89, 0x39, 0x86, 0xdf, 0x70, 0xcf, 0xcf, 0xc0, 0x8d, 0x02, 0xaa, + 0xa9, 0xad, 0x26, 0x8b, 0xd5, 0x44, 0x4e, 0x67, 0x0f, 0xd7, 0x10, 0xfc, + 0xbb, 0xbb, 0xbb, 0x29, 0x51, 0xad, 0x30, 0x85, 0x87, 0x87, 0xbf, 0x2f, + 0x69, 0xd3, 0xe5, 0x41, 0x01, 0xc0, 0x69, 0x29, 0x0c, 0x00, 0x04, 0xfe, + 0x38, 0x03, 0x66, 0x13, 0xd9, 0x1d, 0x1d, 0xd4, 0xd8, 0x54, 0x4f, 0x0d, + 0x8d, 0xb5, 0xfe, 0xec, 0xcb, 0x1e, 0x3d, 0xa4, 0xe3, 0xd9, 0xc7, 0xa6, + 0x18, 0x0b, 0x8e, 0xd8, 0xb8, 0xd8, 0xef, 0x58, 0xf0, 0x30, 0x94, 0x22, + 0x24, 0x00, 0x38, 0x8a, 0xda, 0x8b, 0xec, 0x71, 0x10, 0x46, 0x35, 0xea, + 0x09, 0xc3, 0x77, 0xfc, 0x06, 0x26, 0x04, 0x80, 0x1b, 0x7f, 0x5d, 0xa3, + 0x67, 0xcf, 0xeb, 0xa8, 0xbd, 0xa3, 0x8d, 0x9d, 0x33, 0xec, 0xef, 0x90, + 0xcc, 0x2c, 0x3d, 0x99, 0xcd, 0x66, 0x2e, 0xca, 0x93, 0xb9, 0xbf, 0xb8, + 0x35, 0x5a, 0xe5, 0xa3, 0xdd, 0xbb, 0x77, 0x7c, 0x21, 0x65, 0x61, 0x5e, + 0x06, 0x90, 0x29, 0x82, 0x21, 0x30, 0x14, 0x0d, 0x13, 0x20, 0xa4, 0x00, + 0x4c, 0xa6, 0x16, 0x6a, 0x6b, 0xb7, 0x51, 0x5d, 0x43, 0x0d, 0x1b, 0xe9, + 0xbd, 0xfe, 0xf2, 0xa5, 0xa6, 0x25, 0x33, 0x3d, 0x74, 0xf2, 0x84, 0xe0, + 0x67, 0xb3, 0xd9, 0xbc, 0x29, 0xa9, 0xc9, 0x6e, 0x95, 0xfa, 0x60, 0x6e, + 0x42, 0x42, 0xc2, 0x07, 0x6f, 0x00, 0x08, 0xac, 0x3f, 0x82, 0x48, 0x01, + 0xe0, 0x39, 0x7c, 0x0a, 0x16, 0x04, 0x80, 0xc2, 0xa2, 0x9b, 0xd4, 0xdc, + 0xd2, 0x44, 0x3d, 0xce, 0x6e, 0xee, 0x8b, 0x7b, 0xed, 0xed, 0x6d, 0x94, + 0xfb, 0xeb, 0x29, 0xea, 0xe9, 0xe9, 0xf1, 0xb7, 0x27, 0xce, 0x84, 0x6f, + 0x55, 0x55, 0xe5, 0xa4, 0x5a, 0x9b, 0x38, 0xa8, 0x50, 0x28, 0x3e, 0xe6, + 0x6f, 0x43, 0x04, 0x10, 0xc3, 0x25, 0x18, 0x00, 0x51, 0x02, 0x29, 0x03, + 0xf8, 0x1d, 0xd7, 0x59, 0xd9, 0x19, 0x4c, 0xfd, 0x46, 0xb2, 0xda, 0xcc, + 0x64, 0xb6, 0x34, 0x73, 0x3f, 0x3c, 0x53, 0x58, 0xf4, 0x37, 0x9d, 0xbf, + 0x78, 0x96, 0xb3, 0x68, 0x77, 0x74, 0xf2, 0x36, 0x07, 0x08, 0x88, 0x1d, + 0xbe, 0x56, 0x9b, 0x75, 0x46, 0x93, 0xa4, 0xae, 0xe6, 0xfb, 0x40, 0x6d, + 0x9d, 0xc1, 0x0b, 0x27, 0xe9, 0xfb, 0x7e, 0xa1, 0x3f, 0x04, 0xaf, 0x6f, + 0xa8, 0xa3, 0xd3, 0x67, 0x72, 0xe9, 0x76, 0x71, 0x11, 0x59, 0x6c, 0x26, + 0x9e, 0x00, 0x74, 0x03, 0xff, 0xa4, 0xc3, 0x5a, 0x36, 0xa0, 0x8c, 0x4c, + 0x17, 0xad, 0x54, 0xf6, 0xb8, 0x94, 0x6a, 0xeb, 0x9f, 0x92, 0xb3, 0xd7, + 0xe9, 0x07, 0x01, 0xa0, 0x5a, 0x9d, 0xba, 0x43, 0x86, 0x8d, 0x26, 0xe7, + 0xc4, 0xb1, 0x25, 0x6f, 0x44, 0xc8, 0xfc, 0xcf, 0x9b, 0xd7, 0xa9, 0x85, + 0xd5, 0xdf, 0x62, 0x35, 0x93, 0x89, 0x65, 0x3f, 0x3a, 0x3a, 0xab, 0x7e, + 0x00, 0xd1, 0x67, 0xa4, 0x53, 0x71, 0x49, 0x11, 0x2b, 0x8d, 0x91, 0x65, + 0x3f, 0xc8, 0x3f, 0x1b, 0x1a, 0xeb, 0x38, 0x13, 0x00, 0x69, 0xb5, 0x5a, + 0xbc, 0x5a, 0x9d, 0xea, 0xe6, 0x7f, 0xed, 0x30, 0xfb, 0x2e, 0x47, 0x9f, + 0xae, 0xd9, 0x2f, 0x4f, 0x30, 0x5a, 0x2c, 0x16, 0x56, 0xc7, 0x76, 0xf6, + 0xa0, 0x15, 0xe2, 0xa1, 0xd6, 0xd6, 0x56, 0x7e, 0x0d, 0x83, 0xb0, 0xec, + 0x76, 0x3b, 0x7f, 0xf9, 0x40, 0xe1, 0x28, 0x95, 0x28, 0x0b, 0x98, 0xc4, + 0x68, 0x3e, 0x97, 0xff, 0x3b, 0xdf, 0x31, 0x10, 0xf4, 0x11, 0x1b, 0xf1, + 0x1d, 0x9d, 0x6d, 0x7e, 0x9d, 0xe1, 0xd9, 0xe4, 0x94, 0xc3, 0x1e, 0xb9, + 0x4a, 0xfe, 0xf9, 0xdc, 0xa9, 0x34, 0x3b, 0x2e, 0xc3, 0x0e, 0x26, 0xca, + 0x53, 0x73, 0xf3, 0x4e, 0xba, 0xe1, 0x20, 0xea, 0x2e, 0x5a, 0x4f, 0xda, + 0x9a, 0xc1, 0x84, 0x89, 0xef, 0x97, 0xaf, 0x5c, 0xa2, 0x2b, 0x05, 0x17, + 0xa9, 0xba, 0xa6, 0x82, 0x6d, 0x59, 0x4e, 0x2e, 0x4e, 0x74, 0x09, 0xda, + 0x9c, 0x8b, 0xb0, 0x9a, 0x89, 0x50, 0xa3, 0xcc, 0xe3, 0x31, 0x03, 0x00, + 0x08, 0x16, 0x56, 0xc7, 0xed, 0x89, 0x8d, 0xd6, 0xe8, 0x54, 0x56, 0x56, + 0xcb, 0x89, 0xa2, 0x5b, 0x85, 0x9e, 0x8e, 0x8e, 0x76, 0x0e, 0x40, 0x04, + 0x14, 0xc0, 0x82, 0x09, 0x53, 0xad, 0x55, 0xce, 0xb2, 0xc5, 0xb2, 0x2e, + 0x2b, 0xbf, 0x4f, 0x2f, 0x58, 0x87, 0x40, 0xdc, 0xe2, 0x5d, 0xa2, 0xd1, + 0xaa, 0x46, 0x62, 0x62, 0x62, 0x3e, 0x7c, 0x03, 0x80, 0x0f, 0xc4, 0x0a, + 0xdf, 0xc4, 0xc2, 0xfc, 0x7e, 0x6f, 0xe3, 0xc6, 0x8d, 0x9f, 0xee, 0xda, + 0xb5, 0x73, 0xaf, 0x2e, 0x49, 0x33, 0x73, 0x24, 0x3d, 0x85, 0x72, 0x4e, + 0x1c, 0xa7, 0xca, 0xca, 0x0a, 0xbe, 0x41, 0x49, 0x19, 0x10, 0x83, 0x0a, + 0x42, 0xcb, 0x3e, 0x91, 0x45, 0xc5, 0x77, 0x8b, 0xf8, 0x68, 0x46, 0xd6, + 0x7d, 0xfd, 0x7d, 0x7c, 0x16, 0xe0, 0xb9, 0xab, 0xd7, 0xfe, 0xf0, 0x1c, + 0x50, 0xec, 0x8b, 0x13, 0x2f, 0xa6, 0x60, 0x00, 0x96, 0x89, 0x52, 0x08, + 0x10, 0xd1, 0xd1, 0x51, 0xdf, 0x5c, 0xb8, 0x98, 0xef, 0x42, 0xbd, 0x1b, + 0x1a, 0x1a, 0x78, 0x8b, 0x9d, 0xca, 0x3b, 0x49, 0xba, 0x43, 0x5a, 0x5e, + 0xeb, 0xe7, 0x4d, 0x8d, 0x5c, 0xd9, 0xfd, 0x2c, 0x90, 0x3e, 0x33, 0x9d, + 0x2d, 0x25, 0xf7, 0xd8, 0xf5, 0x10, 0xd5, 0x3f, 0x33, 0xf0, 0x09, 0x29, + 0x66, 0xc3, 0xc0, 0x40, 0x3f, 0x31, 0xea, 0x5b, 0x23, 0x22, 0x22, 0xc2, + 0x42, 0x02, 0x08, 0x2c, 0x05, 0x40, 0x6c, 0xfe, 0x7e, 0xf3, 0x67, 0xac, + 0x65, 0x46, 0x44, 0x0d, 0xa1, 0x0d, 0x30, 0xf0, 0xf2, 0xe5, 0x4b, 0x7a, + 0x50, 0x56, 0x4a, 0x67, 0xf3, 0xcf, 0x70, 0x40, 0xe7, 0xce, 0x9f, 0x65, + 0x2d, 0x79, 0x8b, 0xee, 0xdc, 0xbb, 0x4d, 0x86, 0xfa, 0x27, 0x34, 0xc4, + 0x40, 0x20, 0x73, 0xe8, 0x06, 0xd9, 0x33, 0x66, 0xdc, 0xf1, 0xf1, 0xb1, + 0x5f, 0x4b, 0xdf, 0x8a, 0xa1, 0x57, 0xa5, 0x00, 0x10, 0x3b, 0x76, 0x6c, + 0xfb, 0x96, 0xd5, 0x76, 0xd4, 0x60, 0xa8, 0x99, 0x14, 0xa2, 0xc4, 0xc1, + 0x30, 0xd4, 0x17, 0xed, 0x85, 0x3d, 0x00, 0x4c, 0x00, 0x24, 0xea, 0xdf, + 0x62, 0x32, 0x72, 0xdd, 0xe0, 0x79, 0x8b, 0xd5, 0x32, 0xc3, 0x34, 0x75, + 0xc7, 0x77, 0xe6, 0xb2, 0x05, 0x01, 0x04, 0x80, 0x00, 0x65, 0x6b, 0x36, + 0x6d, 0xda, 0xb4, 0x2e, 0x51, 0x79, 0x30, 0x3f, 0x35, 0x2d, 0xc5, 0xc3, + 0x16, 0x0f, 0x2f, 0xff, 0x07, 0xc5, 0x27, 0xbe, 0xc0, 0xae, 0x10, 0x20, + 0x45, 0x6b, 0x1e, 0x4a, 0x4e, 0x72, 0x31, 0xe1, 0x45, 0x04, 0xee, 0x04, + 0x0b, 0xaf, 0xcd, 0xb3, 0x20, 0x56, 0xfa, 0x16, 0x0a, 0xce, 0xc6, 0xd6, + 0xad, 0x91, 0xeb, 0xd5, 0x5a, 0xd5, 0xd3, 0xd3, 0xbf, 0xe5, 0xb9, 0xc5, + 0x72, 0x2a, 0x44, 0x28, 0x3a, 0x44, 0xda, 0x15, 0xe5, 0x15, 0xe5, 0x13, + 0x6c, 0x41, 0xcd, 0x0a, 0xba, 0x90, 0x2c, 0x04, 0x40, 0x22, 0xcc, 0x15, + 0x12, 0x36, 0x38, 0x90, 0x5d, 0x71, 0x3b, 0x7f, 0x60, 0x4b, 0xa7, 0xf3, + 0x4e, 0x49, 0xb1, 0x47, 0xfc, 0x6b, 0x27, 0x6d, 0x49, 0x7c, 0xf2, 0xb6, + 0xd3, 0xa9, 0x06, 0x23, 0x23, 0x23, 0xd7, 0x06, 0x3d, 0x7b, 0x31, 0x00, + 0x82, 0xb0, 0xb1, 0xca, 0xc7, 0x48, 0xd8, 0x86, 0x0d, 0x1b, 0xd6, 0x1e, + 0x50, 0xec, 0xd7, 0xb1, 0x8e, 0x70, 0xb1, 0x6e, 0x98, 0x16, 0x0c, 0x00, + 0x00, 0x00, 0x5d, 0x2e, 0xb8, 0xe4, 0x92, 0x2b, 0xe4, 0x51, 0x21, 0xcf, + 0x5c, 0x0a, 0x80, 0x20, 0x8c, 0x08, 0x30, 0xab, 0xa2, 0xa3, 0xa3, 0xd7, + 0xa9, 0xd4, 0x89, 0x57, 0x33, 0x32, 0x8f, 0x7a, 0x1c, 0x5d, 0x0e, 0x3e, + 0x74, 0xd8, 0xbc, 0x98, 0xd0, 0x26, 0xa9, 0x6b, 0xe6, 0x3d, 0xeb, 0x6d, + 0x00, 0x84, 0x00, 0xc4, 0x4d, 0x2e, 0xdf, 0xbb, 0x5e, 0x97, 0xa4, 0x2e, + 0x64, 0x13, 0xd4, 0xc2, 0x5a, 0xf7, 0x42, 0x7c, 0x7c, 0x7c, 0xd8, 0x7c, + 0xbe, 0xff, 0x02, 0x7a, 0x8f, 0xfb, 0xf3, 0x8a, 0x91, 0x13, 0x31, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 +}; +unsigned int emblem_documents_png_len = 1739; diff --git a/src/loadfile.cpp b/src/loadfile.cpp index 4e02374..1c7fb6b 100644 --- a/src/loadfile.cpp +++ b/src/loadfile.cpp @@ -267,12 +267,22 @@ static void *renderer(void *) { return NULL; } -void loadfile(const char *file) { +bool loadfile(const char *file, recent_file_struct *recent_files) { + + bool recent = false; + + if (!file) { + if (!recent_files) { + file = fl_file_chooser(_("Open PDF"), "*.pdf", NULL, 0); + } + else { + file = recent_files->filename.c_str(); + recent = true; + } + } if (!file) - file = fl_file_chooser(_("Open PDF"), "*.pdf", NULL, 0); - if (!file) - return; + return false; // Refresh window Fl::check(); @@ -298,7 +308,7 @@ void loadfile(const char *file) { fl_alert(_("Error %d, %s"), err, msg); - return; + return false; } if (::file->cache) { @@ -316,6 +326,10 @@ void loadfile(const char *file) { ::file->cache = NULL; } + if (::file->filename) free(::file->filename); + if (::file->pdf) free(::file->pdf); + ::file->filename = (char *) xmalloc(strlen(file) + 1); + strcpy(::file->filename, file); ::file->pdf = pdf; ::file->pages = pdf->getNumPages(); ::file->maxw = ::file->maxh = ::file->first_visible = ::file->last_visible = 0; @@ -323,7 +337,7 @@ void loadfile(const char *file) { // Start threaded magic if (::file->pages < 1) { fl_alert(_("Couldn't open %s, perhaps it's corrupted?"), file); - return; + return false; } fl_cursor(FL_CURSOR_WAIT); @@ -360,5 +374,12 @@ void loadfile(const char *file) { sprintf(tmp, "/ %u", ::file->pages); pagectr->copy_label(tmp); pagebox->value("1"); + if (recent) { + ::file->zoom = recent_files->zoom; + ::file->mode = (zoommode)recent_files->zoom_mode; + } + view->reset(); + + return recent; } diff --git a/src/main.cpp b/src/main.cpp index 703137f..34e55d5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -16,43 +16,113 @@ along with this program. If not, see . #include "main.h" #include "wmicon.h" -#include "icons.h" +//#include "icons.h" +#include "icons 32x32.h" #include #include #include - -Fl_Double_Window *win = (Fl_Double_Window *) 0; -static Fl_Pack *buttons = (Fl_Pack *) 0; +#include +#include +#include +#include + +using namespace std; +using namespace libconfig; + +Fl_Double_Window *win = NULL; +static Fl_Pack* win_pack = NULL; +static Fl_Pack *buttons = NULL; +static Fl_Pack *v = NULL; static Fl_Button *showbtn = NULL; +static Fl_Button *fullscreenbtn = NULL; + +static Fl_Scrollbar * vertical_scrollbar = NULL; + +static Fl_PNG_Image *fullscreen_image = NULL; +static Fl_PNG_Image *fullscreenreverse_image = NULL; + Fl_Box *pagectr = (Fl_Box *) 0; +Fl_Box *debug1 = (Fl_Box *) 0, + *debug2 = (Fl_Box *) 0, + *debug3 = (Fl_Box *) 0, + *debug4 = (Fl_Box *) 0, + *debug5 = (Fl_Box *) 0, + *debug6 = (Fl_Box *) 0, + *debug7 = (Fl_Box *) 0; + Fl_Input *pagebox = NULL; -Fl_Input_Choice *zoombar = (Fl_Input_Choice *) 0; +Fl_Input_Choice *zoombar = NULL; +Fl_Choice *columns = NULL; Fl_Light_Button *selecting = NULL; + +Fl_Window *recent_win = NULL; +Fl_Select_Browser *recent_select = NULL; + pdfview *view = NULL; int writepipe; +bool fullscreen; u8 details = 0; openfile *file = NULL; static Fl_Menu_Item menu_zoombar[] = { - {"Trim", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, + {"Trim", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, {"Width", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, - {"Page", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, + {"Page", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0} }; +static Fl_Menu_Item menu_columns[] = { + {"1 Col.", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, + {"2 Col.", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, + {"3 Col.", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, + {"4 Col.", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, + {"5 Col.", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, + {0,0,0,0,0,0,0,0,0} +}; + +void debug(Fl_Box * ctrl, const float value, const char * hint) { + + char tmp[20]; + + snprintf(tmp, 20, "%4.2f", value); + ctrl->copy_label(tmp); + ctrl->tooltip(hint); + ctrl->redraw_label(); +} + +void cb_fullscreen(Fl_Button*, void*) { + if (fullscreen) { + fullscreen = false; + fullscreenbtn->image(fullscreen_image); + fullscreenbtn->tooltip(_("Enter Full Screen")); + win->fullscreen_off(); + } + else { + fullscreen = true; + fullscreenbtn->image(fullscreenreverse_image); + fullscreenbtn->tooltip(_("Exit Full Screen")); + win->fullscreen(); + } +} + static void cb_Open(Fl_Button*, void*) { - loadfile(NULL); + loadfile(NULL, NULL); +} + +static void display_zoom(const float what) +{ + char tmp[10]; + snprintf(tmp, 10, "%.0f%%", what * 100); + zoombar->value(tmp); } static void applyzoom(const float what) { file->zoom = what > 0.01f ? what : 0.01f; file->mode = Z_CUSTOM; - char tmp[10]; - snprintf(tmp, 10, "%.0f%%", what * 100); - zoombar->value(tmp); + display_zoom(what); view->resetselection(); view->redraw(); @@ -78,6 +148,88 @@ static void cb_zoombar(Fl_Input_Choice *w, void*) { view->redraw(); } +static void adjust_display_from_recent(recent_file_struct &recent) +{ + view->set_params(recent.columns, recent.xoff, recent.yoff); + fullscreen = recent.fullscreen; + cb_fullscreen(NULL, NULL); + if (recent.zoom_mode == Z_CUSTOM) + display_zoom(recent.zoom); + else + zoombar->value(menu_zoombar[recent.zoom_mode].text); + win->damage(FL_DAMAGE_ALL); + win->flush(); + win->position(recent.x, recent.y); + win->size(recent.width, recent.height); +} + +void cb_recent_select(Fl_Select_Browser *, void *) { + + recent_win->hide(); + + int i = recent_select->value(); + + fl_message("Selected: %d", i); + + if (i <= 0) return; + + i -= 1; + + recent_file_struct *rf = recent_files; + while ((i > 0) && (rf != NULL)) { + rf = rf->next; + i -= 1; + } + + if ((rf != NULL) && loadfile(NULL, rf)) + adjust_display_from_recent(*rf); +} + +static void cb_OpenRecent(Fl_Button*, void*) { + + if (recent_win == NULL){ + recent_win = new Fl_Window(10, 10, 250, 180, "Recent Files"); + Fl_Pack *p = new Fl_Pack(10, 10, 230, 160); + p->type(1); + { + recent_select = new Fl_Select_Browser(0, 0, 230, 160); + recent_select->callback((Fl_Callback*)cb_recent_select); + recent_select->resizable(); + recent_select->show(); + } + p->resizable(); + } + else { + recent_select->clear(); + } + + recent_file_struct *rf = recent_files; + while (rf != NULL) { + recent_select->add(rf->filename.c_str()); + rf = rf->next; + } + + recent_win->set_modal(); + recent_win->show(); +} + +static void cb_columns(Fl_Choice *w, void*) { + const int idx = w->value(); + view->set_columns(idx + 1); +} + +void cb_page_up(Fl_Button*, void*) { + Fl::e_keysym = FL_Page_Up; + Fl::handle_(FL_KEYDOWN, win); + Fl::handle_(FL_KEYUP, win); +} + +void cb_page_down(Fl_Button*, void*) { + Fl::e_keysym = FL_Page_Down; + Fl::handle_(FL_KEYDOWN, win); + Fl::handle_(FL_KEYUP, win); +} + void cb_Zoomin(Fl_Button*, void*) { file->zoom *= 1.2f; applyzoom(file->zoom); @@ -99,6 +251,27 @@ void cb_hide(Fl_Widget*, void*) { } } +void cb_vertical_scrollbar(Fl_Widget*, void*) { + view->update_position(vertical_scrollbar->value()); +} + +void cb_exit(Fl_Widget*, void*) { + save_to_config( + file->filename, + view->get_columns(), + view->get_xoff(), + view->get_yoff(), + file->zoom, + file->mode, + win->x(), + win->y(), + win->w(), + win->h(), + fullscreen); + save_config(); + exit(0); +} + static void goto_page(Fl_Input *w, void*) { const u32 which = atoi(w->value()) - 1; if (which >= file->pages) { @@ -155,10 +328,10 @@ int main(int argc, char **argv) { #endif const struct option opts[] = { - {"details", 0, NULL, 'd'}, - {"help", 0, NULL, 'h'}, - {"version", 0, NULL, 'v'}, - {NULL, 0, NULL, 0} + { "details", 0, NULL, 'd' }, + { "help", 0, NULL, 'h' }, + { "version", 0, NULL, 'v' }, + { NULL, 0, NULL, 0 } }; while (1) { @@ -199,25 +372,44 @@ int main(int argc, char **argv) { #define img(a) a, sizeof(a) - win = new Fl_Double_Window(705, 700, "FlaxPDF"); - Fl_Pack* o = new Fl_Pack(0, 0, 705, 700); - o->type(1); - { buttons = new Fl_Pack(0, -4, 64, 704); - { Fl_Button* o = new Fl_Button(0, 0, 64, 64); + fullscreen_image = new Fl_PNG_Image("fullscreen.png", img(view_fullscreen_png)); + fullscreenreverse_image = new Fl_PNG_Image("fullscreenreverse.png", img(view_restore_png)); + + fullscreen = false; + + int pos; + + win = new Fl_Double_Window(700, 700, "FlaxPDF"); + win_pack = new Fl_Pack(0, 0, 700, 700); + win_pack->type(1); + + { buttons = new Fl_Pack(0, 0, 64, 700); + { Fl_Button* o = new Fl_Button(0, pos = 0, 64, 32); + o->tooltip(_("Hide toolbar (F8)")); + o->callback(cb_hide); + o->image(new Fl_PNG_Image("back.png", img(media_seek_backward_png))); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(0, pos += 32, 64, 48); o->tooltip(_("Open a new file")); o->callback((Fl_Callback*)cb_Open); - o->image(new Fl_PNG_Image("fileopen.png", img(fileopen_png))); + o->image(new Fl_PNG_Image("fileopen.png", img(document_open_png))); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(0, pos += 48, 64, 48); + o->tooltip(_("Open a recent file")); + o->callback((Fl_Callback*)cb_OpenRecent); + o->image(new Fl_PNG_Image("fileopen.png", img(emblem_documents_png))); } // Fl_Button* o - { pagebox = new Fl_Input(0, 64, 64, 32); + { pagebox = new Fl_Input(0, pos += 48, 64, 24); pagebox->value("0"); pagebox->callback((Fl_Callback*)goto_page); pagebox->when(FL_WHEN_ENTER_KEY | FL_WHEN_NOT_CHANGED); } // Fl_Box* pagectr - { pagectr = new Fl_Box(0, 64, 64, 32, "/ 0"); + { pagectr = new Fl_Box(0, pos += 24, 64, 24, "/ 0"); + pagectr->tooltip(_("Document Page Count")); pagectr->box(FL_ENGRAVED_FRAME); pagectr->align(FL_ALIGN_WRAP); } // Fl_Box* pagectr - { zoombar = new Fl_Input_Choice(0, 128, 64, 32); + { zoombar = new Fl_Input_Choice(0, pos += 24, 64, 24); zoombar->tooltip(_("Preset zoom choices")); zoombar->callback((Fl_Callback*)cb_zoombar); zoombar->menu(menu_zoombar); @@ -225,27 +417,95 @@ int main(int argc, char **argv) { zoombar->textsize(11); zoombar->input()->when(FL_WHEN_ENTER_KEY | FL_WHEN_NOT_CHANGED); } // Fl_Input_Choice* zoombar - { Fl_Button* o = new Fl_Button(0, 160, 64, 64); - o->tooltip(_("Zoom in")); - o->callback((Fl_Callback*)cb_Zoomin); - o->image(new Fl_PNG_Image("zoomin.png", img(zoomin_png))); - } // Fl_Button* o - { Fl_Button* o = new Fl_Button(0, 224, 64, 64); - o->tooltip(_("Zoom out")); - o->callback((Fl_Callback*)cb_Zoomout); - o->image(new Fl_PNG_Image("zoomout.png", img(zoomout_png))); - } // Fl_Button* o - { selecting = new Fl_Light_Button(0, 288, 64, 64); + { Fl_Pack* zooms = new Fl_Pack(0, pos += 24, 64, 32); + zooms->type(Fl_Pack::HORIZONTAL); + { Fl_Button* o = new Fl_Button(0, 0, 32, 32); + o->tooltip(_("Zoom in")); + o->callback((Fl_Callback*)cb_Zoomin); + o->image(new Fl_PNG_Image("zoomin.png", img(zoom_in_png))); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(32, 0, 32, 32); + o->tooltip(_("Zoom out")); + o->callback((Fl_Callback*)cb_Zoomout); + o->image(new Fl_PNG_Image("zoomout.png", img(zoom_out_png))); + } // Fl_Button* o + zooms->end(); + zooms->show(); + } // Fl_Pack* zooms + { selecting = new Fl_Light_Button(0, pos += 32, 64, 38); selecting->tooltip(_("Select text")); selecting->align(FL_ALIGN_CENTER); - selecting->image(new Fl_PNG_Image("text.png", img(text_png))); + selecting->image(new Fl_PNG_Image("text.png", img(edit_select_all_png))); selecting->callback(selecting_changed); - } // Fl_Light_Button* o - { Fl_Button* o = new Fl_Button(0, 224, 64, 64); - o->tooltip(_("Hide toolbar (F8)")); - o->callback(cb_hide); - o->image(new Fl_PNG_Image("back.png", img(back_png))); - } // Fl_Button* o + } // Fl_Light_Button* selecting + + { columns = new Fl_Choice(0, pos += 38, 64, 24); + columns->tooltip(_("Number of Columns")); + columns->callback((Fl_Callback*)cb_columns); + columns->menu(menu_columns); + columns->value(0); + columns->textsize(11); + columns->align(FL_ALIGN_CENTER); + //columns->input()->when(FL_WHEN_ENTER_KEY | FL_WHEN_NOT_CHANGED); + } // Fl_Input_Choice* zoombar + { Fl_Pack* page_moves = new Fl_Pack(0, pos += 24, 64, 42); + page_moves->type(Fl_Pack::HORIZONTAL); + { Fl_Button* o = new Fl_Button(0, 0, 32, 42); + o->tooltip(_("Page Up")); + o->callback((Fl_Callback*)cb_page_up); + o->image(new Fl_PNG_Image("pageup.png", img(go_up_png))); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(32, 0, 32, 42); + o->tooltip(_("Page Down")); + o->callback((Fl_Callback*)cb_page_down); + o->image(new Fl_PNG_Image("pagedown.png", img(go_down_png))); + } // Fl_Button* o + page_moves->end(); + page_moves->show(); + } // Fl_Pack* page_moves + { fullscreenbtn = new Fl_Button(0, pos += 42, 64, 38); + fullscreenbtn->image(fullscreen_image); + fullscreenbtn->callback((Fl_Callback*)cb_fullscreen); + fullscreenbtn->tooltip(_("Enter Full Screen")); + } + { debug1 = new Fl_Box(0, pos += 38, 64, 32, ""); + debug1->box(FL_ENGRAVED_FRAME); + debug1->align(FL_ALIGN_WRAP); + } // Fl_Box* debug1 + { debug2 = new Fl_Box(0, pos += 32, 64, 32, ""); + debug2->box(FL_ENGRAVED_FRAME); + debug2->align(FL_ALIGN_WRAP); + } // Fl_Box* debug2 + { debug3 = new Fl_Box(0, pos += 32, 64, 32, ""); + debug3->box(FL_ENGRAVED_FRAME); + debug3->align(FL_ALIGN_WRAP); + } // Fl_Box* debug3 + { debug4 = new Fl_Box(0, pos += 32, 64, 32, ""); + debug4->box(FL_ENGRAVED_FRAME); + debug4->align(FL_ALIGN_WRAP); + } // Fl_Box* debug4 + { debug5 = new Fl_Box(0, pos += 32, 64, 32, ""); + debug5->box(FL_ENGRAVED_FRAME); + debug5->align(FL_ALIGN_WRAP); + } // Fl_Box* debug5 + { debug6 = new Fl_Box(0, pos += 32, 64, 32, ""); + debug6->box(FL_ENGRAVED_FRAME); + debug6->align(FL_ALIGN_WRAP); + } // Fl_Box* debug6 + { debug7 = new Fl_Box(0, pos += 32, 64, 32, ""); + debug7->box(FL_ENGRAVED_FRAME); + debug7->align(FL_ALIGN_WRAP); + } // Fl_Box* debug7 + { Fl_Box *fill_box = new Fl_Box(0, pos += 32, 64, 64, ""); + Fl_Group::current()->resizable(fill_box); + } + { Fl_Button* exitbtn = new Fl_Button(0, 700, 64, 38); + //exitbtn->image(fullscreen_image); + exitbtn->callback((Fl_Callback*)cb_exit); + exitbtn->image(new Fl_PNG_Image("exit.png", img(application_exit_png))); + exitbtn->tooltip(_("Exit")); + } + buttons->end(); buttons->spacing(4); buttons->show(); @@ -254,36 +514,55 @@ int main(int argc, char **argv) { showbtn->hide(); showbtn->callback(cb_hide); } - { view = new pdfview(64, 0, 641, 700); - Fl_Group::current()->resizable(view); - } // Fl_Box* o - o->end(); - o->show(); - Fl_Group::current()->resizable(o); + { v = new Fl_Pack(64, 0, 700-64, 700); + v->type(Fl_Pack::HORIZONTAL); + { view = new pdfview(0, 0, 700-64-16, 700); + Fl_Group::current()->resizable(view); + } + { vertical_scrollbar = new Fl_Scrollbar(700-64-16, 0, 16, 700); + vertical_scrollbar->callback((Fl_Callback*)cb_vertical_scrollbar); + } // Fl_Box* o + view->set_scrollbar(vertical_scrollbar); + v->end(); + v->show(); + } - fl_open_display(); - win->size_range(700, 700); + Fl_Group::current()->resizable(v); + win_pack->end(); + win_pack->show(); + + win->resizable(win_pack); + win->callback((Fl_Callback*)cb_exit); + win->size_range(500, 500); win->end(); Fl_PNG_Image wmicon("wmicon.png", img(wmicon_png)); win->icon(&wmicon); + fl_open_display(); + win->show(); + checkX(); + #undef img if (lzo_init() != LZO_E_OK) die(_("LZO init failed\n")); // Set the width to half of the screen, 90% of height - win->size(Fl::w() * 0.4f, Fl::h() * 0.9f); + //win->size(Fl::w() * 0.4f, Fl::h() * 0.9f); - win->show(); + load_config(); - checkX(); + bool used_recent = false; if (optind < argc) - loadfile(argv[optind]); + used_recent = loadfile(argv[optind], recent_files); else - loadfile(NULL); + used_recent = loadfile(NULL, recent_files); + + if (used_recent) { + adjust_display_from_recent(*recent_files); + } view->take_focus(); diff --git a/src/main.h b/src/main.h index bc67538..e224ed5 100644 --- a/src/main.h +++ b/src/main.h @@ -33,9 +33,12 @@ along with this program. If not, see . #include #include #include +#include #include +#include #include #include +#include #include #include @@ -46,17 +49,21 @@ along with this program. If not, see . #include "macros.h" #include "helpers.h" #include "view.h" +#include "config.h" extern Fl_Double_Window *win; extern Fl_Box *pagectr; extern Fl_Input *pagebox; extern Fl_Input_Choice *zoombar; extern Fl_Light_Button *selecting; +extern Fl_Box *debug1, *debug2, *debug3, *debug4, *debug5, *debug6, *debug7; extern u8 details; extern int writepipe; -void loadfile(const char *); +void debug(Fl_Box * ctrl, const float value, const char * hint); + +bool loadfile(const char *, recent_file_struct *recent_files); struct cachedpage { u8 *data; @@ -71,8 +78,8 @@ struct cachedpage { enum zoommode { Z_TRIM = 0, - Z_PAGE, Z_WIDTH, + Z_PAGE, Z_CUSTOM }; @@ -82,6 +89,7 @@ enum msg { }; struct openfile { + char * filename; cachedpage *cache; PDFDoc *pdf; u32 maxw, maxh; diff --git a/src/view.cpp b/src/view.cpp index e4984b1..5b494f4 100644 --- a/src/view.cpp +++ b/src/view.cpp @@ -19,12 +19,14 @@ along with this program. If not, see . // Quarter inch in double resolution #define MARGIN 36 +#define MARGINHALF 18 pdfview::pdfview(int x, int y, int w, int h): Fl_Widget(x, y, w, h), yoff(0), xoff(0), - selx(0), sely(0), selx2(0), sely2(0) { + selx(0), sely(0), selx2(0), sely2(0), + columns(1) { - cachedsize = 7 * 1024 * 1024; + cachedsize = 7 * 1024 * 1024; // 7 megabytes u32 i; for (i = 0; i < CACHE_MAX; i++) { @@ -38,6 +40,70 @@ void pdfview::resetselection() { selx = sely = selx2 = sely2 = 0; } +void pdfview::set_scrollbar(Fl_Scrollbar* vscroll) { + vertical_scrollbar = vscroll; +} + +void pdfview::adjust_scrollbar_parameters() { + float y = floorf(yoff); + float frac = yoff - y; + float k = file->pages - columns + 1; + k = k < columns ? columns : k; + int relpos = ((y / columns + frac) / (k / columns)) * 50000; + int size = 50000 / (k / columns); + vertical_scrollbar->value(relpos, size, 0, 50000); +} + +// From the document position, update scrollbar position. +void pdfview::update_scrollbar() { + float y = floorf(yoff); + float frac = yoff - y; + float k = file->pages - columns + 1; + k = k < columns ? columns : k; + int relpos = ((y / columns + frac) / (k / columns)) * 50000; + vertical_scrollbar->value(relpos); +} + +// From the scrollbar position, update position in the document. +void pdfview::update_position(const int vscroll_pos) { + return; + float frac = yoff - floorf(yoff); + if (file != NULL && file->pages > 0) { + yoff = (((float)(vscroll_pos)) / 50000) * file->pages + (frac * columns); + adjust_yoff(0); + redraw(); + } +} + +void pdfview::go(const u32 page) { + yoff = page; + adjust_yoff(0); + resetselection(); + redraw(); +} + +void pdfview::set_columns(int count) { + columns = count; + if (file && file->pages > 0) { + adjust_scrollbar_parameters(); + } + redraw(); +} + +void pdfview::set_params(int columns_count, float x, float y) { + + yoff = y; + xoff = x; + + adjust_yoff(0); + + columns = columns_count; + if (file && file->pages > 0) { + adjust_scrollbar_parameters(); + } + redraw(); +} + void pdfview::reset() { yoff = 0; xoff = 0; @@ -48,6 +114,8 @@ void pdfview::reset() { for (i = 0; i < CACHE_MAX; i++) { cachedpage[i] = USHRT_MAX; } + + adjust_scrollbar_parameters(); } static u32 fullh(u32 page) { @@ -57,8 +125,9 @@ static u32 fullh(u32 page) { if (file->mode == Z_TRIM) return file->cache[page].h; - return file->cache[page].h + - file->cache[page].top + + return + file->cache[page].h + + file->cache[page].top + file->cache[page].bottom; } @@ -69,35 +138,55 @@ static u32 fullw(u32 page) { if (file->mode == Z_TRIM) return file->cache[page].w; - return file->cache[page].w + + return + file->cache[page].w + file->cache[page].left + file->cache[page].right; } static bool hasmargins(const u32 page) { if (!file->cache[page].ready) - return file->cache[0].left > MARGIN || - file->cache[0].right > MARGIN || - file->cache[0].top > MARGIN || + return + file->cache[0].left > MARGIN || + file->cache[0].right > MARGIN || + file->cache[0].top > MARGIN || file->cache[0].bottom > MARGIN; - return file->cache[page].left > MARGIN || - file->cache[page].right > MARGIN || - file->cache[page].top > MARGIN || + return + file->cache[page].left > MARGIN || + file->cache[page].right > MARGIN || + file->cache[page].top > MARGIN || file->cache[page].bottom > MARGIN; } -static void updatevisible(const float yoff, const u32 w, const u32 h, const bool fromdraw) { +static void updatevisible( + const float yoff, + const u32 w, + const u32 h, + const u32 columns, + const bool fromdraw) { + // From the current zoom mode and view offset, update the visible page info + // Will adjust the following parameters: + // - file->first_visible + // - file->last_visible + // - file->zoom + const u32 prev = file->first_visible; + + // Adjust file->first_visible + file->first_visible = yoff < 0 ? 0 : yoff; if (file->first_visible > file->pages - 1) file->first_visible = file->pages - 1; u32 i; + // Adjust file->zoom + const u32 maxw = file->maxw ? file->maxw : file->cache[0].w; const u32 maxh = file->maxh ? file->maxh : file->cache[0].h; - const u32 maxwmargin = hasmargins(file->first_visible) ? maxw + MARGIN * 2 : maxw; + const u32 maxwmargin = (hasmargins(file->first_visible) ? maxw + MARGIN * 2 : maxw) + + ((columns - 1) * MARGINHALF); const u32 fullw = ::fullw(0); const u32 fullh = ::fullh(0); @@ -106,16 +195,17 @@ static void updatevisible(const float yoff, const u32 w, const u32 h, const bool u32 usedh = fullh; switch (file->mode) { case Z_TRIM: - file->zoom = w / (float) maxwmargin; + file->zoom = (w / columns) / (float) maxwmargin; usedh = maxh; break; case Z_WIDTH: - file->zoom = w / (float) fullw; + file->zoom = (w / columns) / (float) fullw; break; case Z_PAGE: - if (fullw > fullh) { - file->zoom = w / (float) fullw; - } else { + if ((((float)(fullw * columns)) / fullh) > (((float)w) / h)) { + file->zoom = (w / columns) / (float) fullw; + } + else { file->zoom = h / (float) fullh; } break; @@ -123,6 +213,8 @@ static void updatevisible(const float yoff, const u32 w, const u32 h, const bool break; } + // Adjust file->last_visible + const u32 zoomedmargin = MARGIN * file->zoom; i = file->first_visible; u32 tmp = visible * usedh * file->zoom; @@ -130,15 +222,17 @@ static void updatevisible(const float yoff, const u32 w, const u32 h, const bool while (tmp < h) { tmp += usedh * file->zoom; tmp += zoomedmargin; - i++; + i += columns; } // Be conservative - if (i < file->pages - 1) - i++; + i += columns; if (i > file->pages - 1) i = file->pages - 1; file->last_visible = i; + // If position has changed: + // - update current page visible number in the pagebox + // - request a redraw (if not already called by draw...) if (prev != file->first_visible) { char buf[10]; snprintf(buf, 10, "%u", file->first_visible + 1); @@ -147,6 +241,8 @@ static void updatevisible(const float yoff, const u32 w, const u32 h, const bool if (!fromdraw) pagebox->redraw(); } + + view->update_scrollbar(); } void pdfview::draw() { @@ -154,14 +250,19 @@ void pdfview::draw() { if (!file->cache) return; - updatevisible(yoff, w(), h(), true); + updatevisible(yoff, w(), h(), columns, true); const Fl_Color pagecol = FL_WHITE; int X, Y, W, H; + int Xs, Ys, Ws, Hs; // Saved values + fl_clip_box(x(), y(), w(), h(), X, Y, W, H); + + // If nothing is visible on screen, nothing to do if (!W) return; + // Paint the background with page separation color fl_rectf(X, Y, W, H, FL_GRAY + 1); struct cachedpage *cur = &file->cache[file->first_visible]; @@ -171,47 +272,73 @@ void pdfview::draw() { fl_push_clip(X, Y, W, H); // As the variables are used for calculations, reset them to full widget dimensions. - X = x(); - Y = y(); - W = w(); - H = h(); + // (doesn´t seems to be needed... they are adjusted to something else in the code + // that follow...) + + //X = x(); + //Y = y(); + //W = w(); + //H = h(); // Fill each page rect const int zoomedmargin = file->zoom * MARGIN; const int zoomedmarginhalf = zoomedmargin / 2; - u32 i; - const u32 max = file->last_visible; + s32 i, column; const float visible = yoff - floorf(yoff); + int maxH = 0; + H = pxrel(file->first_visible); Y = y() - visible * H; - for (i = file->first_visible; i <= max; i++) { + bool first = true; + + // Do the following for each visible page + for (i = (int)file->first_visible, column = 0; + i <= (int)file->last_visible; + i++, column = (column + 1) % columns) { + cur = &file->cache[i]; if (!cur->ready) break; - H = (fullh(i) + MARGIN) * file->zoom; + H = (fullh(i) + zoomedmargin) * file->zoom; if (file->mode == Z_CUSTOM || file->mode == Z_PAGE) { W = fullw(i) * file->zoom; - X = x() + (w() - W) / 2 + xoff * W; - } else { - X = x(); - W = w(); + X = x() + + (w() - (W * columns) - ((columns - 1) * zoomedmarginhalf)) / 2 + + (xoff * W) + + (column * W) + + (column * zoomedmarginhalf); + } + else { + W = (w() - ((columns - 1) * zoomedmarginhalf)) / columns; + X = x() + ( column * (W + zoomedmarginhalf)); // In case of different page sizes, H needs to be adjusted per-page const float ratio = W / (float) fullw(i); H = fullh(i) * ratio + zoomedmargin; } - // XYWH is now the full area including grey margins. + if (first) { + float xf = X; + debug(debug1, xoff, "xoff"); + debug(debug2, xf, "X"); + debug(debug3, W, "W"); + debug(debug4, yoff, "yoff"); + debug(debug5, Y, "Y"); + debug(debug6, H, "H"); + first = false; + } + // XYWH is now the full area including grey margins. Y += zoomedmarginhalf; H -= zoomedmargin; // XYWH is now the page's area. - if (Y >= y() + h()) - break; - fl_rectf(X, Y, W, H, pagecol); + if (Y >= (y() + h())) + continue; + + fl_rectf(Xs = X, Ys = Y, Ws = W, Hs = H, pagecol); const bool margins = hasmargins(i); const bool trimmed = margins && file->mode == Z_TRIM; @@ -232,6 +359,13 @@ void pdfview::draw() { // Render real content content(i, X, Y, W, H); + // And undo. + X = Xs; + Y = Ys; + W = Ws; + H = Hs; + + /* if (trimmed) { // And undo. Y -= zoomedmarginhalf; @@ -241,45 +375,63 @@ void pdfview::draw() { Y -= cur->top * file->zoom; H += (cur->top + cur->bottom) * file->zoom; } + */ - Y -= zoomedmarginhalf; H += zoomedmargin; - Y += H; + Y -= zoomedmarginhalf; + if (column == (columns - 1)) { + Y += maxH == 0 ? H : (maxH >= H ? maxH : H); + maxH = 0; + } + else { + maxH = maxH >= H ? maxH : H; + } } fl_pop_clip(); } u32 pdfview::pxrel(u32 page) const { - if (file->mode != Z_CUSTOM && file->mode != Z_PAGE) { - const float ratio = w() / (float) fullw(page); - return fullh(page) * ratio + MARGIN * file->zoom; + u32 maxH, h, p; + maxH = 0; + for (p = page; (p < (page + columns)) && (p < file->pages); p++) { + if (file->mode != Z_CUSTOM && file->mode != Z_PAGE) { + const float ratio = (w() / columns) / (float) fullw(p); + h = fullh(p) * ratio + MARGIN * file->zoom; + } + else + h = (fullh(p) + MARGIN) * file->zoom; + maxH = maxH > h ? maxH : h; } - return (fullh(page) + MARGIN) * file->zoom; + return maxH; } float pdfview::maxyoff() const { - const u32 last = file->pages - 1; - if (!file->cache[last].ready) - return last + 0.5f; + float f; - s32 sh = pxrel(last); + u32 last = file->pages - 1; + last -= (last % columns); - const s32 hidden = sh - h(); + if (!file->cache[last].ready) + f = last + 0.5f; + else { + s32 sh = pxrel(last); + + const s32 hidden = sh - h(); - float f = last; + f = last; - if (hidden > 0) { - f += hidden / (float) sh; - } else { - f -= 1 - (sh / (float) h()); - f += MARGIN / (float) h(); + if (hidden > 0) { + f += hidden / (float) sh; + } else { + f -= columns - (sh / (float) h()); + f += MARGIN / (float) h(); + } } if (f < 0) - return 0; - + f = 0.0; return f; } @@ -437,19 +589,22 @@ int pdfview::handle(int e) { if (file->maxh) { if (file->mode != Z_TRIM) - yoff -= (movedy / file->zoom) / fullh(0); + //yoff -= (movedy / file->zoom) / fullh(0); + adjust_yoff(-((movedy / file->zoom) / fullh(0))); else - yoff -= (movedy / file->zoom) / file->maxh; + //yoff -= (movedy / file->zoom) / file->maxh; + adjust_yoff(-((movedy / file->zoom) / file->maxh)); } else { - yoff -= (movedy / (float) h()) / file->zoom; + //yoff -= (movedy / (float) h()) / file->zoom; + adjust_yoff(-((movedy / (float) h()) / file->zoom)); } xoff += (movedx / file->zoom) / fullw(0); - if (yoff < 0) - yoff = 0; - if (yoff >= maxyoff()) - yoff = maxyoff(); + //if (yoff < 0) + // yoff = 0; + //if (yoff >= maxyoff()) + // yoff = maxyoff(); if (xoff < -1) xoff = -1; @@ -462,7 +617,7 @@ int pdfview::handle(int e) { lastx = mx; if (file->cache) - updatevisible(yoff, w(), h(), false); + updatevisible(yoff, w(), h(), columns, false); redraw(); } break; @@ -473,16 +628,12 @@ int pdfview::handle(int e) { else cb_Zoomin(NULL, NULL); } else { - yoff += move * Fl::event_dy(); - if (yoff < 0) - yoff = 0; - if (yoff >= maxyoff()) - yoff = maxyoff(); + adjust_yoff(move * Fl::event_dy()); } resetselection(); if (file->cache) - updatevisible(yoff, w(), h(), false); + updatevisible(yoff, w(), h(), columns, false); redraw(); break; case FL_KEYDOWN: @@ -493,37 +644,41 @@ int pdfview::handle(int e) { if (Fl::event_ctrl()) { yoff = 0; } else { - const u32 page = yoff; - s32 sh = pxrel(page); - s32 shp = sh; - if (page > 0) - shp = pxrel(page - 1); - if (h() + 2 * MARGIN * file->zoom >= sh) { - /* scroll up like Page_Up */ - if (floorf(yoff) + MARGIN * file->zoom / (float) sh >= yoff) { - yoff = floorf(yoff - 1) + MARGIN * file->zoom / 2 / (float) shp; - } else { - yoff = floorf(yoff) + MARGIN * file->zoom / 2 / (float) sh; - } - } else { - /* scroll up less than one page height */ - float d = (h() - MARGIN) / (float) sh; - if (((u32) yoff) == ((u32) (yoff - d))) { - /* not scrolling over page border */ - yoff -= d; - } else { - /* scrolling over page border */ - d -= (yoff - floorf(yoff)); - yoff = floorf(yoff); - /* ratio of prev page can be different */ - d = d * (float) sh / (float) shp; - yoff -= d; - } - } - if (yoff < 0) - yoff = 0; - if (yoff >= maxyoff()) - yoff = maxyoff(); + if (floorf(yoff) == yoff) + adjust_floor_yoff(-1.0); + else + adjust_floor_yoff(0.0); + //const u32 page = yoff; + //s32 sh = pxrel(page); + //s32 shp = sh; + //if (page > 0) + // shp = pxrel(page - 1); + //if (h() + 2 * MARGIN * file->zoom >= sh) { + // /* scroll up like Page_Up */ + // if (floorf(yoff) + MARGIN * file->zoom / (float) sh >= yoff) { + // yoff = floorf(yoff - 1) + MARGIN * file->zoom / 2 / (float) shp; + // } else { + // yoff = floorf(yoff) + MARGIN * file->zoom / 2 / (float) sh; + // } + //} else { + // /* scroll up less than one page height */ + // float d = (h() - MARGIN) / (float) sh; + // if (((u32) yoff) == ((u32) (yoff - d))) { + // /* not scrolling over page border */ + // yoff -= d; + // } else { + // /* scrolling over page border */ + // d -= (yoff - floorf(yoff)); + // yoff = floorf(yoff); + // /* ratio of prev page can be different */ + // d = d * (float) sh / (float) shp; + // yoff -= d; + // } + //} + //if (yoff < 0) + // yoff = 0; + //if (yoff >= maxyoff()) + // yoff = maxyoff(); } redraw(); break; @@ -531,75 +686,77 @@ int pdfview::handle(int e) { if (Fl::event_ctrl()) { yoff = maxyoff(); } else { - const u32 page = yoff; - s32 sh = pxrel(page); - s32 shn = sh; - if (page + 1 <= file->pages - 1) - shn = pxrel(page + 1); - if (h() + 2 * MARGIN * file->zoom >= sh) { - /* scroll down like Page_Down */ - yoff = floorf(yoff + 1) + MARGIN * file->zoom / 2 / (float) shn; - } else { - /* scroll down less than one page height */ - float d = (h() - MARGIN) / (float) sh; - if (((u32) yoff) == ((u32) (yoff + d))) { - /* not scrolling over page border */ - yoff += d; - } else { - /* scrolling over page border */ - d -= (ceilf(yoff) - yoff); - yoff = ceilf(yoff); - /* ratio of next page can be different */ - d = d * (float) sh / (float) shn; - yoff += d; - } - } - if (yoff < 0) - yoff = 0; - if (yoff >= maxyoff()) - yoff = maxyoff(); + adjust_floor_yoff(1); + //const u32 page = yoff; + //s32 sh = pxrel(page); + //s32 shn = sh; + //if (page + 1 <= file->pages - 1) + // shn = pxrel(page + 1); + //if (h() + 2 * MARGIN * file->zoom >= sh) { + // /* scroll down like Page_Down */ + // yoff = floorf(yoff + 1) + MARGIN * file->zoom / 2 / (float) shn; + //} else { + // /* scroll down less than one page height */ + // float d = (h() - MARGIN) / (float) sh; + // if (((u32) yoff) == ((u32) (yoff + d))) { + // /* not scrolling over page border */ + // yoff += d; + // } else { + // /* scrolling over page border */ + // d -= (ceilf(yoff) - yoff); + // yoff = ceilf(yoff); + // /* ratio of next page can be different */ + // d = d * (float) sh / (float) shn; + // yoff += d; + // } + //} + //if (yoff < 0) + // yoff = 0; + //if (yoff >= maxyoff()) + // yoff = maxyoff(); } redraw(); break; case FL_Up: - yoff -= move; - if (yoff < 0) - yoff = 0; + adjust_yoff(-move); redraw(); break; case FL_Down: - yoff += move; - if (yoff >= maxyoff()) - yoff = maxyoff(); + adjust_yoff(move); redraw(); break; case FL_Page_Up: { - const u32 page = yoff; - s32 sh = pxrel(page); - s32 shp = sh; - if (page) - shp = pxrel(page - 1); - if (floorf(yoff) + MARGIN * file->zoom / (float) sh >= yoff) { - yoff = floorf(yoff - 1) + MARGIN * file->zoom / 2 / (float) shp; - } - else { - yoff = floorf(yoff) + MARGIN * file->zoom / 2 / (float) sh; - } - if (yoff < 0) - yoff = 0; + if (floorf(yoff) == yoff) + adjust_floor_yoff(-1.0); + else + adjust_floor_yoff(0.0); + //const u32 page = yoff; + //s32 sh = pxrel(page); + //s32 shp = sh; + //if (page) + // shp = pxrel(page - 1); + //if (floorf(yoff) + MARGIN * file->zoom / (float) sh >= yoff) { + // yoff = floorf(yoff - 1) + MARGIN * file->zoom / 2 / (float) shp; + //} + //else { + // yoff = floorf(yoff) + MARGIN * file->zoom / 2 / (float) sh; + //} + //if (yoff < 0) + // yoff = 0; redraw(); } break; case FL_Page_Down: { - u32 page = floorf(yoff); - s32 shn = pxrel(page); - if (page + 1 <= file->pages - 1) - shn = pxrel(page + 1); - yoff = floorf(yoff + 1) + MARGIN * file->zoom / 2 / (float) shn; - if (yoff >= maxyoff()) - yoff = maxyoff(); + adjust_floor_yoff(1); + //u32 page = floorf(yoff); + //s32 shn = pxrel(page); + //if (page + 1 <= file->pages - 1) + // shn = pxrel(page + 1); + //yoff = floorf(yoff + 1) + MARGIN * file->zoom / 2 / (float) shn; + //if (yoff >= maxyoff()) + // yoff = maxyoff(); redraw(); } break; @@ -634,14 +791,14 @@ int pdfview::handle(int e) { redraw(); break; case FL_F + 8: - cb_hide(NULL, NULL); + cb_hide(NULL, NULL); // Hide toolbar break; default: return 0; } if (file->cache) - updatevisible(yoff, w(), h(), false); + updatevisible(yoff, w(), h(), columns, false); return 1; break; @@ -659,7 +816,46 @@ int pdfview::handle(int e) { return Fl_Widget::handle(e); } +void pdfview::adjust_yoff(float offset) { + + if (offset != 0.0) { + float y = floorf(yoff); + yoff += offset; + float diff = floorf(yoff) - y; + yoff = yoff + (diff * columns) - diff; + } + + if (yoff < 0) + yoff = 0; + else { + float y = maxyoff(); + + if (yoff > y) + yoff = y; + } +} + +void pdfview::adjust_floor_yoff(float offset) { + + if (offset != 0.0) { + float y = floorf(yoff); + yoff = y + offset; + float diff = floorf(yoff) - y; + yoff = yoff + (diff * columns) - diff; + } + + if (yoff < 0) + yoff = 0; + else { + float max = maxyoff(); + + if (yoff > max) + yoff = max; + } +} + u8 pdfview::iscached(const u32 page) const { + u32 i; for (i = 0; i < CACHE_MAX; i++) { if (cachedpage[i] == page) @@ -723,12 +919,6 @@ void pdfview::docache(const u32 page) { XDestroyImage(xi); } -void pdfview::go(const u32 page) { - yoff = page; - resetselection(); - redraw(); -} - void pdfview::content(const u32 page, const s32 X, const s32 Y, const u32 W, const u32 H) { diff --git a/src/view.h b/src/view.h index f824b13..4f48126 100644 --- a/src/view.h +++ b/src/view.h @@ -24,12 +24,20 @@ along with this program. If not, see . class pdfview: public Fl_Widget { public: pdfview(int x, int y, int w, int h); + void set_scrollbar(Fl_Scrollbar* vscroll); void draw(); int handle(int e); void go(const u32 page); void reset(); void resetselection(); + void update_scrollbar(); + void set_columns(int count); + void update_position(const int vscroll_pos); + inline float get_xoff() { return xoff; }; + inline float get_yoff() { return yoff; }; + inline int get_columns() { return columns; }; + void set_params(int columns_count, float x, float y); private: u8 iscached(const u32 page) const; void docache(const u32 page); @@ -37,6 +45,9 @@ class pdfview: public Fl_Widget { u32 pxrel(u32 page) const; void content(const u32 page, const s32 X, const s32 y, const u32 w, const u32 h); + void adjust_yoff(float offset); + void adjust_floor_yoff(float offset); + void adjust_scrollbar_parameters(); float yoff, xoff; u32 cachedsize; @@ -44,8 +55,11 @@ class pdfview: public Fl_Widget { u16 cachedpage[CACHE_MAX]; Pixmap pix[CACHE_MAX]; + Fl_Scrollbar *vertical_scrollbar; + // Text selection coords u16 selx, sely, selx2, sely2; + s32 columns; }; extern pdfview *view; From e40abc228489e57d6d25053d84afc02468e9bd18 Mon Sep 17 00:00:00 2001 From: Guy Turcotte Date: Sun, 30 Oct 2016 21:49:09 -0400 Subject: [PATCH 02/21] Minor information changes --- README.asciidoc | 4 ++-- TODO.txt | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 TODO.txt diff --git a/README.asciidoc b/README.asciidoc index 58da529..1612cc7 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -20,7 +20,7 @@ those two itches scratched? Requirements ------------ -Poppler, LZO, and FLTK 1.3. +Poppler, LZO, libconfig++, and FLTK 1.3. Comparison ---------- @@ -45,7 +45,7 @@ The following modifications have been made to allow FlaxPDF to be verstatile eno to be used everyday as a pdf document viewer. - Multi-columns document display -- Selection button for the last 10 viewed documents +- Selection for the last 10 viewed documents - Automatically open the last viewed document - Fullscreen mode - PageUp and PageDown buttons diff --git a/TODO.txt b/TODO.txt new file mode 100644 index 0000000..85bf6e5 --- /dev/null +++ b/TODO.txt @@ -0,0 +1,17 @@ +TODO +---- + +- Re-integrate the original code for PageDown, PageUp, j and k +- Scrollbars integration still to be completed +- Bug with load of a new file when the current file is still being processed +- Mouse scrolling left-right not working properly with multi-columns +- Text selection not revised yet + +- Other aspects: + + - Title page(s) management: to get proper pages on the same line + - Font. There maybe better fonts available + - Get rid of the "Create Directory" icon in the open file dialog + - Add a new integrated "Page + Trim", if possible... + +- Tests, tests, tests \ No newline at end of file From 597db2c6b4ac06d196e5210c8627a0e7dc58f800 Mon Sep 17 00:00:00 2001 From: Guy Turcotte Date: Mon, 31 Oct 2016 09:55:52 -0400 Subject: [PATCH 03/21] Beta warning --- README.asciidoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.asciidoc b/README.asciidoc index 1612cc7..eee2c2c 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -1,3 +1,5 @@ +[Please note that this branch is in BETA. Still some work remaining to be done...] + FlaxPDF ======= From 1bf5e7cbb9df0fc019b40bf24becdc21c0b73c8d Mon Sep 17 00:00:00 2001 From: Guy Turcotte Date: Mon, 31 Oct 2016 09:57:28 -0400 Subject: [PATCH 04/21] Beta warning --- README.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.asciidoc b/README.asciidoc index eee2c2c..c8351c3 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -1,4 +1,4 @@ -[Please note that this branch is in BETA. Still some work remaining to be done...] +Please note that this branch is in BETA. Still some work remaining to be done... FlaxPDF ======= From 2caf81e08089971be73ed1db8e8c1fd08c6fa7d3 Mon Sep 17 00:00:00 2001 From: Guy Turcotte Date: Mon, 31 Oct 2016 15:11:43 -0400 Subject: [PATCH 05/21] mouse scoll OK --- TODO.txt | 5 ++- src/config.cpp | 32 ++++++++++---------- src/main.cpp | 32 ++++++++++++-------- src/view.cpp | 82 ++++++++++++++++++-------------------------------- 4 files changed, 67 insertions(+), 84 deletions(-) diff --git a/TODO.txt b/TODO.txt index 85bf6e5..ff7ece7 100644 --- a/TODO.txt +++ b/TODO.txt @@ -4,13 +4,12 @@ TODO - Re-integrate the original code for PageDown, PageUp, j and k - Scrollbars integration still to be completed - Bug with load of a new file when the current file is still being processed -- Mouse scrolling left-right not working properly with multi-columns +- [DONE] Mouse scrolling left-right not working properly with multi-columns - Text selection not revised yet - Other aspects: - - Title page(s) management: to get proper pages on the same line - - Font. There maybe better fonts available + - Title page(s) management: to offset rest of the document when columns > 1 - Get rid of the "Create Directory" icon in the open file dialog - Add a new integrated "Page + Trim", if possible... diff --git a/src/config.cpp b/src/config.cpp index 5d05198..dd99736 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -62,11 +62,11 @@ void save_to_config( rf->yoff = yoff; rf->zoom = zoom; rf->zoom_mode = zoommode; + rf->x = x; + rf->y = y; rf->width = w; rf->height = h; rf->fullscreen = full; - rf->x = x; - rf->y = y; // prev is NULL if it's already the first entry in the list if (prev) { @@ -84,11 +84,11 @@ void save_to_config( rf->yoff = yoff; rf->zoom = zoom; rf->zoom_mode = zoommode; + rf->x = x; + rf->y = y; rf->width = w; rf->height = h; rf->fullscreen = full; - rf->x = x; - rf->y = y; rf->next = recent_files; recent_files = rf; @@ -147,16 +147,16 @@ void load_config() { if (file_exists(filename.c_str())) { recent_file_struct *rf = new recent_file_struct; - if (!(s.lookupValue("filename" , rf->filename ) && - s.lookupValue("columns" , rf->columns ) && - s.lookupValue("xoff" , rf->xoff ) && - s.lookupValue("yoff" , rf->yoff ) && - s.lookupValue("zoom" , rf->zoom ) && - s.lookupValue("zoom_mode" , rf->zoom_mode) && - s.lookupValue("width" , rf->width ) && - s.lookupValue("height" , rf->height ) && - s.lookupValue("x" , rf->x ) && - s.lookupValue("y" , rf->y ) && + if (!(s.lookupValue("filename" , rf->filename ) && + s.lookupValue("columns" , rf->columns ) && + s.lookupValue("xoff" , rf->xoff ) && + s.lookupValue("yoff" , rf->yoff ) && + s.lookupValue("zoom" , rf->zoom ) && + s.lookupValue("zoom_mode" , rf->zoom_mode ) && + s.lookupValue("x" , rf->x ) && + s.lookupValue("y" , rf->y ) && + s.lookupValue("width" , rf->width ) && + s.lookupValue("height" , rf->height ) && s.lookupValue("fullscreen", rf->fullscreen))) { fl_alert(_("Configuration file content error: %s."), config_filename); return; @@ -219,10 +219,10 @@ void save_config() { gr.add("yoff", Setting::TypeFloat ) = rf->yoff; gr.add("zoom", Setting::TypeFloat ) = rf->zoom; gr.add("zoom_mode", Setting::TypeInt ) = (int)rf->zoom_mode; - gr.add("width", Setting::TypeInt ) = rf->width; - gr.add("height", Setting::TypeInt ) = rf->height; gr.add("x", Setting::TypeInt ) = rf->x; gr.add("y", Setting::TypeInt ) = rf->y; + gr.add("width", Setting::TypeInt ) = rf->width; + gr.add("height", Setting::TypeInt ) = rf->height; gr.add("fullscreen", Setting::TypeBoolean) = rf->fullscreen; rf = rf->next; diff --git a/src/main.cpp b/src/main.cpp index 34e55d5..8255133 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -35,6 +35,7 @@ static Fl_Pack *buttons = NULL; static Fl_Pack *v = NULL; static Fl_Button *showbtn = NULL; static Fl_Button *fullscreenbtn = NULL; +static Fl_Button *recentselectbtn = NULL; static Fl_Scrollbar * vertical_scrollbar = NULL; @@ -151,14 +152,21 @@ static void cb_zoombar(Fl_Input_Choice *w, void*) { static void adjust_display_from_recent(recent_file_struct &recent) { view->set_params(recent.columns, recent.xoff, recent.yoff); - fullscreen = recent.fullscreen; - cb_fullscreen(NULL, NULL); + if ((recent.columns >= 1) && (recent.columns <= 5)) { + columns->value(recent.columns - 1); + } + + fullscreen = !recent.fullscreen; // Must be inversed... + cb_fullscreen(NULL, NULL); // ...as cb_fullscreen is a toggle + if (recent.zoom_mode == Z_CUSTOM) display_zoom(recent.zoom); else zoombar->value(menu_zoombar[recent.zoom_mode].text); + win->damage(FL_DAMAGE_ALL); win->flush(); + win->position(recent.x, recent.y); win->size(recent.width, recent.height); } @@ -169,8 +177,6 @@ void cb_recent_select(Fl_Select_Browser *, void *) { int i = recent_select->value(); - fl_message("Selected: %d", i); - if (i <= 0) return; i -= 1; @@ -188,11 +194,13 @@ void cb_recent_select(Fl_Select_Browser *, void *) { static void cb_OpenRecent(Fl_Button*, void*) { if (recent_win == NULL){ - recent_win = new Fl_Window(10, 10, 250, 180, "Recent Files"); - Fl_Pack *p = new Fl_Pack(10, 10, 230, 160); + recent_win = new Fl_Window( + win->x() + 30, + win->y() + 100, 450, 180, "Recent Files"); + Fl_Pack *p = new Fl_Pack(10, 10, 430, 160); p->type(1); { - recent_select = new Fl_Select_Browser(0, 0, 230, 160); + recent_select = new Fl_Select_Browser(0, 0, 430, 160); recent_select->callback((Fl_Callback*)cb_recent_select); recent_select->resizable(); recent_select->show(); @@ -394,11 +402,11 @@ int main(int argc, char **argv) { o->callback((Fl_Callback*)cb_Open); o->image(new Fl_PNG_Image("fileopen.png", img(document_open_png))); } // Fl_Button* o - { Fl_Button* o = new Fl_Button(0, pos += 48, 64, 48); - o->tooltip(_("Open a recent file")); - o->callback((Fl_Callback*)cb_OpenRecent); - o->image(new Fl_PNG_Image("fileopen.png", img(emblem_documents_png))); - } // Fl_Button* o + { Fl_Button* recentselectbtn = new Fl_Button(0, pos += 48, 64, 48); + recentselectbtn->tooltip(_("Open a recent file")); + recentselectbtn->callback((Fl_Callback*)cb_OpenRecent); + recentselectbtn->image(new Fl_PNG_Image("fileopen.png", img(emblem_documents_png))); + } // Fl_Button* recentselectbtn { pagebox = new Fl_Input(0, pos += 48, 64, 24); pagebox->value("0"); pagebox->callback((Fl_Callback*)goto_page); diff --git a/src/view.cpp b/src/view.cpp index 5b494f4..f6b1d87 100644 --- a/src/view.cpp +++ b/src/view.cpp @@ -83,11 +83,13 @@ void pdfview::go(const u32 page) { } void pdfview::set_columns(int count) { - columns = count; - if (file && file->pages > 0) { - adjust_scrollbar_parameters(); + if ((count >= 1) && (count <= 5)) { + columns = count; + if (file && file->pages > 0) { + adjust_scrollbar_parameters(); + } + redraw(); } - redraw(); } void pdfview::set_params(int columns_count, float x, float y) { @@ -97,11 +99,7 @@ void pdfview::set_params(int columns_count, float x, float y) { adjust_yoff(0); - columns = columns_count; - if (file && file->pages > 0) { - adjust_scrollbar_parameters(); - } - redraw(); + set_columns(columns_count); } void pdfview::reset() { @@ -365,18 +363,6 @@ void pdfview::draw() { W = Ws; H = Hs; - /* - if (trimmed) { - // And undo. - Y -= zoomedmarginhalf; - H += zoomedmargin; - } else if (margins) { - // And undo. - Y -= cur->top * file->zoom; - H += (cur->top + cur->bottom) * file->zoom; - } - */ - H += zoomedmargin; Y -= zoomedmarginhalf; if (column == (columns - 1)) { @@ -599,19 +585,16 @@ int pdfview::handle(int e) { adjust_yoff(-((movedy / (float) h()) / file->zoom)); } - xoff += (movedx / file->zoom) / fullw(0); - - //if (yoff < 0) - // yoff = 0; - //if (yoff >= maxyoff()) - // yoff = maxyoff(); - - if (xoff < -1) - xoff = -1; - if (xoff > 1) - xoff = 1; if (file->mode != Z_CUSTOM) xoff = 0; + else { + xoff += ((float) movedx / file->zoom) / fullw(0); + float maxchg = (((((float)w() / file->zoom) + (fullw(0) * columns)) / 2) / fullw(0)) - 0.1f; + if (xoff < -maxchg) + xoff = -maxchg; + if (xoff > maxchg) + xoff = maxchg; + } lasty = my; lastx = mx; @@ -727,33 +710,26 @@ int pdfview::handle(int e) { break; case FL_Page_Up: { - if (floorf(yoff) == yoff) - adjust_floor_yoff(-1.0); + const u32 page = yoff; + s32 sh = pxrel(page); + s32 shp = sh; + if (page > columns) + shp = pxrel(page - columns); + float offset = (float)MARGIN * file->zoom / (float) sh; + if ((floorf(yoff) + offset) >= yoff) + adjust_floor_yoff(- (1.0 + (float)MARGIN * file->zoom / 2 / (float) shp)); else - adjust_floor_yoff(0.0); - //const u32 page = yoff; - //s32 sh = pxrel(page); - //s32 shp = sh; - //if (page) - // shp = pxrel(page - 1); - //if (floorf(yoff) + MARGIN * file->zoom / (float) sh >= yoff) { - // yoff = floorf(yoff - 1) + MARGIN * file->zoom / 2 / (float) shp; - //} - //else { - // yoff = floorf(yoff) + MARGIN * file->zoom / 2 / (float) sh; - //} - //if (yoff < 0) - // yoff = 0; + adjust_floor_yoff((float)MARGIN * file->zoom / 2 / (float) sh); redraw(); } break; case FL_Page_Down: { - adjust_floor_yoff(1); - //u32 page = floorf(yoff); - //s32 shn = pxrel(page); - //if (page + 1 <= file->pages - 1) - // shn = pxrel(page + 1); + u32 page = yoff; + s32 shn = pxrel(page); + if (page + columns <= file->pages - 1) + shn = pxrel(page + columns); + adjust_floor_yoff(1.0f + file->zoom * MARGIN / 2 / (float)shn); //yoff = floorf(yoff + 1) + MARGIN * file->zoom / 2 / (float) shn; //if (yoff >= maxyoff()) // yoff = maxyoff(); From b58f39775883dd21f95b26d25df94371aaef1b1f Mon Sep 17 00:00:00 2001 From: Guy Turcotte Date: Tue, 1 Nov 2016 15:17:49 -0400 Subject: [PATCH 06/21] Page{Up,Down},Home,End,j,k revisited; Some dimension computation adjusted, not finished yet. --- TODO.txt | 9 +- src/view.cpp | 246 ++++++++++++++++++++++----------------------------- src/view.h | 1 + 3 files changed, 115 insertions(+), 141 deletions(-) diff --git a/TODO.txt b/TODO.txt index ff7ece7..852ef61 100644 --- a/TODO.txt +++ b/TODO.txt @@ -1,10 +1,13 @@ TODO ---- -- Re-integrate the original code for PageDown, PageUp, j and k -- Scrollbars integration still to be completed -- Bug with load of a new file when the current file is still being processed +- [DONE] Re-integrate the original code for PageDown, PageUp, j and k - [DONE] Mouse scrolling left-right not working properly with multi-columns +- Dimensions functions to be revised for discripencies in the With / High computations +- Scrollbars integration still to be completed +- Bug with load of a new file when the current file is still being processed -> crash +- Get rid of compilation warnings + - Text selection not revised yet - Other aspects: diff --git a/src/view.cpp b/src/view.cpp index f6b1d87..c2ec79a 100644 --- a/src/view.cpp +++ b/src/view.cpp @@ -106,6 +106,8 @@ void pdfview::reset() { yoff = 0; xoff = 0; + adjust_yoff(0); + resetselection(); u32 i; @@ -157,18 +159,14 @@ static bool hasmargins(const u32 page) { file->cache[page].bottom > MARGIN; } -static void updatevisible( - const float yoff, - const u32 w, - const u32 h, - const u32 columns, - const bool fromdraw) { +void pdfview::updatevisible(const bool fromdraw) { // From the current zoom mode and view offset, update the visible page info // Will adjust the following parameters: // - file->first_visible // - file->last_visible // - file->zoom + // - pagebox->value const u32 prev = file->first_visible; @@ -177,7 +175,6 @@ static void updatevisible( file->first_visible = yoff < 0 ? 0 : yoff; if (file->first_visible > file->pages - 1) file->first_visible = file->pages - 1; - u32 i; // Adjust file->zoom @@ -193,18 +190,18 @@ static void updatevisible( u32 usedh = fullh; switch (file->mode) { case Z_TRIM: - file->zoom = (w / columns) / (float) maxwmargin; + file->zoom = (w() / columns) / (float) maxwmargin; usedh = maxh; break; case Z_WIDTH: - file->zoom = (w / columns) / (float) fullw; + file->zoom = (w() / columns) / ((float) fullw - ((columns - 1) * MARGINHALF)); break; case Z_PAGE: - if ((((float)(fullw * columns)) / fullh) > (((float)w) / h)) { - file->zoom = (w / columns) / (float) fullw; + if ((((float)(fullw * columns + ((columns - 1) * MARGINHALF))) / fullh) > ((float)w() / h())) { + file->zoom = (w() / columns) / ((float) fullw ); } else { - file->zoom = h / (float) fullh; + file->zoom = (float)h() / fullh; } break; case Z_CUSTOM: @@ -214,10 +211,11 @@ static void updatevisible( // Adjust file->last_visible const u32 zoomedmargin = MARGIN * file->zoom; - i = file->first_visible; + u32 i = file->first_visible; u32 tmp = visible * usedh * file->zoom; tmp += zoomedmargin; - while (tmp < h) { + + while (tmp < h()) { tmp += usedh * file->zoom; tmp += zoomedmargin; i += columns; @@ -240,7 +238,7 @@ static void updatevisible( pagebox->redraw(); } - view->update_scrollbar(); + update_scrollbar(); } void pdfview::draw() { @@ -248,7 +246,7 @@ void pdfview::draw() { if (!file->cache) return; - updatevisible(yoff, w(), h(), columns, true); + updatevisible(true); const Fl_Color pagecol = FL_WHITE; int X, Y, W, H; @@ -257,7 +255,7 @@ void pdfview::draw() { fl_clip_box(x(), y(), w(), h(), X, Y, W, H); // If nothing is visible on screen, nothing to do - if (!W) + if (W == 0 || H == 0) return; // Paint the background with page separation color @@ -279,19 +277,18 @@ void pdfview::draw() { //H = h(); // Fill each page rect - const int zoomedmargin = file->zoom * MARGIN; - const int zoomedmarginhalf = zoomedmargin / 2; - s32 i, column; - const float visible = yoff - floorf(yoff); - int maxH = 0; + const int zoomedmargin = file->zoom * MARGIN; + const int zoomedmarginhalf = zoomedmargin / 2; + const float visible = yoff - floorf(yoff); + int maxH = 0; H = pxrel(file->first_visible); Y = y() - visible * H; - bool first = true; + u32 i, column; // Do the following for each visible page - for (i = (int)file->first_visible, column = 0; + for (i = file->first_visible, column = 0; i <= (int)file->last_visible; i++, column = (column + 1) % columns) { @@ -299,7 +296,8 @@ void pdfview::draw() { if (!cur->ready) break; - H = (fullh(i) + zoomedmargin) * file->zoom; + //H = (fullh(i) + MARGIN) * file->zoom; + H = fullh(i) * file->zoom; if (file->mode == Z_CUSTOM || file->mode == Z_PAGE) { W = fullw(i) * file->zoom; X = x() + @@ -314,23 +312,12 @@ void pdfview::draw() { // In case of different page sizes, H needs to be adjusted per-page const float ratio = W / (float) fullw(i); - H = fullh(i) * ratio + zoomedmargin; - } - - if (first) { - float xf = X; - debug(debug1, xoff, "xoff"); - debug(debug2, xf, "X"); - debug(debug3, W, "W"); - debug(debug4, yoff, "yoff"); - debug(debug5, Y, "Y"); - debug(debug6, H, "H"); - first = false; + H = fullh(i) * ratio; // + zoomedmargin; } - // XYWH is now the full area including grey margins. + // XYW (but H) is now the full area including grey margins. Y += zoomedmarginhalf; - H -= zoomedmargin; + //H -= zoomedmargin; // XYWH is now the page's area. if (Y >= (y() + h())) @@ -378,8 +365,8 @@ void pdfview::draw() { } u32 pdfview::pxrel(u32 page) const { - u32 maxH, h, p; - maxH = 0; + u32 maxH = 0; + u32 h, p; for (p = page; (p < (page + columns)) && (p < file->pages); p++) { if (file->mode != Z_CUSTOM && file->mode != Z_PAGE) { const float ratio = (w() / columns) / (float) fullw(p); @@ -399,25 +386,26 @@ float pdfview::maxyoff() const { u32 last = file->pages - 1; last -= (last % columns); + const s32 sh = pxrel(last); + float offset = file->zoom * MARGIN / (float) sh; + if (!file->cache[last].ready) f = last + 0.5f; else { - s32 sh = pxrel(last); - const s32 hidden = sh - h(); f = last; if (hidden > 0) { - f += hidden / (float) sh; + f += hidden / (float) sh - offset; } else { - f -= columns - (sh / (float) h()); - f += MARGIN / (float) h(); + f -= columns - (sh / (float) h()) + (columns * offset); } + //f -= MARGIN / (float) sh; } - if (f < 0) - f = 0.0; + if (f < 0.0f) + f = offset / 2; return f; } @@ -600,7 +588,7 @@ int pdfview::handle(int e) { lastx = mx; if (file->cache) - updatevisible(yoff, w(), h(), columns, false); + updatevisible(false); redraw(); } break; @@ -616,7 +604,7 @@ int pdfview::handle(int e) { resetselection(); if (file->cache) - updatevisible(yoff, w(), h(), columns, false); + updatevisible(false); redraw(); break; case FL_KEYDOWN: @@ -627,41 +615,31 @@ int pdfview::handle(int e) { if (Fl::event_ctrl()) { yoff = 0; } else { - if (floorf(yoff) == yoff) - adjust_floor_yoff(-1.0); - else - adjust_floor_yoff(0.0); - //const u32 page = yoff; - //s32 sh = pxrel(page); - //s32 shp = sh; - //if (page > 0) - // shp = pxrel(page - 1); - //if (h() + 2 * MARGIN * file->zoom >= sh) { - // /* scroll up like Page_Up */ - // if (floorf(yoff) + MARGIN * file->zoom / (float) sh >= yoff) { - // yoff = floorf(yoff - 1) + MARGIN * file->zoom / 2 / (float) shp; - // } else { - // yoff = floorf(yoff) + MARGIN * file->zoom / 2 / (float) sh; - // } - //} else { - // /* scroll up less than one page height */ - // float d = (h() - MARGIN) / (float) sh; - // if (((u32) yoff) == ((u32) (yoff - d))) { - // /* not scrolling over page border */ - // yoff -= d; - // } else { - // /* scrolling over page border */ - // d -= (yoff - floorf(yoff)); - // yoff = floorf(yoff); - // /* ratio of prev page can be different */ - // d = d * (float) sh / (float) shp; - // yoff -= d; - // } - //} - //if (yoff < 0) - // yoff = 0; - //if (yoff >= maxyoff()) - // yoff = maxyoff(); + const u32 page = yoff; + s32 sh; + s32 shp = sh = pxrel(page); + if (page >= columns) + shp = pxrel(page - columns); + if (h() + 2 * MARGIN * file->zoom >= sh) { + /* scroll up like Page_Up */ + float offset = file->zoom * MARGIN / (float) sh; + if (floorf(yoff) + offset >= yoff) { + adjust_floor_yoff(- (1.0f - file->zoom * MARGIN / 2 / (float) shp)); + } else { + adjust_floor_yoff(offset / 2); + } + } else { + /* scroll up less than one page height */ + float d = (h() - MARGIN) / (float) sh; + if (((u32) yoff) != ((u32) (yoff - d))) { + /* scrolling over page border */ + d -= (yoff - floorf(yoff)); + yoff = floorf(yoff); + /* ratio of prev page can be different */ + d = d * (float) sh / (float) shp; + } + adjust_yoff(-d); + } } redraw(); break; @@ -669,34 +647,26 @@ int pdfview::handle(int e) { if (Fl::event_ctrl()) { yoff = maxyoff(); } else { - adjust_floor_yoff(1); - //const u32 page = yoff; - //s32 sh = pxrel(page); - //s32 shn = sh; - //if (page + 1 <= file->pages - 1) - // shn = pxrel(page + 1); - //if (h() + 2 * MARGIN * file->zoom >= sh) { - // /* scroll down like Page_Down */ - // yoff = floorf(yoff + 1) + MARGIN * file->zoom / 2 / (float) shn; - //} else { - // /* scroll down less than one page height */ - // float d = (h() - MARGIN) / (float) sh; - // if (((u32) yoff) == ((u32) (yoff + d))) { - // /* not scrolling over page border */ - // yoff += d; - // } else { - // /* scrolling over page border */ - // d -= (ceilf(yoff) - yoff); - // yoff = ceilf(yoff); - // /* ratio of next page can be different */ - // d = d * (float) sh / (float) shn; - // yoff += d; - // } - //} - //if (yoff < 0) - // yoff = 0; - //if (yoff >= maxyoff()) - // yoff = maxyoff(); + const u32 page = yoff; + s32 sh; + s32 shn = sh = pxrel(page); + if (page + columns <= file->pages - 1) + shn = pxrel(page + columns); + if (h() + 2 * MARGIN * file->zoom >= sh) { + /* scroll down like Page_Down */ + adjust_floor_yoff(1.0f + file->zoom * MARGIN / 2 / (float) shn); + } else { + /* scroll down less than one page height */ + float d = (h() - MARGIN) / (float) sh; + if (((u32) yoff) != ((u32) (yoff + d))) { + /* scrolling over page border */ + d -= (ceilf(yoff) - yoff); + yoff = ceilf(yoff); + /* ratio of next page can be different */ + d = d * (float) sh / (float) shn; + } + adjust_yoff(d); + } } redraw(); break; @@ -711,38 +681,37 @@ int pdfview::handle(int e) { case FL_Page_Up: { const u32 page = yoff; - s32 sh = pxrel(page); - s32 shp = sh; - if (page > columns) + s32 sh; + s32 shp = sh = pxrel(page); + if (page >= columns) shp = pxrel(page - columns); - float offset = (float)MARGIN * file->zoom / (float) sh; + float offset = file->zoom * MARGIN / (float) sh; if ((floorf(yoff) + offset) >= yoff) - adjust_floor_yoff(- (1.0 + (float)MARGIN * file->zoom / 2 / (float) shp)); + adjust_floor_yoff(- (1.0f - file->zoom * MARGIN / 2 / (float) shp)); else - adjust_floor_yoff((float)MARGIN * file->zoom / 2 / (float) sh); + adjust_floor_yoff(offset / 2); redraw(); } break; case FL_Page_Down: { u32 page = yoff; - s32 shn = pxrel(page); - if (page + columns <= file->pages - 1) - shn = pxrel(page + columns); + s32 shn = pxrel((page + columns <= file->pages - 1) ? page + columns : page); adjust_floor_yoff(1.0f + file->zoom * MARGIN / 2 / (float)shn); - //yoff = floorf(yoff + 1) + MARGIN * file->zoom / 2 / (float) shn; - //if (yoff >= maxyoff()) - // yoff = maxyoff(); redraw(); } break; case FL_Home: + { + const u32 page = yoff; + const s32 sh = pxrel(page); if (Fl::event_ctrl()) { - yoff = 0; + yoff = 0 + file->zoom * MARGIN / (float) sh / 2; } else { - yoff = floorf(yoff); + yoff = floorf(yoff) + file->zoom * MARGIN / (float) sh / 2; } redraw(); + } break; case FL_End: if (Fl::event_ctrl()) { @@ -756,10 +725,7 @@ int pdfview::handle(int e) { float tmp = floorf(yoff) + hidden / (float) sh; if (tmp > yoff) yoff = tmp; - if (yoff < 0) - yoff = 0; - if (yoff >= maxyoff()) - yoff = maxyoff(); + adjust_yoff(0); } else { yoff = ceilf(yoff) - 0.4f; } @@ -774,7 +740,7 @@ int pdfview::handle(int e) { } if (file->cache) - updatevisible(yoff, w(), h(), columns, false); + updatevisible(false); return 1; break; @@ -794,15 +760,17 @@ int pdfview::handle(int e) { void pdfview::adjust_yoff(float offset) { - if (offset != 0.0) { + if (offset != 0.0f) { float y = floorf(yoff); yoff += offset; float diff = floorf(yoff) - y; yoff = yoff + (diff * columns) - diff; } - if (yoff < 0) - yoff = 0; + if (yoff <= 0.0f) { + const s32 sh = pxrel(0); + yoff = file->zoom * MARGIN / (float) sh / 2; + } else { float y = maxyoff(); @@ -813,15 +781,17 @@ void pdfview::adjust_yoff(float offset) { void pdfview::adjust_floor_yoff(float offset) { - if (offset != 0.0) { + if (offset != 0.0f) { float y = floorf(yoff); yoff = y + offset; float diff = floorf(yoff) - y; yoff = yoff + (diff * columns) - diff; } - if (yoff < 0) - yoff = 0; + if (yoff <= 0.0f) { + const s32 sh = pxrel(0); + yoff = file->zoom * MARGIN / (float) sh / 2; + } else { float max = maxyoff(); diff --git a/src/view.h b/src/view.h index 4f48126..420b310 100644 --- a/src/view.h +++ b/src/view.h @@ -48,6 +48,7 @@ class pdfview: public Fl_Widget { void adjust_yoff(float offset); void adjust_floor_yoff(float offset); void adjust_scrollbar_parameters(); + void updatevisible(const bool fromdraw); float yoff, xoff; u32 cachedsize; From aa7aeb2300692132e081c87fcff6ecb032ca8755 Mon Sep 17 00:00:00 2001 From: Guy Turcotte Date: Tue, 1 Nov 2016 19:36:28 -0400 Subject: [PATCH 07/21] Some dimensions adjustments --- TODO.txt | 4 ++-- src/view.cpp | 57 +++++++++++++++++++++++++++++++--------------------- 2 files changed, 36 insertions(+), 25 deletions(-) diff --git a/TODO.txt b/TODO.txt index 852ef61..bd81d5c 100644 --- a/TODO.txt +++ b/TODO.txt @@ -3,10 +3,10 @@ TODO - [DONE] Re-integrate the original code for PageDown, PageUp, j and k - [DONE] Mouse scrolling left-right not working properly with multi-columns -- Dimensions functions to be revised for discripencies in the With / High computations +- [DONE] Get rid of compilation warnings +- Dimensions functions to be revised for discripencies in the Width / High computations - Scrollbars integration still to be completed - Bug with load of a new file when the current file is still being processed -> crash -- Get rid of compilation warnings - Text selection not revised yet diff --git a/src/view.cpp b/src/view.cpp index c2ec79a..61863cc 100644 --- a/src/view.cpp +++ b/src/view.cpp @@ -190,15 +190,15 @@ void pdfview::updatevisible(const bool fromdraw) { u32 usedh = fullh; switch (file->mode) { case Z_TRIM: - file->zoom = (w() / columns) / (float) maxwmargin; + file->zoom = (float)(w() / columns) / maxwmargin; usedh = maxh; break; case Z_WIDTH: - file->zoom = (w() / columns) / ((float) fullw - ((columns - 1) * MARGINHALF)); + file->zoom = (float)(w() / columns) / fullw; break; case Z_PAGE: if ((((float)(fullw * columns + ((columns - 1) * MARGINHALF))) / fullh) > ((float)w() / h())) { - file->zoom = (w() / columns) / ((float) fullw ); + file->zoom = (float)(w() / columns) / fullw; } else { file->zoom = (float)h() / fullh; @@ -212,7 +212,7 @@ void pdfview::updatevisible(const bool fromdraw) { const u32 zoomedmargin = MARGIN * file->zoom; u32 i = file->first_visible; - u32 tmp = visible * usedh * file->zoom; + s32 tmp = visible * usedh * file->zoom; tmp += zoomedmargin; while (tmp < h()) { @@ -285,7 +285,7 @@ void pdfview::draw() { H = pxrel(file->first_visible); Y = y() - visible * H; - u32 i, column; + s32 i, column; // Do the following for each visible page for (i = file->first_visible, column = 0; @@ -364,21 +364,26 @@ void pdfview::draw() { fl_pop_clip(); } +// Compute the vertical screen size of a serie of pages that will be lined. +// The columns variable indicates how many pages to consider. The +// page paremeter is the first page to be seen on the line. u32 pdfview::pxrel(u32 page) const { u32 maxH = 0; u32 h, p; for (p = page; (p < (page + columns)) && (p < file->pages); p++) { if (file->mode != Z_CUSTOM && file->mode != Z_PAGE) { const float ratio = (w() / columns) / (float) fullw(p); - h = fullh(p) * ratio + MARGIN * file->zoom; + h = fullh(p) * ratio; //+ MARGIN * file->zoom; } else - h = (fullh(p) + MARGIN) * file->zoom; + h = (fullh(p) /* + MARGIN */) * file->zoom; maxH = maxH > h ? maxH : h; } return maxH; } +// Compute the maximum yoff value, taking care of the number of +// columns displayed and the screen size float pdfview::maxyoff() const { float f; @@ -397,9 +402,9 @@ float pdfview::maxyoff() const { f = last; if (hidden > 0) { - f += hidden / (float) sh - offset; + f += hidden / (float) sh + offset / 2; } else { - f -= columns - (sh / (float) h()) + (columns * offset); + f -= columns - (sh / (float) h()) - offset / 2; } //f -= MARGIN / (float) sh; } @@ -615,12 +620,12 @@ int pdfview::handle(int e) { if (Fl::event_ctrl()) { yoff = 0; } else { - const u32 page = yoff; + const s32 page = yoff; s32 sh; s32 shp = sh = pxrel(page); if (page >= columns) shp = pxrel(page - columns); - if (h() + 2 * MARGIN * file->zoom >= sh) { + if ((h() + (file->zoom * 2 * MARGIN)) >= sh) { /* scroll up like Page_Up */ float offset = file->zoom * MARGIN / (float) sh; if (floorf(yoff) + offset >= yoff) { @@ -647,10 +652,10 @@ int pdfview::handle(int e) { if (Fl::event_ctrl()) { yoff = maxyoff(); } else { - const u32 page = yoff; + const s32 page = yoff; s32 sh; s32 shn = sh = pxrel(page); - if (page + columns <= file->pages - 1) + if (page + columns <= (s32)(file->pages - 1)) shn = pxrel(page + columns); if (h() + 2 * MARGIN * file->zoom >= sh) { /* scroll down like Page_Down */ @@ -680,24 +685,27 @@ int pdfview::handle(int e) { break; case FL_Page_Up: { - const u32 page = yoff; + const s32 page = yoff; s32 sh; s32 shp = sh = pxrel(page); if (page >= columns) shp = pxrel(page - columns); - float offset = file->zoom * MARGIN / (float) sh; - if ((floorf(yoff) + offset) >= yoff) + float marginoffset = file->zoom * MARGIN / (float) sh; + + if ((floorf(yoff) + marginoffset) >= yoff) adjust_floor_yoff(- (1.0f - file->zoom * MARGIN / 2 / (float) shp)); else - adjust_floor_yoff(offset / 2); + adjust_floor_yoff(marginoffset / 2); redraw(); } break; case FL_Page_Down: { - u32 page = yoff; - s32 shn = pxrel((page + columns <= file->pages - 1) ? page + columns : page); - adjust_floor_yoff(1.0f + file->zoom * MARGIN / 2 / (float)shn); + s32 page = yoff; + s32 shn = pxrel((page + columns <= (s32)(file->pages - 1)) ? page + columns : page); + float marginoffset = file->zoom * MARGIN / (float) shn; + + adjust_floor_yoff(1.0f + marginoffset / 2); redraw(); } break; @@ -705,10 +713,12 @@ int pdfview::handle(int e) { { const u32 page = yoff; const s32 sh = pxrel(page); + float marginoffset = file->zoom * MARGIN / (float) sh; + if (Fl::event_ctrl()) { - yoff = 0 + file->zoom * MARGIN / (float) sh / 2; + yoff = 0 + marginoffset / 2; } else { - yoff = floorf(yoff) + file->zoom * MARGIN / (float) sh / 2; + yoff = floorf(yoff) + marginoffset / 2; } redraw(); } @@ -719,10 +729,11 @@ int pdfview::handle(int e) { } else { u32 page = yoff; s32 sh = pxrel(page); + float marginoffset = file->zoom * MARGIN / (float) sh; if (file->cache[page].ready) { const s32 hidden = sh - h(); - float tmp = floorf(yoff) + hidden / (float) sh; + float tmp = floorf(yoff) + hidden / (float) sh + marginoffset / 2; if (tmp > yoff) yoff = tmp; adjust_yoff(0); From 2b9c7e766b233e44c084f0f5e42b82c061b6c7d5 Mon Sep 17 00:00:00 2001 From: Guy Date: Wed, 2 Nov 2016 11:24:58 -0400 Subject: [PATCH 08/21] New Z_PGTRIM zoom choice half way to code changes --- README.asciidoc | 65 +++++++++++++++++++++++++++++++++ src/main.cpp | 9 +++-- src/main.h | 1 + src/view.cpp | 95 +++++++++++++++++++++++++++++++++++-------------- src/view.h | 4 ++- 5 files changed, 143 insertions(+), 31 deletions(-) diff --git a/README.asciidoc b/README.asciidoc index c8351c3..028ce77 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -54,3 +54,68 @@ to be used everyday as a pdf document viewer. - Exit button - Scrollbars - Gnome standard icons + +Installation +------------ + +The following packages are required and may need to be built and installed if not +available as a package: + +- poppler (http://poppler.freedesktop.org/poppler-0.48.0.tar.xz) +- fltk 1.3.3 (http://www.fltk.org/software.php?VERSION=1.3.3&FILE=fltk/1.3.3/fltk-1.3.3-source.tar.gz) + +The following packages are available via apt-get under linux: + +- libconfig++ ("$ sudo apt-get install libconfig++-dev") +- libjpeg ("$ sudo apt-get install libjpeg-dev") +- libpng ("$ sudo apt-get install libpng-dev") +- libtiff ("$ sudi apt-get install libtiff-dev") + +Poppler +------- + +To properly build poppler, some libraries are required to be installed. That's the case for +libjpeg, libpng and libtiff. Other libraries are required and are often already installed. Here is +a page to get some more informations about the dependencies: + +http://www.linuxfromscratch.org/blfs/view/svn/general/poppler.html + +Once the popper library untared, you need to configure it with the following command: + +------------------------------------------ +./configure --prefix=/usr \ + --sysconfdir=/etc \ + --disable-static \ + --enable-build-type=release \ + --enable-cmyk \ + --enable-xpdf-headers +------------------------------------------ + +After that, the usual commands make && sudo make install will complete the installation. + +FLTK +---- + +The FLTK library is installed using the usual GNU autoconf commands: + +-------------------- +$ ./configure +$ make +$ sudo make install +-------------------- + +FlaxPDF +------- + +To install FlaxPDF, the following commands are required: + +-------------------- +$ ./autogen.sh +$ ./configure +$ make +$ sudo make install +-------------------- + +All the previously indicated libraries must have been installed before building +the application. The installation will add an entry into the OFFICE main menu of you +linux installation. diff --git a/src/main.cpp b/src/main.cpp index 8255133..e9c152c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -68,9 +68,10 @@ u8 details = 0; openfile *file = NULL; static Fl_Menu_Item menu_zoombar[] = { - {"Trim", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, - {"Width", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, - {"Page", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, + {"Trim", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, + {"Width", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, + {"Page", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, + {"PgTrim", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0} }; @@ -141,6 +142,8 @@ static void cb_zoombar(Fl_Input_Choice *w, void*) { file->mode = Z_WIDTH; } else if (!strcmp(val, menu_zoombar[2].text)) { file->mode = Z_PAGE; + } else if (!strcmp(val, menu_zoombar[3].text)) { + file->mode = Z_PGTRIM; } else { //fl_alert(_("Unrecognized zoom level")); } diff --git a/src/main.h b/src/main.h index e224ed5..647f54b 100644 --- a/src/main.h +++ b/src/main.h @@ -80,6 +80,7 @@ enum zoommode { Z_TRIM = 0, Z_WIDTH, Z_PAGE, + Z_PGTRIM, Z_CUSTOM }; diff --git a/src/view.cpp b/src/view.cpp index 61863cc..274807a 100644 --- a/src/view.cpp +++ b/src/view.cpp @@ -118,30 +118,62 @@ void pdfview::reset() { adjust_scrollbar_parameters(); } -static u32 fullh(u32 page) { +u32 pdfview::fullh(u32 page) const { + if (!file->cache[page].ready) page = 0; - if (file->mode == Z_TRIM) - return file->cache[page].h; + u32 fh = 0; + s32 i; - return - file->cache[page].h + - file->cache[page].top + - file->cache[page].bottom; + if (file->mode == Z_TRIM || file->mode == Z_PGTRIM) { + for (i = page; (i < (page + columns)) && (i < file->pages); i++) { + if (file->cache[i].ready && (file->cache[i].h > fh)) + fh = file->cache[i].h; + } + } + else { + for (i = page; (i < (page + columns)) && (i < file->pages); i++) { + if (file->cache[i].ready) { + u32 h = file->cache[page].h + + file->cache[page].top + + file->cache[page].bottom; + if (h > fh) + fh = h; + } + } + } + + return fh; } -static u32 fullw(u32 page) { - if (!file->cache[page].ready) - page = 0; +u32 pdfview::fullw(u32 page) const { + u32 fw = 0; + s32 i; - if (file->mode == Z_TRIM) - return file->cache[page].w; + if (file->mode == Z_TRIM || file->mode == Z_PGTRIM) { + for (i = page; (i < (page + columns)) && (i < file->pages); i++) { + if (file->cache[i].ready) + fw += file->cache[i].w; + else + fw += file->cache[0].w; + } + } + else { + for (i = page; (i < (page + columns)) && (i < file->pages); i++) { + if (file->cache[i].ready) { + fw += file->cache[page].w + + file->cache[page].left + + file->cache[page].right; + else + fw += file->cache[0].w + + file->cache[0].left + + file->cache[0].right; + } + } + } - return - file->cache[page].w + - file->cache[page].left + - file->cache[page].right; + return fw + (columns - 1) * MARGINHALF; } static bool hasmargins(const u32 page) { @@ -182,23 +214,31 @@ void pdfview::updatevisible(const bool fromdraw) { const u32 maxh = file->maxh ? file->maxh : file->cache[0].h; const u32 maxwmargin = (hasmargins(file->first_visible) ? maxw + MARGIN * 2 : maxw) + ((columns - 1) * MARGINHALF); - const u32 fullw = ::fullw(0); - const u32 fullh = ::fullh(0); + const u32 fullw = this->fullw(0); + const u32 fullh = this->fullh(0); const float visible = yoff < 0 ? 0 : 1 - (yoff - floorf(yoff)); u32 usedh = fullh; switch (file->mode) { case Z_TRIM: - file->zoom = (float)(w() / columns) / maxwmargin; + file->zoom = (float)w() / maxwmargin; usedh = maxh; break; case Z_WIDTH: - file->zoom = (float)(w() / columns) / fullw; + file->zoom = (float)w() / fullw; break; case Z_PAGE: - if ((((float)(fullw * columns + ((columns - 1) * MARGINHALF))) / fullh) > ((float)w() / h())) { - file->zoom = (float)(w() / columns) / fullw; + if (((float)fullw / fullh) > ((float)w() / h())) { + file->zoom = (float)w() / fullw; + } + else { + file->zoom = (float)h() / fullh; + } + break; + case Z_PGTRIM: + if (((float)fullw / fullh) > ((float)w() / h())) { + file->zoom = (float)w() / fullw; } else { file->zoom = (float)h() / fullh; @@ -298,7 +338,7 @@ void pdfview::draw() { //H = (fullh(i) + MARGIN) * file->zoom; H = fullh(i) * file->zoom; - if (file->mode == Z_CUSTOM || file->mode == Z_PAGE) { + if (file->mode == Z_CUSTOM || file->mode == Z_PAGE || file->mode == Z_PGTRIM) { W = fullw(i) * file->zoom; X = x() + (w() - (W * columns) - ((columns - 1) * zoomedmarginhalf)) / 2 + @@ -326,7 +366,7 @@ void pdfview::draw() { fl_rectf(Xs = X, Ys = Y, Ws = W, Hs = H, pagecol); const bool margins = hasmargins(i); - const bool trimmed = margins && file->mode == Z_TRIM; + const bool trimmed = margins && (file->mode == Z_TRIM || file->mode == Z_PGTRIM); if (trimmed) { // If the page was trimmed, have the real one a bit smaller X += zoomedmarginhalf; @@ -371,7 +411,7 @@ u32 pdfview::pxrel(u32 page) const { u32 maxH = 0; u32 h, p; for (p = page; (p < (page + columns)) && (p < file->pages); p++) { - if (file->mode != Z_CUSTOM && file->mode != Z_PAGE) { + if (file->mode != Z_CUSTOM && file->mode != Z_PAGE && file->mode != Z_PGTRIM) { const float ratio = (w() / columns) / (float) fullw(p); h = fullh(p) * ratio; //+ MARGIN * file->zoom; } @@ -440,7 +480,7 @@ int pdfview::handle(int e) { const u32 ratiominus = hasmargins(page) ? zoomedmargin : 0; const float ratio = w() / (float) fullw(page); const float ratiox = (w() - ratiominus) / (float) fullw(page); - if (file->mode != Z_CUSTOM && file->mode != Z_PAGE) { + if (file->mode != Z_CUSTOM && file->mode != Z_PAGE && file->mode != Z_PGTRIM) { zoomedh = fullh(page) * visible * ratio; } @@ -472,6 +512,7 @@ int pdfview::handle(int e) { // Offset switch (file->mode) { case Z_TRIM: + case Z_PGTRIM: // X and Y start in widget space, 0 to w/h. Y += floored * (fullh(page) * ratiox + zoomedmargin + ratiominus); @@ -567,7 +608,7 @@ int pdfview::handle(int e) { fl_cursor(FL_CURSOR_MOVE); if (file->maxh) { - if (file->mode != Z_TRIM) + if (file->mode != Z_TRIM && file->mode != Z_PGTRIM) //yoff -= (movedy / file->zoom) / fullh(0); adjust_yoff(-((movedy / file->zoom) / fullh(0))); else diff --git a/src/view.h b/src/view.h index 420b310..49d7afd 100644 --- a/src/view.h +++ b/src/view.h @@ -49,7 +49,9 @@ class pdfview: public Fl_Widget { void adjust_floor_yoff(float offset); void adjust_scrollbar_parameters(); void updatevisible(const bool fromdraw); - + u32 fullh(u32 page) const; + u32 fullw(u32 page) const; + float yoff, xoff; u32 cachedsize; u8 *cache[CACHE_MAX]; From ceda1ddeca6383e6c7f7ae8eb464962699c17df2 Mon Sep 17 00:00:00 2001 From: Guy Turcotte Date: Wed, 2 Nov 2016 14:35:51 -0400 Subject: [PATCH 09/21] Redesign in progress... --- src/view.cpp | 379 ++++++++++++++++++++++++++++++--------------------- src/view.h | 7 +- 2 files changed, 231 insertions(+), 155 deletions(-) diff --git a/src/view.cpp b/src/view.cpp index 274807a..beb5ddf 100644 --- a/src/view.cpp +++ b/src/view.cpp @@ -118,6 +118,30 @@ void pdfview::reset() { adjust_scrollbar_parameters(); } +u32 pdfview::pageh(u32 page) const { + if (file->cache[page].ready) { + if (file->mode == Z_TRIM || file->mode == Z_PGTRIM) + return file->cache[page].h; + else + return file->cache[page].h + + file->cache[page].top + + file->cache[page].bottom; + } + return 0; +} + +u32 pdfview::pagew(u32 page) const { + if (file->cache[page].ready) { + if (file->mode == Z_TRIM || file->mode == Z_PGTRIM) + return file->cache[page].h; + else + return file->cache[page].h + + file->cache[page].top + + file->cache[page].bottom; + } + return 0; +} + u32 pdfview::fullh(u32 page) const { if (!file->cache[page].ready) @@ -191,80 +215,77 @@ static bool hasmargins(const u32 page) { file->cache[page].bottom > MARGIN; } -void pdfview::updatevisible(const bool fromdraw) { - - // From the current zoom mode and view offset, update the visible page info - // Will adjust the following parameters: - // - file->first_visible - // - file->last_visible - // - file->zoom - // - pagebox->value +float pdfview::line_zoom_factor(const u32 first_page, u32 &w, u32 &h) const { - const u32 prev = file->first_visible; + // compute the required zoom factor to fit the line of pages on the screen, + // according to the zoom mode parameter if not a custom zoom. - // Adjust file->first_visible - - file->first_visible = yoff < 0 ? 0 : yoff; - if (file->first_visible > file->pages - 1) - file->first_visible = file->pages - 1; - - // Adjust file->zoom - - const u32 maxw = file->maxw ? file->maxw : file->cache[0].w; - const u32 maxh = file->maxh ? file->maxh : file->cache[0].h; - const u32 maxwmargin = (hasmargins(file->first_visible) ? maxw + MARGIN * 2 : maxw) + - ((columns - 1) * MARGINHALF); - const u32 fullw = this->fullw(0); - const u32 fullh = this->fullh(0); + const u32 fullw = this->fullw(first_page); + const u32 fullh = this->fullh(first_page); const float visible = yoff < 0 ? 0 : 1 - (yoff - floorf(yoff)); - u32 usedh = fullh; + float zf; + switch (file->mode) { case Z_TRIM: - file->zoom = (float)w() / maxwmargin; - usedh = maxh; - break; case Z_WIDTH: - file->zoom = (float)w() / fullw; + zf = (float)w() / fullw; break; case Z_PAGE: - if (((float)fullw / fullh) > ((float)w() / h())) { - file->zoom = (float)w() / fullw; - } - else { - file->zoom = (float)h() / fullh; - } - break; case Z_PGTRIM: if (((float)fullw / fullh) > ((float)w() / h())) { - file->zoom = (float)w() / fullw; + zf = (float)w() / fullw; } else { - file->zoom = (float)h() / fullh; + zf = (float)h() / fullh; } break; case Z_CUSTOM: + zf = file->zoom; break; } + w = fullw; + h = fullh; + + return zf; +} + +void pdfview::update_visible(const bool fromdraw) const { + + // From the current zoom mode and view offset, update the visible page info + // Will adjust the following parameters: + // + // - file->first_visible + // - file->last_visible + // - pagebox->value + // - scrollbar update + // + // This method as been extensively modified to take into account multicolumns + // and the fact that no page will be expected to be of the same size as the others, + // both for vertical and horizontal limits. Because of these constraints, the + // zoom factor cannot be applied to the whole screen but for each "line" of + // pages. + + const u32 prev = file->first_visible; + + // Those are very conservative. Maybe optimize a bit further. + static const u32 max_lines_per_screen[MAX_COLUMNS_COUNT] = [3, 4, 5, 6, 7]; + + // Adjust file->first_visible + + file->first_visible = yoff < 0 ? 0 : yoff; + if (file->first_visible > file->pages - 1) + file->first_visible = file->pages - 1; + // Adjust file->last_visible - const u32 zoomedmargin = MARGIN * file->zoom; - u32 i = file->first_visible; - s32 tmp = visible * usedh * file->zoom; - tmp += zoomedmargin; - - while (tmp < h()) { - tmp += usedh * file->zoom; - tmp += zoomedmargin; - i += columns; - } - // Be conservative - i += columns; - if (i > file->pages - 1) - i = file->pages - 1; - file->last_visible = i; + u32 new_last_visible = file->first_visible + max_lines_per_screen[columns - 1] * columns; + if (new_last_visible >= file->pages) + file->last_visible = file->pages - 1; + else + file->last_visible = new_last_visible; // If position has changed: // - update current page visible number in the pagebox @@ -276,9 +297,58 @@ void pdfview::updatevisible(const bool fromdraw) { if (!fromdraw) pagebox->redraw(); + + update_scrollbar(); } - update_scrollbar(); + + // // Adjust file->last_visible + + // const u32 zoomedmargin = MARGIN * file->zoom; + // u32 i = file->first_visible; + // s32 tmp = visible * usedh * file->zoom; + // tmp += zoomedmargin; + + // while (tmp < h()) { + // tmp += usedh * file->zoom; + // tmp += zoomedmargin; + // i += columns; + // } + // // Be conservative + // i += columns; + // if (i > file->pages - 1) + // i = file->pages - 1; + // file->last_visible = i; + + // // If position has changed: + // // - update current page visible number in the pagebox + // // - request a redraw (if not already called by draw...) + // if (prev != file->first_visible) { + // char buf[10]; + // snprintf(buf, 10, "%u", file->first_visible + 1); + // pagebox->value(buf); + + // if (!fromdraw) + // pagebox->redraw(); + // } + + // update_scrollbar(); +} + +// Compute the vertical screen size of a line of pages +u32 pdfview::pxrel(u32 page) const { + u32 maxH = 0; + u32 h, p; + for (p = page; (p < (page + columns)) && (p < file->pages); p++) { + if (file->mode != Z_CUSTOM && file->mode != Z_PAGE && file->mode != Z_PGTRIM) { + const float ratio = (w() / columns) / (float) fullw(p); + h = fullh(p) * ratio; //+ MARGIN * file->zoom; + } + else + h = (fullh(p) /* + MARGIN */) * file->zoom; + maxH = maxH > h ? maxH : h; + } + return maxH; } void pdfview::draw() { @@ -286,7 +356,7 @@ void pdfview::draw() { if (!file->cache) return; - updatevisible(true); + update_visible(true); const Fl_Color pagecol = FL_WHITE; int X, Y, W, H; @@ -316,110 +386,117 @@ void pdfview::draw() { //W = w(); //H = h(); - // Fill each page rect - const int zoomedmargin = file->zoom * MARGIN; - const int zoomedmarginhalf = zoomedmargin / 2; - const float visible = yoff - floorf(yoff); - int maxH = 0; - - H = pxrel(file->first_visible); - Y = y() - visible * H; - - s32 i, column; - - // Do the following for each visible page - for (i = file->first_visible, column = 0; - i <= (int)file->last_visible; - i++, column = (column + 1) % columns) { - - cur = &file->cache[i]; - if (!cur->ready) - break; - - //H = (fullh(i) + MARGIN) * file->zoom; - H = fullh(i) * file->zoom; - if (file->mode == Z_CUSTOM || file->mode == Z_PAGE || file->mode == Z_PGTRIM) { - W = fullw(i) * file->zoom; - X = x() + - (w() - (W * columns) - ((columns - 1) * zoomedmarginhalf)) / 2 + - (xoff * W) + - (column * W) + - (column * zoomedmarginhalf); - } - else { - W = (w() - ((columns - 1) * zoomedmarginhalf)) / columns; - X = x() + ( column * (W + zoomedmarginhalf)); + u32 current_screen_pos = 0; + u32 first_page_in_line = file->first_visible; + bool first_line = true; - // In case of different page sizes, H needs to be adjusted per-page - const float ratio = W / (float) fullw(i); - H = fullh(i) * ratio; // + zoomedmargin; - } + const float invisibleY = yoff - floorf(yoff); - // XYW (but H) is now the full area including grey margins. - Y += zoomedmarginhalf; - //H -= zoomedmargin; - - // XYWH is now the page's area. - if (Y >= (y() + h())) - continue; - - fl_rectf(Xs = X, Ys = Y, Ws = W, Hs = H, pagecol); - - const bool margins = hasmargins(i); - const bool trimmed = margins && (file->mode == Z_TRIM || file->mode == Z_PGTRIM); - if (trimmed) { - // If the page was trimmed, have the real one a bit smaller - X += zoomedmarginhalf; - Y += zoomedmarginhalf; - W -= zoomedmargin; - H -= zoomedmargin; - } else if (margins) { - // Restore the full size with empty borders - X += cur->left * file->zoom; - Y += cur->top * file->zoom; - W -= (cur->left + cur->right) * file->zoom; - H -= (cur->top + cur->bottom) * file->zoom; - } + s32 page; - // Render real content - content(i, X, Y, W, H); + // Do the following for each line of pages + while (current_screen_pos < h() && (first_page_in_line < file->pages)) { - // And undo. - X = Xs; - Y = Ys; - W = Ws; - H = Hs; + float zoom; + u32 line_width, line_height; + zoom = line_zoom_factor(first_page_in_line, line_width, line_height); - H += zoomedmargin; - Y -= zoomedmarginhalf; - if (column == (columns - 1)) { - Y += maxH == 0 ? H : (maxH >= H ? maxH : H); - maxH = 0; - } - else { - maxH = maxH >= H ? maxH : H; + const int zoomedmargin = zoom * MARGIN; + const int zoomedmarginhalf = zoomedmargin / 2; + int maxH = 0; + + H = line_height * zoom; // Line of pages height in screen pixels + + if (first_line) { + Y = y() - invisibleY * H; + + first_line = false; } - } - fl_pop_clip(); -} + X = x() + w() / 2 - zoom * line_width / 2 - (xoff * line_width * zoom); -// Compute the vertical screen size of a serie of pages that will be lined. -// The columns variable indicates how many pages to consider. The -// page paremeter is the first page to be seen on the line. -u32 pdfview::pxrel(u32 page) const { - u32 maxH = 0; - u32 h, p; - for (p = page; (p < (page + columns)) && (p < file->pages); p++) { - if (file->mode != Z_CUSTOM && file->mode != Z_PAGE && file->mode != Z_PGTRIM) { - const float ratio = (w() / columns) / (float) fullw(p); - h = fullh(p) * ratio; //+ MARGIN * file->zoom; + // Do the following for each page in line + + s32 column; + + for (page = file->first_page_in_line, column = 0; + (column < columns) && (page < file->pages); + page++, column++) { + + cur = &file->cache[page]; + if (!cur->ready) + break; + + //H = (fullh(i) + MARGIN) * file->zoom; + H = pageh(page) * zoom; + W = pagew(page) * zoom; + + // if (file->mode == Z_CUSTOM || file->mode == Z_PAGE || file->mode == Z_PGTRIM) { + // W = pagew(page) * zoom; + // X = x() + + // (w() - (W * columns) - ((columns - 1) * zoomedmarginhalf)) / 2 + + // (xoff * W) + + // (column * W) + + // (column * zoomedmarginhalf); + // } + // else { // file->mode == Z_TRIM || file->mode == Z_WIDTH + // W = (w() - ((columns - 1) * zoomedmarginhalf)) / columns; + // X = x() + ( column * (W + zoomedmarginhalf)); + + // // In case of different page sizes, H needs to be adjusted per-page + // const float ratio = W / (float) fullw(i); + // H = fullh(i) * ratio; // + zoomedmargin; + // } + + // // XYW (but H) is now the full area including grey margins. + // Y += zoomedmarginhalf; + // //H -= zoomedmargin; + + // XYWH is now the page's area. + if (Y >= (y() + h())) + continue; + + fl_rectf(Xs = X, Ys = Y, Ws = W, Hs = H, pagecol); + + const bool margins = hasmargins(i); + const bool trimmed = margins && (file->mode == Z_TRIM || file->mode == Z_PGTRIM); + if (trimmed) { + // If the page was trimmed, have the real one a bit smaller + X += zoomedmarginhalf; + Y += zoomedmarginhalf; + W -= zoomedmargin; + H -= zoomedmargin; + } else if (margins) { + // Restore the full size with empty borders + X += cur->left * zoom; + Y += cur->top * zoom; + W -= (cur->left + cur->right) * zoom; + H -= (cur->top + cur->bottom) * zoom; + } + + // Render real content + content(i, X, Y, W, H); + + // And undo. + X = Xs; + Y = Ys; + W = Ws; + H = Hs; + + X += zoomedmarginhalf + pagew(page); } - else - h = (fullh(p) /* + MARGIN */) * file->zoom; - maxH = maxH > h ? maxH : h; + + // Prepare for next line of pages + + Y += (line_height * zoom) + zoomedmarginhalf; + + first_page_in_line += columns; + current_screen_pos += line_height + zoomedmarginhalf; } - return maxH; + + file->last_visible = page - 1; + + fl_pop_clip(); } // Compute the maximum yoff value, taking care of the number of @@ -633,8 +710,6 @@ int pdfview::handle(int e) { lasty = my; lastx = mx; - if (file->cache) - updatevisible(false); redraw(); } break; @@ -649,8 +724,6 @@ int pdfview::handle(int e) { } resetselection(); - if (file->cache) - updatevisible(false); redraw(); break; case FL_KEYDOWN: @@ -792,7 +865,7 @@ int pdfview::handle(int e) { } if (file->cache) - updatevisible(false); + update_visible(false); return 1; break; diff --git a/src/view.h b/src/view.h index 49d7afd..613c9ce 100644 --- a/src/view.h +++ b/src/view.h @@ -39,6 +39,8 @@ class pdfview: public Fl_Widget { inline int get_columns() { return columns; }; void set_params(int columns_count, float x, float y); private: + float line_zoom_factor(u32 first_page, float &w, float &h) const; + void update_visible(const bool fromdraw) const; u8 iscached(const u32 page) const; void docache(const u32 page); float maxyoff() const; @@ -48,10 +50,11 @@ class pdfview: public Fl_Widget { void adjust_yoff(float offset); void adjust_floor_yoff(float offset); void adjust_scrollbar_parameters(); - void updatevisible(const bool fromdraw); + u32 pageh(u32 page) const; + u32 pagew(u32 page) const; u32 fullh(u32 page) const; u32 fullw(u32 page) const; - + float yoff, xoff; u32 cachedsize; u8 *cache[CACHE_MAX]; From 340d6e7483c3d68960971bfac7bb131e2e8ca660 Mon Sep 17 00:00:00 2001 From: Guy Date: Wed, 2 Nov 2016 17:23:37 -0400 Subject: [PATCH 10/21] Some changes... not ready yet --- src/main.h | 2 + src/view.cpp | 275 ++++++++++++++++++++++++++++----------------------- src/view.h | 6 +- 3 files changed, 155 insertions(+), 128 deletions(-) diff --git a/src/main.h b/src/main.h index 647f54b..7ca63bf 100644 --- a/src/main.h +++ b/src/main.h @@ -65,6 +65,8 @@ void debug(Fl_Box * ctrl, const float value, const char * hint); bool loadfile(const char *, recent_file_struct *recent_files); +const int MAX_COLUMNS_COUNT = 5; + struct cachedpage { u8 *data; u32 size; diff --git a/src/view.cpp b/src/view.cpp index beb5ddf..1c9412a 100644 --- a/src/view.cpp +++ b/src/view.cpp @@ -55,7 +55,7 @@ void pdfview::adjust_scrollbar_parameters() { } // From the document position, update scrollbar position. -void pdfview::update_scrollbar() { +void pdfview::update_scrollbar() const { float y = floorf(yoff); float frac = yoff - y; float k = file->pages - columns + 1; @@ -133,22 +133,24 @@ u32 pdfview::pageh(u32 page) const { u32 pdfview::pagew(u32 page) const { if (file->cache[page].ready) { if (file->mode == Z_TRIM || file->mode == Z_PGTRIM) - return file->cache[page].h; + return file->cache[page].w; else - return file->cache[page].h + - file->cache[page].top + - file->cache[page].bottom; + return file->cache[page].w + + file->cache[page].left + + file->cache[page].right; } return 0; } +// Compute the height of a line of pages, selecting the page that is the +// highest. u32 pdfview::fullh(u32 page) const { if (!file->cache[page].ready) page = 0; u32 fh = 0; - s32 i; + u32 i; if (file->mode == Z_TRIM || file->mode == Z_PGTRIM) { for (i = page; (i < (page + columns)) && (i < file->pages); i++) { @@ -159,9 +161,9 @@ u32 pdfview::fullh(u32 page) const { else { for (i = page; (i < (page + columns)) && (i < file->pages); i++) { if (file->cache[i].ready) { - u32 h = file->cache[page].h + - file->cache[page].top + - file->cache[page].bottom; + u32 h = file->cache[i].h + + file->cache[i].top + + file->cache[i].bottom; if (h > fh) fh = h; } @@ -173,7 +175,7 @@ u32 pdfview::fullh(u32 page) const { u32 pdfview::fullw(u32 page) const { u32 fw = 0; - s32 i; + u32 i; if (file->mode == Z_TRIM || file->mode == Z_PGTRIM) { for (i = page; (i < (page + columns)) && (i < file->pages); i++) { @@ -184,19 +186,19 @@ u32 pdfview::fullw(u32 page) const { } } else { - for (i = page; (i < (page + columns)) && (i < file->pages); i++) { - if (file->cache[i].ready) { - fw += file->cache[page].w + - file->cache[page].left + - file->cache[page].right; + for (i = page; i < (page + columns); i++) { + if (file->cache[i].ready && (i < file->pages)) + fw += file->cache[i].w + + file->cache[i].left + + file->cache[i].right; else fw += file->cache[0].w + file->cache[0].left + file->cache[0].right; - } } } + // Add the margins between columns return fw + (columns - 1) * MARGINHALF; } @@ -215,41 +217,44 @@ static bool hasmargins(const u32 page) { file->cache[page].bottom > MARGIN; } -float pdfview::line_zoom_factor(const u32 first_page, u32 &w, u32 &h) const { +float pdfview::line_zoom_factor(const u32 first_page, u32 &width, u32 &height) const { // compute the required zoom factor to fit the line of pages on the screen, // according to the zoom mode parameter if not a custom zoom. - const u32 fullw = this->fullw(first_page); - const u32 fullh = this->fullh(first_page); - - const float visible = yoff < 0 ? 0 : 1 - (yoff - floorf(yoff)); + const u32 line_width = fullw(first_page); + const u32 line_height = fullh(first_page); - float zf; + float zoom_factor; switch (file->mode) { case Z_TRIM: case Z_WIDTH: - zf = (float)w() / fullw; + zoom_factor = (float)this->w() / line_width; break; case Z_PAGE: case Z_PGTRIM: - if (((float)fullw / fullh) > ((float)w() / h())) { - zf = (float)w() / fullw; + if (((float)line_width / line_height) > ((float)this->w() / this->h())) { + zoom_factor = (float)this->w() / line_width; } else { - zf = (float)h() / fullh; + zoom_factor = (float)this->h() / line_height; } break; - case Z_CUSTOM: - zf = file->zoom; + default: + zoom_factor = file->zoom; break; } - w = fullw; - h = fullh; + width = line_width; + height = line_height; - return zf; + debug(debug1, zoom_factor, "Zoom Factor"); + debug(debug2, w(), "Display width"); + debug(debug3, h(), "Display height"); + debug(debug4, line_width, "Line Width"); + debug(debug5, line_height, "Line Height"); + return zoom_factor; } void pdfview::update_visible(const bool fromdraw) const { @@ -271,7 +276,7 @@ void pdfview::update_visible(const bool fromdraw) const { const u32 prev = file->first_visible; // Those are very conservative. Maybe optimize a bit further. - static const u32 max_lines_per_screen[MAX_COLUMNS_COUNT] = [3, 4, 5, 6, 7]; + static const u32 max_lines_per_screen[MAX_COLUMNS_COUNT] = { 3, 4, 5, 6, 7 }; // Adjust file->first_visible @@ -386,13 +391,13 @@ void pdfview::draw() { //W = w(); //H = h(); - u32 current_screen_pos = 0; + s32 current_screen_pos = 0; u32 first_page_in_line = file->first_visible; bool first_line = true; const float invisibleY = yoff - floorf(yoff); - s32 page; + u32 page = file->first_visible; // Do the following for each line of pages while (current_screen_pos < h() && (first_page_in_line < file->pages)) { @@ -403,7 +408,6 @@ void pdfview::draw() { const int zoomedmargin = zoom * MARGIN; const int zoomedmarginhalf = zoomedmargin / 2; - int maxH = 0; H = line_height * zoom; // Line of pages height in screen pixels @@ -413,13 +417,13 @@ void pdfview::draw() { first_line = false; } - X = x() + w() / 2 - zoom * line_width / 2 - (xoff * line_width * zoom); + X = x() + w() / 2 - zoom * line_width / 2;// - (zoom * xoff * line_width); // Do the following for each page in line s32 column; - for (page = file->first_page_in_line, column = 0; + for (page = first_page_in_line, column = 0; (column < columns) && (page < file->pages); page++, column++) { @@ -458,7 +462,7 @@ void pdfview::draw() { fl_rectf(Xs = X, Ys = Y, Ws = W, Hs = H, pagecol); - const bool margins = hasmargins(i); + const bool margins = hasmargins(page); const bool trimmed = margins && (file->mode == Z_TRIM || file->mode == Z_PGTRIM); if (trimmed) { // If the page was trimmed, have the real one a bit smaller @@ -475,7 +479,7 @@ void pdfview::draw() { } // Render real content - content(i, X, Y, W, H); + content(page, X, Y, W, H); // And undo. X = Xs; @@ -483,7 +487,7 @@ void pdfview::draw() { W = Ws; H = Hs; - X += zoomedmarginhalf + pagew(page); + X += zoomedmarginhalf + (pagew(page) * zoom); } // Prepare for next line of pages @@ -491,7 +495,7 @@ void pdfview::draw() { Y += (line_height * zoom) + zoomedmarginhalf; first_page_in_line += columns; - current_screen_pos += line_height + zoomedmarginhalf; + current_screen_pos += (line_height * zoom) + zoomedmarginhalf; } file->last_visible = page - 1; @@ -500,14 +504,31 @@ void pdfview::draw() { } // Compute the maximum yoff value, taking care of the number of -// columns displayed and the screen size +// columns displayed and the screen size. Start at the end of the +// document, getting up to the point where the line of pages will be +// out of reach on screen. float pdfview::maxyoff() const { - float f; + float zoom, f; + u32 line_width, line_height; - u32 last = file->pages - 1; + s32 last = file->pages - 1; last -= (last % columns); + if (!file->cache[last].ready) + f = last + 0.5f; + else { + s32 H = h(); + + while ((H >= 0) && (last > 0)) { + zoom = line_zoom_factor(last, line_width, line_height); + H -= (line_height * zoom) + if (H >= 0) + last -= columns; + } + + } + const s32 sh = pxrel(last); float offset = file->zoom * MARGIN / (float) sh; @@ -527,7 +548,7 @@ float pdfview::maxyoff() const { } if (f < 0.0f) - f = offset / 2; + f = 0.0f; return f; } @@ -569,7 +590,8 @@ int pdfview::handle(int e) { if (selx < selx2) { X = selx; W = selx2 - X; - } else { + } + else { X = selx2; W = selx - X; } @@ -577,7 +599,8 @@ int pdfview::handle(int e) { if (sely < sely2) { Y = sely; H = sely2 - Y; - } else { + } + else { Y = sely2; H = sely - Y; } @@ -609,7 +632,8 @@ int pdfview::handle(int e) { Y /= ratiox; W /= ratiox; H /= ratiox; - break; + break; + case Z_WIDTH: // X and Y start in widget space, 0 to w/h. Y += floored * (fullh(page) * ratio + @@ -620,7 +644,8 @@ int pdfview::handle(int e) { Y /= ratio; W /= ratio; H /= ratio; - break; + break; + case Z_PAGE: case Z_CUSTOM: // X and Y start in widget space, 0 to w/h. @@ -635,8 +660,8 @@ int pdfview::handle(int e) { Y /= file->zoom; W /= file->zoom; H /= file->zoom; - break; - } + break; + } // switch (file->mode) TextOutputDev * const dev = new TextOutputDev(NULL, true, 0, false, false); @@ -651,7 +676,8 @@ int pdfview::handle(int e) { delete str; delete dev; } - break; + break; + case FL_PUSH: take_focus(); lasty = Fl::event_y(); @@ -668,8 +694,9 @@ int pdfview::handle(int e) { case FL_FOCUS: case FL_ENTER: return 1; - break; - case FL_DRAG: { + break; + + case FL_DRAG: const int my = Fl::event_y(); const int mx = Fl::event_x(); const int movedy = my - lasty; @@ -691,7 +718,8 @@ int pdfview::handle(int e) { else //yoff -= (movedy / file->zoom) / file->maxh; adjust_yoff(-((movedy / file->zoom) / file->maxh)); - } else { + } + else { //yoff -= (movedy / (float) h()) / file->zoom; adjust_yoff(-((movedy / (float) h()) / file->zoom)); } @@ -711,21 +739,23 @@ int pdfview::handle(int e) { lastx = mx; redraw(); - } - break; + break; + case FL_MOUSEWHEEL: if (Fl::event_ctrl()) { if (Fl::event_dy() > 0) cb_Zoomout(NULL, NULL); else cb_Zoomin(NULL, NULL); - } else { + } + else { adjust_yoff(move * Fl::event_dy()); } resetselection(); redraw(); - break; + break; + case FL_KEYDOWN: case FL_SHORTCUT: resetselection(); @@ -733,7 +763,8 @@ int pdfview::handle(int e) { case 'k': if (Fl::event_ctrl()) { yoff = 0; - } else { + } + else { const s32 page = yoff; s32 sh; s32 shp = sh = pxrel(page); @@ -741,13 +772,12 @@ int pdfview::handle(int e) { shp = pxrel(page - columns); if ((h() + (file->zoom * 2 * MARGIN)) >= sh) { /* scroll up like Page_Up */ - float offset = file->zoom * MARGIN / (float) sh; - if (floorf(yoff) + offset >= yoff) { - adjust_floor_yoff(- (1.0f - file->zoom * MARGIN / 2 / (float) shp)); - } else { - adjust_floor_yoff(offset / 2); - } - } else { + if (floorf(yoff) >= yoff) + adjust_floor_yoff(-1.0f); + else + adjust_floor_yoff(0.0f); + } + else { /* scroll up less than one page height */ float d = (h() - MARGIN) / (float) sh; if (((u32) yoff) != ((u32) (yoff - d))) { @@ -761,11 +791,13 @@ int pdfview::handle(int e) { } } redraw(); - break; + break; + case 'j': if (Fl::event_ctrl()) { yoff = maxyoff(); - } else { + } + else { const s32 page = yoff; s32 sh; s32 shn = sh = pxrel(page); @@ -773,8 +805,9 @@ int pdfview::handle(int e) { shn = pxrel(page + columns); if (h() + 2 * MARGIN * file->zoom >= sh) { /* scroll down like Page_Down */ - adjust_floor_yoff(1.0f + file->zoom * MARGIN / 2 / (float) shn); - } else { + adjust_floor_yoff(1.0f); + } + else { /* scroll down less than one page height */ float d = (h() - MARGIN) / (float) sh; if (((u32) yoff) != ((u32) (yoff + d))) { @@ -788,59 +821,44 @@ int pdfview::handle(int e) { } } redraw(); - break; + break; + case FL_Up: adjust_yoff(-move); redraw(); - break; + break; + case FL_Down: adjust_yoff(move); redraw(); - break; + break; + case FL_Page_Up: - { - const s32 page = yoff; - s32 sh; - s32 shp = sh = pxrel(page); - if (page >= columns) - shp = pxrel(page - columns); - float marginoffset = file->zoom * MARGIN / (float) sh; - - if ((floorf(yoff) + marginoffset) >= yoff) - adjust_floor_yoff(- (1.0f - file->zoom * MARGIN / 2 / (float) shp)); + if (floorf(yoff) >= yoff) + adjust_floor_yoff(-1.0f); else - adjust_floor_yoff(marginoffset / 2); + adjust_floor_yoff(0.0f); redraw(); - } - break; + break; + case FL_Page_Down: - { - s32 page = yoff; - s32 shn = pxrel((page + columns <= (s32)(file->pages - 1)) ? page + columns : page); - float marginoffset = file->zoom * MARGIN / (float) shn; - - adjust_floor_yoff(1.0f + marginoffset / 2); + adjust_floor_yoff(1.0f); redraw(); - } - break; + break; + case FL_Home: - { - const u32 page = yoff; - const s32 sh = pxrel(page); - float marginoffset = file->zoom * MARGIN / (float) sh; - - if (Fl::event_ctrl()) { - yoff = 0 + marginoffset / 2; - } else { - yoff = floorf(yoff) + marginoffset / 2; - } + if (Fl::event_ctrl()) + yoff = 0; + else + yoff = floorf(yoff); redraw(); - } - break; + break; + case FL_End: if (Fl::event_ctrl()) { yoff = maxyoff(); - } else { + } + else { u32 page = yoff; s32 sh = pxrel(page); float marginoffset = file->zoom * MARGIN / (float) sh; @@ -851,24 +869,29 @@ int pdfview::handle(int e) { if (tmp > yoff) yoff = tmp; adjust_yoff(0); - } else { + } + else { yoff = ceilf(yoff) - 0.4f; } } redraw(); - break; + break; + case FL_F + 8: cb_hide(NULL, NULL); // Hide toolbar - break; + break; + default: return 0; - } + + } // switch (Fl::event_key()) if (file->cache) update_visible(false); return 1; - break; + break; + case FL_MOVE: // Set the cursor appropriately if (!file->maxw) @@ -892,9 +915,10 @@ void pdfview::adjust_yoff(float offset) { yoff = yoff + (diff * columns) - diff; } - if (yoff <= 0.0f) { - const s32 sh = pxrel(0); - yoff = file->zoom * MARGIN / (float) sh / 2; + if (yoff < 0.0f) { + yoff = 0.0f; + //const s32 sh = pxrel(0); + //yoff = file->zoom * MARGIN / (float) sh / 2; } else { float y = maxyoff(); @@ -913,9 +937,10 @@ void pdfview::adjust_floor_yoff(float offset) { yoff = yoff + (diff * columns) - diff; } - if (yoff <= 0.0f) { - const s32 sh = pxrel(0); - yoff = file->zoom * MARGIN / (float) sh / 2; + if (yoff < 0.0f) { + yoff = 0.0f; + //const s32 sh = pxrel(0); + //yoff = file->zoom * MARGIN / (float) sh / 2; } else { float max = maxyoff(); @@ -990,8 +1015,7 @@ void pdfview::docache(const u32 page) { XDestroyImage(xi); } -void pdfview::content(const u32 page, const s32 X, const s32 Y, - const u32 W, const u32 H) { +void pdfview::content(const u32 page, const s32 X, const s32 Y, const u32 W, const u32 H) { // Do a gpu-accelerated bilinear blit u8 c = iscached(page); @@ -1034,7 +1058,8 @@ void pdfview::content(const u32 page, const s32 X, const s32 Y, if (selx < selx2) { x = selx; w = selx2 - x; - } else { + } + else { x = selx2; w = selx - x; } @@ -1042,13 +1067,13 @@ void pdfview::content(const u32 page, const s32 X, const s32 Y, if (sely < sely2) { y = sely; h = sely2 - y; - } else { + } + else { y = sely2; h = sely - y; } - XRenderFillRectangle(fl_display, PictOpOver, dst, &col, - x, y, w, h); + XRenderFillRectangle(fl_display, PictOpOver, dst, &col, x, y, w, h); } XRenderFreePicture(fl_display, src); diff --git a/src/view.h b/src/view.h index 613c9ce..78ac840 100644 --- a/src/view.h +++ b/src/view.h @@ -19,7 +19,7 @@ along with this program. If not, see . #include "main.h" -#define CACHE_MAX 3 +#define CACHE_MAX 15 class pdfview: public Fl_Widget { public: @@ -31,7 +31,7 @@ class pdfview: public Fl_Widget { void go(const u32 page); void reset(); void resetselection(); - void update_scrollbar(); + void update_scrollbar() const; void set_columns(int count); void update_position(const int vscroll_pos); inline float get_xoff() { return xoff; }; @@ -39,7 +39,7 @@ class pdfview: public Fl_Widget { inline int get_columns() { return columns; }; void set_params(int columns_count, float x, float y); private: - float line_zoom_factor(u32 first_page, float &w, float &h) const; + float line_zoom_factor(u32 first_page, u32 &width,u32 &height) const; void update_visible(const bool fromdraw) const; u8 iscached(const u32 page) const; void docache(const u32 page); From 6af48f517ea85119111da5737d8f7f0620bfacc6 Mon Sep 17 00:00:00 2001 From: Guy Turcotte Date: Wed, 2 Nov 2016 23:27:27 -0400 Subject: [PATCH 11/21] dimensions adjustments --- src/view.cpp | 424 +++++++++++++++++++++------------------------------ src/view.h | 1 + 2 files changed, 176 insertions(+), 249 deletions(-) diff --git a/src/view.cpp b/src/view.cpp index 1c9412a..39a5914 100644 --- a/src/view.cpp +++ b/src/view.cpp @@ -178,8 +178,8 @@ u32 pdfview::fullw(u32 page) const { u32 i; if (file->mode == Z_TRIM || file->mode == Z_PGTRIM) { - for (i = page; (i < (page + columns)) && (i < file->pages); i++) { - if (file->cache[i].ready) + for (i = page; i < (page + columns); i++) { + if (file->cache[i].ready && (i < file->pages)) fw += file->cache[i].w; else fw += file->cache[0].w; @@ -254,6 +254,8 @@ float pdfview::line_zoom_factor(const u32 first_page, u32 &width, u32 &height) c debug(debug3, h(), "Display height"); debug(debug4, line_width, "Line Width"); debug(debug5, line_height, "Line Height"); + + if (file->zoom == 0) file->zoom = zoom_factor; return zoom_factor; } @@ -276,7 +278,7 @@ void pdfview::update_visible(const bool fromdraw) const { const u32 prev = file->first_visible; // Those are very conservative. Maybe optimize a bit further. - static const u32 max_lines_per_screen[MAX_COLUMNS_COUNT] = { 3, 4, 5, 6, 7 }; + static const u32 max_lines_per_screen[MAX_COLUMNS_COUNT] = { 2, 3, 4, 5, 6 }; // Adjust file->first_visible @@ -305,39 +307,6 @@ void pdfview::update_visible(const bool fromdraw) const { update_scrollbar(); } - - - // // Adjust file->last_visible - - // const u32 zoomedmargin = MARGIN * file->zoom; - // u32 i = file->first_visible; - // s32 tmp = visible * usedh * file->zoom; - // tmp += zoomedmargin; - - // while (tmp < h()) { - // tmp += usedh * file->zoom; - // tmp += zoomedmargin; - // i += columns; - // } - // // Be conservative - // i += columns; - // if (i > file->pages - 1) - // i = file->pages - 1; - // file->last_visible = i; - - // // If position has changed: - // // - update current page visible number in the pagebox - // // - request a redraw (if not already called by draw...) - // if (prev != file->first_visible) { - // char buf[10]; - // snprintf(buf, 10, "%u", file->first_visible + 1); - // pagebox->value(buf); - - // if (!fromdraw) - // pagebox->redraw(); - // } - - // update_scrollbar(); } // Compute the vertical screen size of a line of pages @@ -386,11 +355,6 @@ void pdfview::draw() { // (doesn´t seems to be needed... they are adjusted to something else in the code // that follow...) - //X = x(); - //Y = y(); - //W = w(); - //H = h(); - s32 current_screen_pos = 0; u32 first_page_in_line = file->first_visible; bool first_line = true; @@ -406,8 +370,8 @@ void pdfview::draw() { u32 line_width, line_height; zoom = line_zoom_factor(first_page_in_line, line_width, line_height); - const int zoomedmargin = zoom * MARGIN; - const int zoomedmarginhalf = zoomedmargin / 2; + const int zoomedmargin = zoom * MARGIN; + const int zoomedmarginhalf = zoomedmargin / 2; H = line_height * zoom; // Line of pages height in screen pixels @@ -417,7 +381,7 @@ void pdfview::draw() { first_line = false; } - X = x() + w() / 2 - zoom * line_width / 2;// - (zoom * xoff * line_width); + X = x() + w() / 2 - zoom * line_width / 2 + (zoom * xoff * line_width); // Do the following for each page in line @@ -431,31 +395,9 @@ void pdfview::draw() { if (!cur->ready) break; - //H = (fullh(i) + MARGIN) * file->zoom; H = pageh(page) * zoom; W = pagew(page) * zoom; - // if (file->mode == Z_CUSTOM || file->mode == Z_PAGE || file->mode == Z_PGTRIM) { - // W = pagew(page) * zoom; - // X = x() + - // (w() - (W * columns) - ((columns - 1) * zoomedmarginhalf)) / 2 + - // (xoff * W) + - // (column * W) + - // (column * zoomedmarginhalf); - // } - // else { // file->mode == Z_TRIM || file->mode == Z_WIDTH - // W = (w() - ((columns - 1) * zoomedmarginhalf)) / columns; - // X = x() + ( column * (W + zoomedmarginhalf)); - - // // In case of different page sizes, H needs to be adjusted per-page - // const float ratio = W / (float) fullw(i); - // H = fullh(i) * ratio; // + zoomedmargin; - // } - - // // XYW (but H) is now the full area including grey margins. - // Y += zoomedmarginhalf; - // //H -= zoomedmargin; - // XYWH is now the page's area. if (Y >= (y() + h())) continue; @@ -495,7 +437,7 @@ void pdfview::draw() { Y += (line_height * zoom) + zoomedmarginhalf; first_page_in_line += columns; - current_screen_pos += (line_height * zoom) + zoomedmarginhalf; + current_screen_pos = Y - y(); } file->last_visible = page - 1; @@ -510,7 +452,7 @@ void pdfview::draw() { float pdfview::maxyoff() const { float zoom, f; - u32 line_width, line_height; + u32 line_width, line_height, h; s32 last = file->pages - 1; last -= (last % columns); @@ -518,38 +460,134 @@ float pdfview::maxyoff() const { if (!file->cache[last].ready) f = last + 0.5f; else { - s32 H = h(); + s32 H = this->h(); - while ((H >= 0) && (last > 0)) { + while (true) { zoom = line_zoom_factor(last, line_width, line_height); - H -= (line_height * zoom) - if (H >= 0) - last -= columns; + H -= (h = zoom * (line_height + MARGINHALF)); + + if (H <= 0) { + H += (MARGINHALF * zoom); + f = last + (float)(-H) / (zoom * line_height); + break; + } + + last -= columns; + if (last < 0) { + f = 0.0f; + break; + } } - } + return f; +} - const s32 sh = pxrel(last); - float offset = file->zoom * MARGIN / (float) sh; +static int lasty, lastx; - if (!file->cache[last].ready) - f = last + 0.5f; - else { - const s32 hidden = sh - h(); +void pdfview::end_of_selection() { - f = last; + const u32 zoomedmargin = MARGIN * file->zoom; + const u32 zoomedmarginhalf = zoomedmargin / 2; - if (hidden > 0) { - f += hidden / (float) sh + offset / 2; - } else { - f -= columns - (sh / (float) h()) - offset / 2; - } - //f -= MARGIN / (float) sh; + // Which page is selx,sely on? + u32 page = yoff; + const float floored = yoff - floorf(yoff); + const float visible = 1 - floored; + u32 zoomedh = fullh(page) * visible * file->zoom; + const u32 ratiominus = hasmargins(page) ? zoomedmargin : 0; + const float ratio = w() / (float) fullw(page); + const float ratiox = (w() - ratiominus) / (float) fullw(page); + if (file->mode != Z_CUSTOM && file->mode != Z_PAGE && file->mode != Z_PGTRIM) { + zoomedh = fullh(page) * visible * ratio; } - if (f < 0.0f) - f = 0.0f; - return f; + if (y() + zoomedh < sely) + page++; + + // We assume nobody selects text with a tiny zoom. + u32 X, Y, W, H; + if (selx < selx2) { + X = selx; + W = selx2 - X; + } + else { + X = selx2; + W = selx - X; + } + + if (sely < sely2) { + Y = sely; + H = sely2 - Y; + } + else { + Y = sely2; + H = sely - Y; + } + + // Convert to widget coords + X -= x(); + Y -= y(); + + // Offset + switch (file->mode) { + case Z_TRIM: + case Z_PGTRIM: + // X and Y start in widget space, 0 to w/h. + Y += floored * (fullh(page) * ratiox + zoomedmargin + ratiominus); + Y -= zoomedmarginhalf; // Grey margin + + if (hasmargins(page)) { + X -= zoomedmarginhalf; + Y -= zoomedmarginhalf; + } + + // Now page's area. + + X += file->cache[page].left * ratiox; + Y += file->cache[page].top * ratiox; + + X /= ratiox; + Y /= ratiox; + W /= ratiox; + H /= ratiox; + break; + + case Z_WIDTH: + // X and Y start in widget space, 0 to w/h. + Y += floored * (fullh(page) * ratio + zoomedmargin); + Y -= zoomedmarginhalf; // Grey margin + + X /= ratio; + Y /= ratio; + W /= ratio; + H /= ratio; + break; + + case Z_PAGE: + case Z_CUSTOM: + // X and Y start in widget space, 0 to w/h. + Y += floored * (fullh(page) * file->zoom + zoomedmargin); + Y -= zoomedmarginhalf; // Grey margin + + X -= (w() - (fullw(page) * file->zoom)) / 2 + xoff * (fullw(page) * file->zoom); + + X /= file->zoom; + Y /= file->zoom; + W /= file->zoom; + H /= file->zoom; + break; + } // switch (file->mode) + + TextOutputDev * const dev = new TextOutputDev(NULL, true, 0, false, false); + file->pdf->displayPage(dev, page + 1, 144, 144, 0, true, false, false); + GooString *str = dev->getText(X, Y, X + W, Y + H); + const char * const cstr = str->getCString(); + + // Put it to clipboard + Fl::copy(cstr, strlen(cstr)); + + delete str; + delete dev; } int pdfview::handle(int e) { @@ -557,125 +595,21 @@ int pdfview::handle(int e) { if (!file->cache) return Fl_Widget::handle(e); + float zoom; + u32 line_width, line_height; + zoom = line_zoom_factor(yoff, line_width, line_height); + const float move = 0.05f; - static int lasty, lastx; switch (e) { case FL_RELEASE: // Was this a dragging text selection? if (selecting->value() && Fl::event_button() == FL_LEFT_MOUSE && selx && sely && selx2 && sely2 && selx != selx2 && - sely != sely2) { - - const u32 zoomedmargin = MARGIN * file->zoom; - const u32 zoomedmarginhalf = zoomedmargin / 2; - - // Which page is selx,sely on? - u32 page = yoff; - const float floored = yoff - floorf(yoff); - const float visible = 1 - floored; - u32 zoomedh = fullh(page) * visible * file->zoom; - const u32 ratiominus = hasmargins(page) ? zoomedmargin : 0; - const float ratio = w() / (float) fullw(page); - const float ratiox = (w() - ratiominus) / (float) fullw(page); - if (file->mode != Z_CUSTOM && file->mode != Z_PAGE && file->mode != Z_PGTRIM) { - zoomedh = fullh(page) * visible * ratio; - } + sely != sely2) - if (y() + zoomedh < sely) - page++; - - // We assume nobody selects text with a tiny zoom. - u32 X, Y, W, H; - if (selx < selx2) { - X = selx; - W = selx2 - X; - } - else { - X = selx2; - W = selx - X; - } - - if (sely < sely2) { - Y = sely; - H = sely2 - Y; - } - else { - Y = sely2; - H = sely - Y; - } - - // Convert to widget coords - X -= x(); - Y -= y(); - - // Offset - switch (file->mode) { - case Z_TRIM: - case Z_PGTRIM: - // X and Y start in widget space, 0 to w/h. - Y += floored * (fullh(page) * ratiox + - zoomedmargin + ratiominus); - Y -= zoomedmarginhalf; // Grey margin - - if (hasmargins(page)) { - X -= zoomedmarginhalf; - Y -= zoomedmarginhalf; - } + end_of_selection(); - // Now page's area. - - X += file->cache[page].left * ratiox; - Y += file->cache[page].top * ratiox; - - X /= ratiox; - Y /= ratiox; - W /= ratiox; - H /= ratiox; - break; - - case Z_WIDTH: - // X and Y start in widget space, 0 to w/h. - Y += floored * (fullh(page) * ratio + - zoomedmargin); - Y -= zoomedmarginhalf; // Grey margin - - X /= ratio; - Y /= ratio; - W /= ratio; - H /= ratio; - break; - - case Z_PAGE: - case Z_CUSTOM: - // X and Y start in widget space, 0 to w/h. - Y += floored * (fullh(page) * file->zoom + - zoomedmargin); - Y -= zoomedmarginhalf; // Grey margin - - X -= (w() - (fullw(page) * file->zoom)) / 2 + - xoff * (fullw(page) * file->zoom); - - X /= file->zoom; - Y /= file->zoom; - W /= file->zoom; - H /= file->zoom; - break; - } // switch (file->mode) - - TextOutputDev * const dev = new TextOutputDev(NULL, true, - 0, false, false); - file->pdf->displayPage(dev, page + 1, 144, 144, 0, - true, false, false); - GooString *str = dev->getText(X, Y, X + W, Y + H); - const char * const cstr = str->getCString(); - - // Put it to clipboard - Fl::copy(cstr, strlen(cstr)); - - delete str; - delete dev; - } break; case FL_PUSH: @@ -697,47 +631,43 @@ int pdfview::handle(int e) { break; case FL_DRAG: - const int my = Fl::event_y(); - const int mx = Fl::event_x(); - const int movedy = my - lasty; - const int movedx = mx - lastx; - - if (selecting->value() && Fl::event_button() == FL_LEFT_MOUSE) { - selx2 = mx; - sely2 = my; - redraw(); - return 1; - } + { + const int my = Fl::event_y(); + const int mx = Fl::event_x(); + const int movedy = my - lasty; + const int movedx = mx - lastx; + + if (selecting->value() && Fl::event_button() == FL_LEFT_MOUSE) { + selx2 = mx; + sely2 = my; + redraw(); + return 1; + } - fl_cursor(FL_CURSOR_MOVE); + fl_cursor(FL_CURSOR_MOVE); - if (file->maxh) { - if (file->mode != Z_TRIM && file->mode != Z_PGTRIM) - //yoff -= (movedy / file->zoom) / fullh(0); - adjust_yoff(-((movedy / file->zoom) / fullh(0))); + if (file->maxh) + adjust_yoff(-((movedy / zoom) / line_height)); else - //yoff -= (movedy / file->zoom) / file->maxh; - adjust_yoff(-((movedy / file->zoom) / file->maxh)); - } - else { - //yoff -= (movedy / (float) h()) / file->zoom; - adjust_yoff(-((movedy / (float) h()) / file->zoom)); - } - - if (file->mode != Z_CUSTOM) - xoff = 0; - else { - xoff += ((float) movedx / file->zoom) / fullw(0); - float maxchg = (((((float)w() / file->zoom) + (fullw(0) * columns)) / 2) / fullw(0)) - 0.1f; - if (xoff < -maxchg) - xoff = -maxchg; - if (xoff > maxchg) - xoff = maxchg; - } + adjust_yoff(-((movedy / (float) h()) / zoom)); + + if (file->mode != Z_CUSTOM) + xoff = 0; + else { + xoff += ((float) movedx / zoom) / line_width; + float maxchg = (((((float)w() / zoom) + (line_width * columns)) / 2) / line_width) - 0.1f; + if (xoff < -maxchg) + xoff = -maxchg; + if (xoff > maxchg) + xoff = maxchg; + } - lasty = my; - lastx = mx; + debug(debug6, xoff, " xoff "); + debug(debug7, yoff, " yoff "); + lasty = my; + lastx = mx; + } redraw(); break; @@ -748,9 +678,8 @@ int pdfview::handle(int e) { else cb_Zoomin(NULL, NULL); } - else { + else adjust_yoff(move * Fl::event_dy()); - } resetselection(); redraw(); @@ -834,7 +763,7 @@ int pdfview::handle(int e) { break; case FL_Page_Up: - if (floorf(yoff) >= yoff) + if (floorf(yoff) == yoff) adjust_floor_yoff(-1.0f); else adjust_floor_yoff(0.0f); @@ -857,11 +786,12 @@ int pdfview::handle(int e) { case FL_End: if (Fl::event_ctrl()) { yoff = maxyoff(); + fl_message(" yoff = %f ", yoff); } else { u32 page = yoff; - s32 sh = pxrel(page); - float marginoffset = file->zoom * MARGIN / (float) sh; + s32 sh = line_height * zoom; + float marginoffset = zoom * MARGIN / (float) sh; if (file->cache[page].ready) { const s32 hidden = sh - h(); @@ -915,11 +845,8 @@ void pdfview::adjust_yoff(float offset) { yoff = yoff + (diff * columns) - diff; } - if (yoff < 0.0f) { + if (yoff < 0.0f) yoff = 0.0f; - //const s32 sh = pxrel(0); - //yoff = file->zoom * MARGIN / (float) sh / 2; - } else { float y = maxyoff(); @@ -936,12 +863,11 @@ void pdfview::adjust_floor_yoff(float offset) { float diff = floorf(yoff) - y; yoff = yoff + (diff * columns) - diff; } + else + yoff = floorf(yoff); - if (yoff < 0.0f) { + if (yoff < 0.0f) yoff = 0.0f; - //const s32 sh = pxrel(0); - //yoff = file->zoom * MARGIN / (float) sh / 2; - } else { float max = maxyoff(); diff --git a/src/view.h b/src/view.h index 78ac840..c6a8202 100644 --- a/src/view.h +++ b/src/view.h @@ -50,6 +50,7 @@ class pdfview: public Fl_Widget { void adjust_yoff(float offset); void adjust_floor_yoff(float offset); void adjust_scrollbar_parameters(); + void end_of_selection(); u32 pageh(u32 page) const; u32 pagew(u32 page) const; u32 fullh(u32 page) const; From db6f0e747ba72bfe5d26f03277ffcd4cd7795fd6 Mon Sep 17 00:00:00 2001 From: Guy Turcotte Date: Thu, 3 Nov 2016 11:06:13 -0400 Subject: [PATCH 12/21] Some other chages and debugging --- README.asciidoc | 32 +++++++------- TODO.txt | 20 ++++++--- src/loadfile.cpp | 9 +++- src/main.cpp | 106 ++++++++++++++++++++++++++++++----------------- src/main.h | 2 + src/view.cpp | 99 +++++++++++++++++++++---------------------- src/view.h | 6 ++- 7 files changed, 159 insertions(+), 115 deletions(-) diff --git a/README.asciidoc b/README.asciidoc index 028ce77..b00126b 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -22,7 +22,7 @@ those two itches scratched? Requirements ------------ -Poppler, LZO, libconfig++, and FLTK 1.3. +Poppler, LZO, libconfig++-dev, and FLTK 1.3. Comparison ---------- @@ -40,15 +40,14 @@ FlaxPDF 57% (5% *) 36.5 MB 45 KB FlaxPDF, as the only one of the three, is able to take advantage of the GPU, dropping its CPU use when scrolling to 5% (tested on radeon). -New capabilities added by Guy Turcotte (November 2016) +New capabilities / modifications added (November 2016) ------------------------------------------------------ -The following modifications have been made to allow FlaxPDF to be verstatile enough -to be used everyday as a pdf document viewer. +The following modifications have been made - Multi-columns document display - Selection for the last 10 viewed documents -- Automatically open the last viewed document +- Automatically open the last viewed document with last display parameters - Fullscreen mode - PageUp and PageDown buttons - Exit button @@ -56,7 +55,7 @@ to be used everyday as a pdf document viewer. - Gnome standard icons Installation ------------- +============ The following packages are required and may need to be built and installed if not available as a package: @@ -75,23 +74,24 @@ Poppler ------- To properly build poppler, some libraries are required to be installed. That's the case for -libjpeg, libpng and libtiff. Other libraries are required and are often already installed. Here is -a page to get some more informations about the dependencies: +libjpeg, libpng and libtiff to manage embedded images in PDFs. Other libraries are required +and are often already installed. Here is a page to get some more informations about the dependencies: http://www.linuxfromscratch.org/blfs/view/svn/general/poppler.html -Once the popper library untared, you need to configure it with the following command: +Once the popper library is untared, you need to build it with the following commands: ------------------------------------------ -./configure --prefix=/usr \ - --sysconfdir=/etc \ - --disable-static \ - --enable-build-type=release \ - --enable-cmyk \ - --enable-xpdf-headers +$ ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --disable-static \ + --enable-build-type=release \ + --enable-cmyk \ + --enable-xpdf-headers +$ make +$ sudo make install ------------------------------------------ -After that, the usual commands make && sudo make install will complete the installation. FLTK ---- diff --git a/TODO.txt b/TODO.txt index bd81d5c..5873b40 100644 --- a/TODO.txt +++ b/TODO.txt @@ -4,16 +4,24 @@ TODO - [DONE] Re-integrate the original code for PageDown, PageUp, j and k - [DONE] Mouse scrolling left-right not working properly with multi-columns - [DONE] Get rid of compilation warnings -- Dimensions functions to be revised for discripencies in the Width / High computations -- Scrollbars integration still to be completed -- Bug with load of a new file when the current file is still being processed -> crash +- [DONE] Add a new integrated mode "Page + Trim" +- [DONE] Dimensions functions to be revised for discripencies in the Width / High computations +- Scrollbars integration +- [DONE] Bug with load of a new file when the current file is still being processed -> crash +- [DONE] When changing document, save the previous document parameters -- Text selection not revised yet +- Text selection tool not revised yet -- Other aspects: + +- Other features - Title page(s) management: to offset rest of the document when columns > 1 - Get rid of the "Create Directory" icon in the open file dialog - - Add a new integrated "Page + Trim", if possible... + - Text search + - Printing + - Page rotation + For the whole document + For a specific page + - Double-click or Ctrl-Click: page selection (goto one column in page mode) - Tests, tests, tests \ No newline at end of file diff --git a/src/loadfile.cpp b/src/loadfile.cpp index 1c7fb6b..968f681 100644 --- a/src/loadfile.cpp +++ b/src/loadfile.cpp @@ -181,6 +181,8 @@ static bool notdone(const bool arr[], const u32 num) { return false; } +static bool aborting = false; + static void *renderer(void *) { // Optional timing @@ -208,6 +210,8 @@ static void *renderer(void *) { while (notdone(done, chunks)) { for (c = 0; c < chunks; c++) { + if (aborting) return NULL; + // Did the user skip around? const u32 first = __sync_fetch_and_add(&file->first_visible, 0); if (first) { @@ -289,6 +293,7 @@ bool loadfile(const char *file, recent_file_struct *recent_files) { // Parse info GooString gooname(file); + PDFDoc *pdf = new PDFDoc(&gooname); if (!pdf->isOk()) { const int err = pdf->getErrorCode(); @@ -313,7 +318,8 @@ bool loadfile(const char *file, recent_file_struct *recent_files) { if (::file->cache) { // Free the old one - pthread_cancel(::file->tid); + //pthread_cancel(::file->tid); + aborting = true; pthread_join(::file->tid, NULL); u32 i; @@ -354,6 +360,7 @@ bool loadfile(const char *file, recent_file_struct *recent_files) { const struct sched_param nice = { 15 }; pthread_attr_setschedparam(&attr, &nice); + aborting = false; pthread_create(&::file->tid, &attr, renderer, NULL); // Update title diff --git a/src/main.cpp b/src/main.cpp index e9c152c..bc7093a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -86,12 +86,56 @@ static Fl_Menu_Item menu_columns[] = { void debug(Fl_Box * ctrl, const float value, const char * hint) { - char tmp[20]; + char tmp[20]; - snprintf(tmp, 20, "%4.2f", value); - ctrl->copy_label(tmp); - ctrl->tooltip(hint); - ctrl->redraw_label(); + snprintf(tmp, 20, "%5.3f", value); + ctrl->copy_label(tmp); + ctrl->tooltip(hint); + ctrl->redraw_label(); + Fl::check(); +} + +void debug(Fl_Box * ctrl, const u32 value, const char * hint) { + + char tmp[20]; + + snprintf(tmp, 20, "%u", value); + ctrl->copy_label(tmp); + ctrl->tooltip(hint); + ctrl->redraw_label(); + Fl::check(); +} + +void debug(Fl_Box * ctrl, const s32 value, const char * hint) { + + char tmp[20]; + + snprintf(tmp, 20, "%d", value); + ctrl->copy_label(tmp); + ctrl->tooltip(hint); + ctrl->redraw_label(); + Fl::check(); +} + +void save_current_to_config() { + save_to_config( + file->filename, + view->get_columns(), + view->get_xoff(), + view->get_yoff(), + file->zoom, + file->mode, + win->x(), + win->y(), + win->w(), + win->h(), + fullscreen); +} + +void cb_exit(Fl_Widget*, void*) { + save_current_to_config(); + save_config(); + exit(0); } void cb_fullscreen(Fl_Button*, void*) { @@ -107,10 +151,13 @@ void cb_fullscreen(Fl_Button*, void*) { fullscreenbtn->tooltip(_("Exit Full Screen")); win->fullscreen(); } + view->take_focus(); } static void cb_Open(Fl_Button*, void*) { + save_current_to_config(); loadfile(NULL, NULL); + view->take_focus(); } static void display_zoom(const float what) @@ -126,6 +173,7 @@ static void applyzoom(const float what) { display_zoom(what); + view->take_focus(); view->resetselection(); view->redraw(); } @@ -149,6 +197,7 @@ static void cb_zoombar(Fl_Input_Choice *w, void*) { } } + view->take_focus(); view->redraw(); } @@ -190,8 +239,11 @@ void cb_recent_select(Fl_Select_Browser *, void *) { i -= 1; } - if ((rf != NULL) && loadfile(NULL, rf)) + save_current_to_config(); + if ((rf != NULL) && loadfile(NULL, rf)) { adjust_display_from_recent(*rf); + view->take_focus(); + } } static void cb_OpenRecent(Fl_Button*, void*) { @@ -230,25 +282,25 @@ static void cb_columns(Fl_Choice *w, void*) { } void cb_page_up(Fl_Button*, void*) { - Fl::e_keysym = FL_Page_Up; - Fl::handle_(FL_KEYDOWN, win); - Fl::handle_(FL_KEYUP, win); + view->page_up(); + view->take_focus(); } void cb_page_down(Fl_Button*, void*) { - Fl::e_keysym = FL_Page_Down; - Fl::handle_(FL_KEYDOWN, win); - Fl::handle_(FL_KEYUP, win); + view->page_down(); + view->take_focus(); } void cb_Zoomin(Fl_Button*, void*) { file->zoom *= 1.2f; applyzoom(file->zoom); + view->take_focus(); } void cb_Zoomout(Fl_Button*, void*) { file->zoom *= 0.833333; applyzoom(file->zoom); + view->take_focus(); } void cb_hide(Fl_Widget*, void*) { @@ -260,30 +312,15 @@ void cb_hide(Fl_Widget*, void*) { showbtn->hide(); buttons->show(); } + view->take_focus(); } void cb_vertical_scrollbar(Fl_Widget*, void*) { view->update_position(vertical_scrollbar->value()); + view->take_focus(); } -void cb_exit(Fl_Widget*, void*) { - save_to_config( - file->filename, - view->get_columns(), - view->get_xoff(), - view->get_yoff(), - file->zoom, - file->mode, - win->x(), - win->y(), - win->w(), - win->h(), - fullscreen); - save_config(); - exit(0); -} - -static void goto_page(Fl_Input *w, void*) { +static void cb_goto_page(Fl_Input *w, void*) { const u32 which = atoi(w->value()) - 1; if (which >= file->pages) { fl_alert(_("Page out of bounds")); @@ -412,7 +449,7 @@ int main(int argc, char **argv) { } // Fl_Button* recentselectbtn { pagebox = new Fl_Input(0, pos += 48, 64, 24); pagebox->value("0"); - pagebox->callback((Fl_Callback*)goto_page); + pagebox->callback((Fl_Callback*)cb_goto_page); pagebox->when(FL_WHEN_ENTER_KEY | FL_WHEN_NOT_CHANGED); } // Fl_Box* pagectr { pagectr = new Fl_Box(0, pos += 24, 64, 24, "/ 0"); @@ -480,31 +517,24 @@ int main(int argc, char **argv) { fullscreenbtn->tooltip(_("Enter Full Screen")); } { debug1 = new Fl_Box(0, pos += 38, 64, 32, ""); - debug1->box(FL_ENGRAVED_FRAME); debug1->align(FL_ALIGN_WRAP); } // Fl_Box* debug1 { debug2 = new Fl_Box(0, pos += 32, 64, 32, ""); - debug2->box(FL_ENGRAVED_FRAME); debug2->align(FL_ALIGN_WRAP); } // Fl_Box* debug2 { debug3 = new Fl_Box(0, pos += 32, 64, 32, ""); - debug3->box(FL_ENGRAVED_FRAME); debug3->align(FL_ALIGN_WRAP); } // Fl_Box* debug3 { debug4 = new Fl_Box(0, pos += 32, 64, 32, ""); - debug4->box(FL_ENGRAVED_FRAME); debug4->align(FL_ALIGN_WRAP); } // Fl_Box* debug4 { debug5 = new Fl_Box(0, pos += 32, 64, 32, ""); - debug5->box(FL_ENGRAVED_FRAME); debug5->align(FL_ALIGN_WRAP); } // Fl_Box* debug5 { debug6 = new Fl_Box(0, pos += 32, 64, 32, ""); - debug6->box(FL_ENGRAVED_FRAME); debug6->align(FL_ALIGN_WRAP); } // Fl_Box* debug6 { debug7 = new Fl_Box(0, pos += 32, 64, 32, ""); - debug7->box(FL_ENGRAVED_FRAME); debug7->align(FL_ALIGN_WRAP); } // Fl_Box* debug7 { Fl_Box *fill_box = new Fl_Box(0, pos += 32, 64, 64, ""); diff --git a/src/main.h b/src/main.h index 7ca63bf..e647640 100644 --- a/src/main.h +++ b/src/main.h @@ -62,6 +62,8 @@ extern u8 details; extern int writepipe; void debug(Fl_Box * ctrl, const float value, const char * hint); +void debug(Fl_Box * ctrl, const s32 value, const char * hint); +void debug(Fl_Box * ctrl, const u32 value, const char * hint); bool loadfile(const char *, recent_file_struct *recent_files); diff --git a/src/view.cpp b/src/view.cpp index 39a5914..8d9cdfc 100644 --- a/src/view.cpp +++ b/src/view.cpp @@ -44,7 +44,7 @@ void pdfview::set_scrollbar(Fl_Scrollbar* vscroll) { vertical_scrollbar = vscroll; } -void pdfview::adjust_scrollbar_parameters() { +void pdfview::adjust_scrollbar_parameters() const { float y = floorf(yoff); float frac = yoff - y; float k = file->pages - columns + 1; @@ -55,7 +55,7 @@ void pdfview::adjust_scrollbar_parameters() { } // From the document position, update scrollbar position. -void pdfview::update_scrollbar() const { +void pdfview::update_scrollbars() const { float y = floorf(yoff); float frac = yoff - y; float k = file->pages - columns + 1; @@ -97,9 +97,8 @@ void pdfview::set_params(int columns_count, float x, float y) { yoff = y; xoff = x; - adjust_yoff(0); - set_columns(columns_count); + go(y); } void pdfview::reset() { @@ -249,13 +248,8 @@ float pdfview::line_zoom_factor(const u32 first_page, u32 &width, u32 &height) c width = line_width; height = line_height; - debug(debug1, zoom_factor, "Zoom Factor"); - debug(debug2, w(), "Display width"); - debug(debug3, h(), "Display height"); - debug(debug4, line_width, "Line Width"); - debug(debug5, line_height, "Line Height"); + file->zoom = zoom_factor; - if (file->zoom == 0) file->zoom = zoom_factor; return zoom_factor; } @@ -267,7 +261,7 @@ void pdfview::update_visible(const bool fromdraw) const { // - file->first_visible // - file->last_visible // - pagebox->value - // - scrollbar update + // - scrollbars update // // This method as been extensively modified to take into account multicolumns // and the fact that no page will be expected to be of the same size as the others, @@ -277,7 +271,8 @@ void pdfview::update_visible(const bool fromdraw) const { const u32 prev = file->first_visible; - // Those are very conservative. Maybe optimize a bit further. + // Those are very very conservative numbers to compute last_visible. + // The end of the draw process will adjust precisely the value static const u32 max_lines_per_screen[MAX_COLUMNS_COUNT] = { 2, 3, 4, 5, 6 }; // Adjust file->first_visible @@ -305,24 +300,18 @@ void pdfview::update_visible(const bool fromdraw) const { if (!fromdraw) pagebox->redraw(); - update_scrollbar(); + update_scrollbars(); + Fl::check(); } } // Compute the vertical screen size of a line of pages u32 pdfview::pxrel(u32 page) const { - u32 maxH = 0; - u32 h, p; - for (p = page; (p < (page + columns)) && (p < file->pages); p++) { - if (file->mode != Z_CUSTOM && file->mode != Z_PAGE && file->mode != Z_PGTRIM) { - const float ratio = (w() / columns) / (float) fullw(p); - h = fullh(p) * ratio; //+ MARGIN * file->zoom; - } - else - h = (fullh(p) /* + MARGIN */) * file->zoom; - maxH = maxH > h ? maxH : h; - } - return maxH; + float zoom; + u32 line_width, line_height; + + zoom = line_zoom_factor(page, line_width, line_height); + return line_height * zoom; } void pdfview::draw() { @@ -351,6 +340,9 @@ void pdfview::draw() { fl_push_clip(X, Y, W, H); + if (file->mode != Z_CUSTOM) + xoff = 0.0f; + // As the variables are used for calculations, reset them to full widget dimensions. // (doesn´t seems to be needed... they are adjusted to something else in the code // that follow...) @@ -385,11 +377,10 @@ void pdfview::draw() { // Do the following for each page in line - s32 column; + s32 column = 0; + page = first_page_in_line; - for (page = first_page_in_line, column = 0; - (column < columns) && (page < file->pages); - page++, column++) { + while ((column < columns) && (page < file->pages)) { cur = &file->cache[page]; if (!cur->ready) @@ -398,10 +389,6 @@ void pdfview::draw() { H = pageh(page) * zoom; W = pagew(page) * zoom; - // XYWH is now the page's area. - if (Y >= (y() + h())) - continue; - fl_rectf(Xs = X, Ys = Y, Ws = W, Hs = H, pagecol); const bool margins = hasmargins(page); @@ -430,6 +417,7 @@ void pdfview::draw() { H = Hs; X += zoomedmarginhalf + (pagew(page) * zoom); + page++; column++; } // Prepare for next line of pages @@ -440,7 +428,7 @@ void pdfview::draw() { current_screen_pos = Y - y(); } - file->last_visible = page - 1; + file->last_visible = page; fl_pop_clip(); } @@ -590,6 +578,19 @@ void pdfview::end_of_selection() { delete dev; } +void pdfview::page_up() { + if (floorf(yoff) == yoff) + adjust_floor_yoff(-1.0f); + else + adjust_floor_yoff(0.0f); + redraw(); +} + +void pdfview::page_down() { + adjust_floor_yoff(1.0f); + redraw(); +} + int pdfview::handle(int e) { if (!file->cache) @@ -651,17 +652,20 @@ int pdfview::handle(int e) { else adjust_yoff(-((movedy / (float) h()) / zoom)); - if (file->mode != Z_CUSTOM) - xoff = 0; - else { + if (file->mode == Z_CUSTOM) { xoff += ((float) movedx / zoom) / line_width; - float maxchg = (((((float)w() / zoom) + (line_width * columns)) / 2) / line_width) - 0.1f; + float maxchg = (((((float)w() / zoom) + line_width) / 2) / line_width) - 0.1f; if (xoff < -maxchg) xoff = -maxchg; if (xoff > maxchg) xoff = maxchg; + debug(debug5, maxchg, "maxchg"); } + debug(debug1, zoom, "zoom"); + debug(debug2, line_width, "Line Width"); + debug(debug3, movedx, "movedx"); + debug(debug4, movedy, "movedy"); debug(debug6, xoff, " xoff "); debug(debug7, yoff, " yoff "); @@ -763,16 +767,11 @@ int pdfview::handle(int e) { break; case FL_Page_Up: - if (floorf(yoff) == yoff) - adjust_floor_yoff(-1.0f); - else - adjust_floor_yoff(0.0f); - redraw(); + page_up(); break; case FL_Page_Down: - adjust_floor_yoff(1.0f); - redraw(); + page_down(); break; case FL_Home: @@ -784,25 +783,21 @@ int pdfview::handle(int e) { break; case FL_End: - if (Fl::event_ctrl()) { + if (Fl::event_ctrl()) yoff = maxyoff(); - fl_message(" yoff = %f ", yoff); - } else { u32 page = yoff; s32 sh = line_height * zoom; - float marginoffset = zoom * MARGIN / (float) sh; if (file->cache[page].ready) { const s32 hidden = sh - h(); - float tmp = floorf(yoff) + hidden / (float) sh + marginoffset / 2; + float tmp = floorf(yoff) + hidden / (float) sh; if (tmp > yoff) yoff = tmp; adjust_yoff(0); } - else { + else yoff = ceilf(yoff) - 0.4f; - } } redraw(); break; diff --git a/src/view.h b/src/view.h index c6a8202..90d8403 100644 --- a/src/view.h +++ b/src/view.h @@ -31,16 +31,19 @@ class pdfview: public Fl_Widget { void go(const u32 page); void reset(); void resetselection(); - void update_scrollbar() const; void set_columns(int count); void update_position(const int vscroll_pos); inline float get_xoff() { return xoff; }; inline float get_yoff() { return yoff; }; inline int get_columns() { return columns; }; void set_params(int columns_count, float x, float y); + void page_up(); + void page_down(); private: float line_zoom_factor(u32 first_page, u32 &width,u32 &height) const; void update_visible(const bool fromdraw) const; + void update_scrollbars() const; + void adjust_scrollbar_parameters() const; u8 iscached(const u32 page) const; void docache(const u32 page); float maxyoff() const; @@ -49,7 +52,6 @@ class pdfview: public Fl_Widget { const u32 w, const u32 h); void adjust_yoff(float offset); void adjust_floor_yoff(float offset); - void adjust_scrollbar_parameters(); void end_of_selection(); u32 pageh(u32 page) const; u32 pagew(u32 page) const; From f979ac0c8be9e7e2f472c36187e878bbab7b89ed Mon Sep 17 00:00:00 2001 From: Guy Turcotte Date: Thu, 3 Nov 2016 22:46:28 -0400 Subject: [PATCH 13/21] Subclassing pdfview to Fl_Scroll. Still work in progress... --- TODO.txt | 4 +- src/Makefile.am | 2 +- src/main.cpp | 36 +++++++------- src/main.h | 2 +- src/view.cpp | 123 +++++++++++++++++++++++++++++------------------- src/view.h | 8 ++-- 6 files changed, 99 insertions(+), 76 deletions(-) diff --git a/TODO.txt b/TODO.txt index 5873b40..3e1f3f2 100644 --- a/TODO.txt +++ b/TODO.txt @@ -20,8 +20,8 @@ TODO - Text search - Printing - Page rotation - For the whole document - For a specific page + . For the whole document + . For a specific page - Double-click or Ctrl-Click: page selection (goto one column in page mode) - Tests, tests, tests \ No newline at end of file diff --git a/src/Makefile.am b/src/Makefile.am index 95991d9..ed9655c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -2,6 +2,6 @@ bin_PROGRAMS = flaxpdf flaxpdf_SOURCES = main.cpp main.h loadfile.cpp gettext.h \"icons 32x32.h\" wmicon.h \ lrtypes.h macros.h helpers.h helpers.cpp \ - view.cpp view.h config.cpp config.h + view.cpp view.h config.cpp config.h AM_CPPFLAGS=-DDATADIR=\"$(pkgdatadir)\" -DLOCALEDIR=\"$(localedir)\" diff --git a/src/main.cpp b/src/main.cpp index bc7093a..b2658cd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -32,13 +32,10 @@ using namespace libconfig; Fl_Double_Window *win = NULL; static Fl_Pack* win_pack = NULL; static Fl_Pack *buttons = NULL; -static Fl_Pack *v = NULL; static Fl_Button *showbtn = NULL; static Fl_Button *fullscreenbtn = NULL; static Fl_Button *recentselectbtn = NULL; -static Fl_Scrollbar * vertical_scrollbar = NULL; - static Fl_PNG_Image *fullscreen_image = NULL; static Fl_PNG_Image *fullscreenreverse_image = NULL; @@ -315,11 +312,6 @@ void cb_hide(Fl_Widget*, void*) { view->take_focus(); } -void cb_vertical_scrollbar(Fl_Widget*, void*) { - view->update_position(vertical_scrollbar->value()); - view->take_focus(); -} - static void cb_goto_page(Fl_Input *w, void*) { const u32 which = atoi(w->value()) - 1; if (which >= file->pages) { @@ -555,20 +547,24 @@ int main(int argc, char **argv) { showbtn->hide(); showbtn->callback(cb_hide); } - { v = new Fl_Pack(64, 0, 700-64, 700); - v->type(Fl_Pack::HORIZONTAL); - { view = new pdfview(0, 0, 700-64-16, 700); - Fl_Group::current()->resizable(view); - } - { vertical_scrollbar = new Fl_Scrollbar(700-64-16, 0, 16, 700); - vertical_scrollbar->callback((Fl_Callback*)cb_vertical_scrollbar); - } // Fl_Box* o - view->set_scrollbar(vertical_scrollbar); - v->end(); - v->show(); + { view = new pdfview(64, 0, 700-64, 700); + view->type(Fl_Scroll::BOTH); + view->box(FL_DOWN_FRAME); + view->end(); + view->show(); } - Fl_Group::current()->resizable(v); + // { v = new Fl_Scroll(64, 0, 700-64, 700); + // v->type(Fl_Scroll::BOTH); + // v->box(FL_DOWN_FRAME); + // { view = new pdfview(0, 0, 700-64, 700); + // Fl_Scroll::current()->resizable(view); + // } + // v->end(); + // v->show(); + // } + + Fl_Group::current()->resizable(view); win_pack->end(); win_pack->show(); diff --git a/src/main.h b/src/main.h index e647640..4d55a60 100644 --- a/src/main.h +++ b/src/main.h @@ -33,7 +33,7 @@ along with this program. If not, see . #include #include #include -#include +#include #include #include #include diff --git a/src/view.cpp b/src/view.cpp index 8d9cdfc..6bb62c8 100644 --- a/src/view.cpp +++ b/src/view.cpp @@ -21,7 +21,7 @@ along with this program. If not, see . #define MARGIN 36 #define MARGINHALF 18 -pdfview::pdfview(int x, int y, int w, int h): Fl_Widget(x, y, w, h), +pdfview::pdfview(int x, int y, int w, int h): Fl_Scroll(x, y, w, h), yoff(0), xoff(0), selx(0), sely(0), selx2(0), sely2(0), columns(1) { @@ -40,28 +40,54 @@ void pdfview::resetselection() { selx = sely = selx2 = sely2 = 0; } -void pdfview::set_scrollbar(Fl_Scrollbar* vscroll) { - vertical_scrollbar = vscroll; +void pdfview::compute_screen_size() { + // This will be changed once I understand Fl_Scroll... + screen_x = x(); + screen_y = y(); + //bbox(screen_x, screen_y, screen_width, screen_height); + //if (!hscrollbar.visible()) + screen_height = h(); + //if (!scrollbar.visible()) + screen_width = w(); } void pdfview::adjust_scrollbar_parameters() const { - float y = floorf(yoff); - float frac = yoff - y; - float k = file->pages - columns + 1; - k = k < columns ? columns : k; - int relpos = ((y / columns + frac) / (k / columns)) * 50000; - int size = 50000 / (k / columns); - vertical_scrollbar->value(relpos, size, 0, 50000); + + s32 tmp; + + float length = maxyoff(); + tmp = length; + length = (length - tmp) + (tmp / columns); + + + float relpos = yoff; + tmp = relpos; + relpos = (relpos - tmp) + (tmp / columns); + + debug(debug6, 50000 * relpos / length, "Scrollbar position"); + debug(debug7, 50000 / length, "Size"); + + //vertical_scrollbar->value(50000 * relpos / length, 50000 / length, 0, 50000); } // From the document position, update scrollbar position. void pdfview::update_scrollbars() const { - float y = floorf(yoff); - float frac = yoff - y; - float k = file->pages - columns + 1; - k = k < columns ? columns : k; - int relpos = ((y / columns + frac) / (k / columns)) * 50000; - vertical_scrollbar->value(relpos); + + s32 tmp; + + float length = maxyoff(); + tmp = length; + length = (length - tmp) + (tmp / columns); + + float relpos = yoff; + tmp = relpos; + relpos = (relpos - tmp) + (tmp / columns); + + debug(debug1, relpos, "relpos"); + debug(debug2, length, "length"); + debug(debug3, 50000 * relpos / length, "scrollbar position"); + + //vertical_scrollbar->value(50000 * relpos / length); } // From the scrollbar position, update position in the document. @@ -224,20 +250,21 @@ float pdfview::line_zoom_factor(const u32 first_page, u32 &width, u32 &height) c const u32 line_width = fullw(first_page); const u32 line_height = fullh(first_page); + float zoom_factor; switch (file->mode) { case Z_TRIM: case Z_WIDTH: - zoom_factor = (float)this->w() / line_width; + zoom_factor = (float)screen_width / line_width; break; case Z_PAGE: case Z_PGTRIM: - if (((float)line_width / line_height) > ((float)this->w() / this->h())) { - zoom_factor = (float)this->w() / line_width; + if (((float)line_width / line_height) > ((float)screen_width / screen_height)) { + zoom_factor = (float)screen_width / line_width; } else { - zoom_factor = (float)this->h() / line_height; + zoom_factor = (float)screen_height / line_height; } break; default: @@ -319,13 +346,14 @@ void pdfview::draw() { if (!file->cache) return; + compute_screen_size(); update_visible(true); const Fl_Color pagecol = FL_WHITE; int X, Y, W, H; int Xs, Ys, Ws, Hs; // Saved values - fl_clip_box(x(), y(), w(), h(), X, Y, W, H); + fl_clip_box(screen_x, screen_y, screen_width, screen_height, X, Y, W, H); // If nothing is visible on screen, nothing to do if (W == 0 || H == 0) @@ -356,7 +384,7 @@ void pdfview::draw() { u32 page = file->first_visible; // Do the following for each line of pages - while (current_screen_pos < h() && (first_page_in_line < file->pages)) { + while (current_screen_pos < screen_height && (first_page_in_line < file->pages)) { float zoom; u32 line_width, line_height; @@ -368,12 +396,12 @@ void pdfview::draw() { H = line_height * zoom; // Line of pages height in screen pixels if (first_line) { - Y = y() - invisibleY * H; + Y = screen_y - invisibleY * H; first_line = false; } - X = x() + w() / 2 - zoom * line_width / 2 + (zoom * xoff * line_width); + X = screen_x + screen_width / 2 - zoom * line_width / 2 + (zoom * xoff * line_width); // Do the following for each page in line @@ -425,7 +453,7 @@ void pdfview::draw() { Y += (line_height * zoom) + zoomedmarginhalf; first_page_in_line += columns; - current_screen_pos = Y - y(); + current_screen_pos = Y - screen_y; } file->last_visible = page; @@ -448,7 +476,7 @@ float pdfview::maxyoff() const { if (!file->cache[last].ready) f = last + 0.5f; else { - s32 H = this->h(); + s32 H = screen_height; while (true) { zoom = line_zoom_factor(last, line_width, line_height); @@ -470,8 +498,6 @@ float pdfview::maxyoff() const { return f; } -static int lasty, lastx; - void pdfview::end_of_selection() { const u32 zoomedmargin = MARGIN * file->zoom; @@ -483,8 +509,8 @@ void pdfview::end_of_selection() { const float visible = 1 - floored; u32 zoomedh = fullh(page) * visible * file->zoom; const u32 ratiominus = hasmargins(page) ? zoomedmargin : 0; - const float ratio = w() / (float) fullw(page); - const float ratiox = (w() - ratiominus) / (float) fullw(page); + const float ratio = screen_width / (float) fullw(page); + const float ratiox = (screen_width - ratiominus) / (float) fullw(page); if (file->mode != Z_CUSTOM && file->mode != Z_PAGE && file->mode != Z_PGTRIM) { zoomedh = fullh(page) * visible * ratio; } @@ -513,8 +539,8 @@ void pdfview::end_of_selection() { } // Convert to widget coords - X -= x(); - Y -= y(); + X -= screen_x; + Y -= screen_y; // Offset switch (file->mode) { @@ -557,7 +583,7 @@ void pdfview::end_of_selection() { Y += floored * (fullh(page) * file->zoom + zoomedmargin); Y -= zoomedmarginhalf; // Grey margin - X -= (w() - (fullw(page) * file->zoom)) / 2 + xoff * (fullw(page) * file->zoom); + X -= (screen_width - (fullw(page) * file->zoom)) / 2 + xoff * (fullw(page) * file->zoom); X /= file->zoom; Y /= file->zoom; @@ -600,6 +626,7 @@ int pdfview::handle(int e) { u32 line_width, line_height; zoom = line_zoom_factor(yoff, line_width, line_height); + static int lasty, lastx; const float move = 0.05f; switch (e) { @@ -648,26 +675,26 @@ int pdfview::handle(int e) { fl_cursor(FL_CURSOR_MOVE); if (file->maxh) - adjust_yoff(-((movedy / zoom) / line_height)); + adjust_yoff(-((movedy / zoom) / file->maxh)); else - adjust_yoff(-((movedy / (float) h()) / zoom)); + adjust_yoff(-((movedy / (float) screen_height) / zoom)); if (file->mode == Z_CUSTOM) { xoff += ((float) movedx / zoom) / line_width; - float maxchg = (((((float)w() / zoom) + line_width) / 2) / line_width) - 0.1f; + float maxchg = (((((float)screen_width / zoom) + line_width) / 2) / line_width) - 0.1f; if (xoff < -maxchg) xoff = -maxchg; if (xoff > maxchg) xoff = maxchg; - debug(debug5, maxchg, "maxchg"); + // debug(debug5, maxchg, "maxchg"); } - debug(debug1, zoom, "zoom"); - debug(debug2, line_width, "Line Width"); - debug(debug3, movedx, "movedx"); - debug(debug4, movedy, "movedy"); - debug(debug6, xoff, " xoff "); - debug(debug7, yoff, " yoff "); + // debug(debug1, zoom, "zoom"); + // debug(debug2, line_width, "Line Width"); + // debug(debug3, movedx, "movedx"); + // debug(debug4, movedy, "movedy"); + // debug(debug6, xoff, " xoff "); + // debug(debug7, yoff, " yoff "); lasty = my; lastx = mx; @@ -703,7 +730,7 @@ int pdfview::handle(int e) { s32 shp = sh = pxrel(page); if (page >= columns) shp = pxrel(page - columns); - if ((h() + (file->zoom * 2 * MARGIN)) >= sh) { + if ((screen_height + (file->zoom * 2 * MARGIN)) >= sh) { /* scroll up like Page_Up */ if (floorf(yoff) >= yoff) adjust_floor_yoff(-1.0f); @@ -712,7 +739,7 @@ int pdfview::handle(int e) { } else { /* scroll up less than one page height */ - float d = (h() - MARGIN) / (float) sh; + float d = (screen_height - MARGIN) / (float) sh; if (((u32) yoff) != ((u32) (yoff - d))) { /* scrolling over page border */ d -= (yoff - floorf(yoff)); @@ -736,13 +763,13 @@ int pdfview::handle(int e) { s32 shn = sh = pxrel(page); if (page + columns <= (s32)(file->pages - 1)) shn = pxrel(page + columns); - if (h() + 2 * MARGIN * file->zoom >= sh) { + if (screen_height + 2 * MARGIN * file->zoom >= sh) { /* scroll down like Page_Down */ adjust_floor_yoff(1.0f); } else { /* scroll down less than one page height */ - float d = (h() - MARGIN) / (float) sh; + float d = (screen_height - MARGIN) / (float) sh; if (((u32) yoff) != ((u32) (yoff + d))) { /* scrolling over page border */ d -= (ceilf(yoff) - yoff); @@ -790,7 +817,7 @@ int pdfview::handle(int e) { s32 sh = line_height * zoom; if (file->cache[page].ready) { - const s32 hidden = sh - h(); + const s32 hidden = sh - screen_height; float tmp = floorf(yoff) + hidden / (float) sh; if (tmp > yoff) yoff = tmp; diff --git a/src/view.h b/src/view.h index 90d8403..d86dcd3 100644 --- a/src/view.h +++ b/src/view.h @@ -21,10 +21,9 @@ along with this program. If not, see . #define CACHE_MAX 15 -class pdfview: public Fl_Widget { +class pdfview: public Fl_Scroll { public: pdfview(int x, int y, int w, int h); - void set_scrollbar(Fl_Scrollbar* vscroll); void draw(); int handle(int e); @@ -40,6 +39,7 @@ class pdfview: public Fl_Widget { void page_up(); void page_down(); private: + void compute_screen_size(); float line_zoom_factor(u32 first_page, u32 &width,u32 &height) const; void update_visible(const bool fromdraw) const; void update_scrollbars() const; @@ -64,11 +64,11 @@ class pdfview: public Fl_Widget { u16 cachedpage[CACHE_MAX]; Pixmap pix[CACHE_MAX]; - Fl_Scrollbar *vertical_scrollbar; - // Text selection coords u16 selx, sely, selx2, sely2; s32 columns; + + s32 screen_x, screen_y, screen_width, screen_height; }; extern pdfview *view; From 58ad49a3a47c67568bc0fc77eccf0af623ce3d5b Mon Sep 17 00:00:00 2001 From: Guy Turcotte Date: Fri, 4 Nov 2016 08:18:57 -0400 Subject: [PATCH 14/21] Got rid of scrollbar trials --- README.asciidoc | 2 + TODO.txt | 2 +- screenshot.png | Bin 0 -> 188779 bytes src/icons 32x32.h | 249 ++++++++++++++++++++++++++++++++++++++++++++++ src/main.cpp | 44 +++++--- src/main.h | 1 - src/view.cpp | 98 +++++------------- src/view.h | 7 +- 8 files changed, 306 insertions(+), 97 deletions(-) create mode 100644 screenshot.png diff --git a/README.asciidoc b/README.asciidoc index b00126b..02da80d 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -40,6 +40,8 @@ FlaxPDF 57% (5% *) 36.5 MB 45 KB FlaxPDF, as the only one of the three, is able to take advantage of the GPU, dropping its CPU use when scrolling to 5% (tested on radeon). +image::sunset.jpg[] + New capabilities / modifications added (November 2016) ------------------------------------------------------ diff --git a/TODO.txt b/TODO.txt index 3e1f3f2..219b4a9 100644 --- a/TODO.txt +++ b/TODO.txt @@ -6,7 +6,6 @@ TODO - [DONE] Get rid of compilation warnings - [DONE] Add a new integrated mode "Page + Trim" - [DONE] Dimensions functions to be revised for discripencies in the Width / High computations -- Scrollbars integration - [DONE] Bug with load of a new file when the current file is still being processed -> crash - [DONE] When changing document, save the previous document parameters @@ -23,5 +22,6 @@ TODO . For the whole document . For a specific page - Double-click or Ctrl-Click: page selection (goto one column in page mode) + - Scrollbars integration (I doubt FLTK Fl_Scroll is a solution) - Tests, tests, tests \ No newline at end of file diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..7c111976312ff00a67697d5515c9ea88b0093a61 GIT binary patch literal 188779 zcmY&=1yogO_xGhkQc?*40SQSd=|)0A8l(iILt3O$Ns*K;0g-M=DG@=C7HJS^kS>95 z-Ab7W-gWpD@P{>OAc3a7fVY=S8FG?9ke!a1cDBs zC@ZDqmA*OSnNGTV@o9I^er~E|b|D~-TCNg>A?d;OYvfU>U8-HzE4#BWf-&UKqo2sW z%+5tsBEdr^3SYJCn^V(S6au{>=fO zmA6)z8h$4WSnVk8?(U>p9MU{&*>s9;7?JI+-m^bv&gn0E=5%zy~dM~Lh>DkOq|KAWx z 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\&_Gw1V3CPi|LJdgpZ-g~;! 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 literal 0 HcmV?d00001 diff --git a/src/icons 32x32.h b/src/icons 32x32.h index a800220..eb0fbc8 100644 --- a/src/icons 32x32.h +++ b/src/icons 32x32.h @@ -1853,3 +1853,252 @@ unsigned char emblem_documents_png[] = { 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; unsigned int emblem_documents_png_len = 1739; +unsigned char go_top_png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, + 0x08, 0x06, 0x00, 0x00, 0x00, 0x73, 0x7a, 0x7a, 0xf4, 0x00, 0x00, 0x05, + 0x53, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xed, 0x57, 0x5b, 0x4c, 0x93, + 0x67, 0x18, 0x06, 0xc4, 0xe1, 0x76, 0xb1, 0xdd, 0x6c, 0xc9, 0x2e, 0xc8, + 0xb2, 0x8b, 0x25, 0xbb, 0xd9, 0xbc, 0x32, 0xd9, 0xcd, 0x2e, 0x16, 0x49, + 0xd4, 0x6c, 0xd9, 0x0d, 0xa5, 0x80, 0x31, 0x44, 0xe4, 0x4c, 0x01, 0x11, + 0x71, 0x80, 0xb4, 0x60, 0x45, 0x2b, 0x43, 0x14, 0x90, 0x83, 0x96, 0xf3, + 0x19, 0x04, 0x41, 0x10, 0x66, 0x15, 0x95, 0x42, 0x65, 0x08, 0x6e, 0x73, + 0x19, 0x6e, 0x5a, 0x0a, 0x6a, 0x39, 0xb5, 0x20, 0xf4, 0x00, 0xb4, 0x9c, + 0xda, 0xfe, 0xff, 0xbb, 0xf7, 0xfb, 0xf2, 0x97, 0x94, 0x65, 0x2b, 0xe0, + 0x90, 0x6d, 0xc9, 0x9a, 0x3c, 0xf9, 0xdb, 0xef, 0x7b, 0xbf, 0xef, 0x7d, + 0xde, 0xf3, 0x5f, 0x17, 0x00, 0xf8, 0x47, 0xf1, 0xef, 0x23, 0x20, 0xeb, + 0x92, 0x79, 0xca, 0x15, 0x1d, 0xb5, 0x77, 0xe5, 0xb7, 0x2d, 0x77, 0x3a, + 0x65, 0xb0, 0x19, 0x74, 0xdc, 0xbb, 0x09, 0xb2, 0x8e, 0x36, 0x68, 0x97, + 0xb5, 0x40, 0x6b, 0x7b, 0x13, 0x34, 0xb7, 0x36, 0x40, 0x63, 0x53, 0x1d, + 0xd4, 0x37, 0x54, 0x43, 0x6d, 0x7d, 0xa5, 0xad, 0xb6, 0xae, 0xa2, 0xa5, + 0xa4, 0xba, 0xe4, 0x23, 0xa7, 0x04, 0xe4, 0x8a, 0x3b, 0x15, 0x3a, 0xdd, + 0x34, 0x03, 0x5b, 0xfc, 0x61, 0x59, 0x16, 0x26, 0x34, 0x13, 0x6c, 0x69, + 0x99, 0xb4, 0xdd, 0x29, 0x81, 0xce, 0xae, 0x8e, 0x59, 0x22, 0xcc, 0x30, + 0x0c, 0x58, 0xad, 0x56, 0xb0, 0x58, 0x2c, 0xb0, 0xbc, 0xbc, 0x0c, 0x4b, + 0x4b, 0x4b, 0xb0, 0xb8, 0xb8, 0x08, 0x0b, 0x0b, 0x0b, 0x60, 0x36, 0x9b, + 0xc1, 0x64, 0x32, 0xc1, 0xfc, 0xfc, 0x1c, 0xcc, 0xcd, 0xcd, 0xc2, 0xec, + 0xac, 0x11, 0x8c, 0x46, 0x03, 0x18, 0x0c, 0x7a, 0xd0, 0xeb, 0x67, 0x60, + 0x66, 0xe6, 0x25, 0x4c, 0x4f, 0x4f, 0xc1, 0xd4, 0x94, 0x16, 0xb4, 0x93, + 0x1a, 0xd0, 0x68, 0xc6, 0x41, 0xab, 0xd5, 0xd0, 0xfb, 0xf2, 0xa5, 0x97, + 0x56, 0x1a, 0x1b, 0x1b, 0x77, 0xac, 0xeb, 0x01, 0x42, 0xc2, 0x66, 0xb3, + 0xad, 0x92, 0x58, 0x59, 0x59, 0xa1, 0x44, 0x38, 0x32, 0x1c, 0xa1, 0x05, + 0x24, 0x44, 0x60, 0x46, 0x98, 0xc0, 0x64, 0x46, 0x98, 0x38, 0x52, 0x73, + 0x8e, 0xa4, 0x74, 0xf0, 0xf2, 0xe5, 0x24, 0x28, 0x7a, 0xba, 0x99, 0xbc, + 0xcb, 0x39, 0xed, 0x1b, 0xcc, 0x81, 0x5b, 0x96, 0x0d, 0xc7, 0xb9, 0x19, + 0xe3, 0xdc, 0x58, 0x0d, 0x35, 0xf5, 0x15, 0x50, 0x59, 0x53, 0x0a, 0x65, + 0x95, 0x45, 0x50, 0x5c, 0x26, 0x05, 0x69, 0x71, 0x01, 0x14, 0x48, 0x73, + 0x21, 0xb7, 0x20, 0x1b, 0x72, 0xf2, 0x2e, 0xda, 0x10, 0x2d, 0xe9, 0x59, + 0xe9, 0x6b, 0x72, 0xe0, 0xbf, 0x5d, 0x86, 0x24, 0x96, 0x35, 0x75, 0x55, + 0x09, 0xb9, 0xb2, 0x5c, 0x8f, 0x6d, 0x27, 0x20, 0x16, 0x8b, 0xdd, 0xaa, + 0x6a, 0xcb, 0x6a, 0x89, 0xfb, 0x4b, 0xca, 0xa5, 0x6d, 0x85, 0x85, 0x85, + 0x3b, 0xb7, 0x93, 0x80, 0x6b, 0x79, 0x75, 0x49, 0xc5, 0x4f, 0x8f, 0x7e, + 0xa0, 0xe5, 0xf5, 0xe8, 0xe7, 0x1f, 0x01, 0x93, 0xab, 0x19, 0x49, 0xb9, + 0x6f, 0x07, 0x01, 0xd7, 0xd2, 0xca, 0xa2, 0xa2, 0xbe, 0xfe, 0x5e, 0xaa, + 0x1c, 0xab, 0x83, 0x3e, 0x1f, 0xf4, 0x3f, 0x80, 0x0b, 0xd9, 0x19, 0x57, + 0x49, 0x58, 0x5e, 0x2b, 0x81, 0x92, 0x52, 0x69, 0x41, 0x4f, 0xaf, 0x82, + 0x2a, 0xc5, 0x32, 0xa4, 0x3d, 0x00, 0xcb, 0x90, 0xfe, 0xee, 0x56, 0xc8, + 0xe1, 0x8c, 0x44, 0x5c, 0x4d, 0xc2, 0xf3, 0x5a, 0x08, 0x14, 0x16, 0x5f, + 0xce, 0x96, 0x77, 0xdf, 0xa3, 0xca, 0x50, 0x29, 0xad, 0x71, 0x3b, 0xcc, + 0x66, 0x13, 0x5d, 0xbf, 0xd5, 0x21, 0x03, 0xa1, 0x28, 0xb1, 0xcc, 0xc5, + 0xc5, 0xc5, 0x75, 0x4b, 0x09, 0x5c, 0x29, 0xcc, 0xcb, 0xb8, 0x73, 0xf7, + 0x36, 0x30, 0x2c, 0x83, 0xca, 0xe6, 0x01, 0x9b, 0xd5, 0x1f, 0x41, 0x9a, + 0x10, 0x25, 0xd1, 0xd2, 0xda, 0x0c, 0xc7, 0x4f, 0xc4, 0x4a, 0x09, 0x89, + 0x2d, 0x21, 0x90, 0x2f, 0xcd, 0x39, 0x73, 0xf3, 0x76, 0x3b, 0x6d, 0xcf, + 0xa8, 0x84, 0x76, 0x35, 0x0e, 0x54, 0xb1, 0xe3, 0x6f, 0xec, 0x82, 0x54, + 0xae, 0xfe, 0x6a, 0x0d, 0x08, 0xa2, 0xc3, 0xf2, 0xfe, 0x36, 0x81, 0xbc, + 0x82, 0xec, 0x94, 0x1b, 0x6d, 0xcd, 0xe4, 0x52, 0x7a, 0xb9, 0x56, 0x3b, + 0x61, 0x07, 0xed, 0xf9, 0xd8, 0x66, 0xf1, 0x39, 0xed, 0xb8, 0x4e, 0xf2, + 0x82, 0xca, 0x97, 0x96, 0x17, 0x43, 0x50, 0x70, 0xe0, 0xc5, 0x57, 0x26, + 0x90, 0x93, 0x9b, 0x99, 0x78, 0xed, 0x7a, 0x03, 0x99, 0x09, 0xf4, 0xd2, + 0xb1, 0xf1, 0x51, 0x3b, 0x70, 0xd0, 0x4c, 0xc2, 0xf0, 0xf3, 0x61, 0x90, + 0xa4, 0x9f, 0x85, 0xc1, 0x41, 0x25, 0x4c, 0xa1, 0xf5, 0x8e, 0xfb, 0x06, + 0x83, 0x01, 0x49, 0xd8, 0x20, 0x2f, 0x3f, 0x17, 0x0e, 0x1e, 0xf2, 0x4b, + 0xdf, 0x34, 0x81, 0x0b, 0x39, 0xe7, 0xe3, 0xea, 0xd0, 0x8d, 0x56, 0x9b, + 0x95, 0x0e, 0x15, 0xf5, 0xc8, 0x8b, 0x55, 0x68, 0xd0, 0xca, 0xe1, 0x67, + 0x43, 0x90, 0x2a, 0x16, 0x32, 0xb1, 0x71, 0x51, 0x97, 0x12, 0x92, 0xe2, + 0x2d, 0x4a, 0xe5, 0x53, 0xba, 0xee, 0x28, 0xa7, 0x37, 0xe8, 0x28, 0xf9, + 0xf3, 0x99, 0x19, 0xc0, 0xf7, 0xe3, 0x9d, 0xde, 0x30, 0x81, 0xcc, 0xac, + 0x8c, 0xe8, 0xaa, 0x9a, 0x0a, 0x3a, 0x09, 0x0d, 0x46, 0x3d, 0x3c, 0x43, + 0x4b, 0x39, 0x50, 0xeb, 0x86, 0x86, 0x87, 0x20, 0xe5, 0x94, 0x90, 0x89, + 0x3a, 0x1a, 0x79, 0x98, 0xc8, 0x87, 0x46, 0x84, 0xf2, 0x8e, 0xc5, 0xc5, + 0x58, 0x9f, 0x28, 0x9f, 0xe0, 0xfe, 0xd8, 0x1a, 0x79, 0x9d, 0x4e, 0x47, + 0x8d, 0x38, 0xf7, 0xad, 0x84, 0x90, 0x10, 0xae, 0x4b, 0x40, 0x92, 0x29, + 0xf9, 0xa4, 0xb4, 0xac, 0x98, 0x25, 0x23, 0x58, 0x8f, 0xe5, 0xa5, 0x1a, + 0x1a, 0xb4, 0x03, 0xad, 0x52, 0x83, 0x6a, 0x58, 0x05, 0xa2, 0x54, 0x21, + 0x2b, 0x88, 0x0e, 0x0f, 0x76, 0x3c, 0x17, 0x10, 0x18, 0xe0, 0x2f, 0x88, + 0x8a, 0xb0, 0xfd, 0xf6, 0xf4, 0x57, 0x18, 0x19, 0x55, 0xaf, 0x39, 0x37, + 0xa3, 0x9b, 0xa6, 0xc6, 0x9c, 0x3a, 0x9d, 0x02, 0x7c, 0x7f, 0xef, 0xaf, + 0x9c, 0x12, 0x38, 0x2b, 0x11, 0x5f, 0x99, 0xd0, 0x8c, 0xe3, 0x6c, 0x9f, + 0x47, 0x0b, 0x86, 0x56, 0x31, 0x3a, 0x36, 0x42, 0x2c, 0x42, 0xe5, 0xc9, + 0x10, 0x1e, 0x19, 0x1a, 0xf1, 0x67, 0x9e, 0xe3, 0xfb, 0xf3, 0x03, 0xc2, + 0x22, 0x42, 0x98, 0x41, 0x95, 0x12, 0x3d, 0x31, 0xe2, 0x78, 0x9e, 0x26, + 0xf0, 0x24, 0xe6, 0x8d, 0x8f, 0x3f, 0xaf, 0xc2, 0x29, 0x01, 0x8c, 0xab, + 0xd6, 0x6a, 0xb5, 0xd0, 0xb7, 0x99, 0x17, 0xea, 0x67, 0x14, 0xe3, 0x13, + 0xa3, 0x24, 0xa6, 0xe8, 0xf6, 0x64, 0x08, 0x8b, 0x08, 0x8e, 0x26, 0x72, + 0x69, 0x69, 0x29, 0x9f, 0xa6, 0x49, 0xc4, 0xe5, 0xe2, 0xb4, 0x94, 0x39, + 0xf1, 0x69, 0x51, 0x9d, 0x50, 0x98, 0xb0, 0x87, 0xac, 0xfb, 0xfa, 0xf2, + 0x82, 0x22, 0x05, 0xe1, 0x2c, 0xe6, 0x08, 0x9e, 0x1b, 0xb3, 0xdf, 0x41, + 0x0d, 0xc0, 0xb6, 0x4d, 0xc2, 0x30, 0xed, 0x94, 0x40, 0xa2, 0x30, 0xa1, + 0x88, 0xbc, 0x46, 0x99, 0x4c, 0xf3, 0x34, 0xde, 0xe4, 0xfb, 0x18, 0x1e, + 0x4e, 0x41, 0xcb, 0x83, 0xc3, 0x8e, 0xc4, 0x11, 0x19, 0xd1, 0x19, 0xd1, + 0xc7, 0x97, 0xf2, 0xb3, 0x96, 0xc6, 0xc7, 0xc7, 0x58, 0xe2, 0x5a, 0x95, + 0x4a, 0xc9, 0x66, 0x64, 0x9e, 0x5b, 0x8c, 0x4f, 0x8c, 0xff, 0x9c, 0x23, + 0x11, 0x11, 0x15, 0x23, 0x00, 0xb5, 0xfa, 0x39, 0x3d, 0x8f, 0xde, 0xc0, + 0xe7, 0x04, 0xf4, 0x7c, 0xaf, 0x00, 0xbe, 0xaf, 0xcf, 0x77, 0x4e, 0x09, + 0x9c, 0x38, 0x11, 0xfb, 0x59, 0x56, 0x76, 0x26, 0x3b, 0xf0, 0x78, 0x80, + 0x66, 0x75, 0xff, 0xc3, 0x3e, 0x48, 0x16, 0x25, 0x41, 0x50, 0x50, 0xe0, + 0x37, 0x76, 0x19, 0xb4, 0xba, 0x58, 0xad, 0x7e, 0xc1, 0x60, 0x86, 0x93, + 0x16, 0x4c, 0xfb, 0x40, 0x5f, 0x5f, 0x2f, 0x9b, 0x74, 0x32, 0xfe, 0x86, + 0x5d, 0xc6, 0xc7, 0xcf, 0x3b, 0x26, 0x1a, 0x49, 0xc8, 0xbb, 0x3a, 0xe9, + 0xfb, 0xe0, 0xfd, 0x9e, 0xfb, 0x10, 0x7d, 0x54, 0x00, 0x3c, 0x7f, 0xde, + 0x9e, 0x75, 0xab, 0x20, 0x32, 0x36, 0x72, 0x77, 0xb8, 0x20, 0xec, 0x6a, + 0x48, 0x78, 0x90, 0xee, 0x48, 0xc8, 0xe1, 0xca, 0x80, 0x23, 0x01, 0xfb, + 0x1d, 0xf7, 0x45, 0xa9, 0x27, 0x67, 0x8d, 0x46, 0x23, 0x6d, 0xc9, 0x46, + 0x5a, 0x25, 0x43, 0xa0, 0x54, 0x3d, 0x81, 0xd8, 0xe3, 0x31, 0x2b, 0x7c, + 0x3e, 0x7f, 0x75, 0x1a, 0xf2, 0x0e, 0xf2, 0x76, 0x93, 0x98, 0xa3, 0xdb, + 0xf5, 0xbe, 0x7e, 0xde, 0x35, 0xe8, 0x99, 0xfd, 0xaf, 0xd4, 0x8a, 0xf1, + 0xe3, 0x86, 0x70, 0x47, 0xec, 0x44, 0x78, 0x24, 0x26, 0x27, 0xd4, 0x2b, + 0x14, 0x72, 0x06, 0x93, 0x15, 0xfb, 0x81, 0x0a, 0x06, 0x1e, 0xff, 0x02, + 0x2d, 0x6d, 0xcd, 0xec, 0xd1, 0xb8, 0x98, 0xbb, 0xb8, 0xbf, 0x8b, 0xc8, + 0x71, 0xf2, 0xeb, 0x4e, 0x45, 0x67, 0x4a, 0x5d, 0xb9, 0x4b, 0xde, 0xe0, + 0x2e, 0x7d, 0x0b, 0xf1, 0x2e, 0xe2, 0x83, 0xbd, 0x7b, 0xf7, 0x7e, 0x8d, + 0x24, 0x56, 0xae, 0xb7, 0x5c, 0x63, 0xfa, 0x1f, 0xf6, 0x42, 0x43, 0x53, + 0x1d, 0x2a, 0x8f, 0x5a, 0x3a, 0xf0, 0xe5, 0x81, 0x40, 0xb2, 0x8f, 0x78, + 0x8f, 0x93, 0xdf, 0xc5, 0x9d, 0x77, 0xff, 0xab, 0xc1, 0xb4, 0xbe, 0xe5, + 0x9c, 0xd5, 0x88, 0x37, 0x11, 0x6f, 0x23, 0xde, 0x47, 0x7c, 0xb8, 0x6f, + 0x9f, 0x97, 0x0f, 0x66, 0x7b, 0x07, 0x36, 0xa3, 0xe5, 0xf0, 0xc8, 0x90, + 0x2e, 0x2f, 0xaf, 0x2f, 0x0e, 0x91, 0x75, 0x6e, 0xff, 0x1d, 0x4e, 0xde, + 0x83, 0x3b, 0xef, 0xb6, 0x29, 0x0f, 0x38, 0xf7, 0x0a, 0x25, 0xb5, 0x83, + 0xb3, 0xca, 0xc3, 0xd3, 0xd3, 0xd3, 0xae, 0xc8, 0x9d, 0x5b, 0x77, 0xb3, + 0x5b, 0xbb, 0x11, 0xfc, 0xff, 0xef, 0xf8, 0x77, 0xaf, 0x8d, 0xa3, 0xf6, + 0x91, 0xdf, 0xa3, 0x23, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, + 0xae, 0x42, 0x60, 0x82 +}; +unsigned int go_top_png_len = 1420; +unsigned char go_bottom_png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, + 0x08, 0x06, 0x00, 0x00, 0x00, 0x73, 0x7a, 0x7a, 0xf4, 0x00, 0x00, 0x05, + 0x92, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xdd, 0x56, 0x5b, 0x4c, 0xd3, + 0x57, 0x18, 0x47, 0xf1, 0x32, 0x17, 0x92, 0x85, 0x2c, 0xfa, 0xb0, 0xa7, + 0x6d, 0xc9, 0x1e, 0xe6, 0x16, 0x13, 0x1f, 0x4c, 0x76, 0x49, 0x16, 0x92, + 0xed, 0xc5, 0x07, 0x1e, 0xf6, 0x80, 0x8a, 0x57, 0x04, 0x44, 0x50, 0x41, + 0x11, 0x15, 0xaf, 0x88, 0xa8, 0x28, 0x4e, 0xb4, 0xa5, 0x17, 0xa0, 0x2d, + 0x50, 0x2e, 0x85, 0x52, 0x28, 0xa5, 0x76, 0x6d, 0x69, 0x0b, 0x45, 0x87, + 0xd3, 0x65, 0x5b, 0x96, 0x6c, 0x3a, 0xa2, 0xc8, 0x45, 0xa0, 0x2d, 0x6d, + 0x69, 0x69, 0xa1, 0x94, 0xdb, 0xe9, 0xff, 0xff, 0xed, 0x9c, 0x23, 0x7f, + 0xd3, 0x80, 0x43, 0x37, 0x95, 0x5d, 0xfe, 0xc9, 0x2f, 0xed, 0xb9, 0xfe, + 0x7e, 0xdf, 0x77, 0xce, 0xf9, 0xbe, 0x2f, 0x02, 0x00, 0xfe, 0x51, 0xfc, + 0x77, 0x05, 0xb4, 0xb6, 0x1a, 0x37, 0x58, 0xac, 0x2d, 0x4a, 0x73, 0x9b, + 0x31, 0x68, 0x69, 0x6f, 0xd1, 0x98, 0xcd, 0x86, 0xcf, 0x17, 0x47, 0x00, + 0x25, 0x37, 0xac, 0xed, 0xb8, 0x73, 0x6b, 0x72, 0xc4, 0xe7, 0x65, 0x43, + 0xa1, 0x10, 0x38, 0x86, 0xec, 0x6c, 0xfb, 0x77, 0x96, 0x09, 0x9d, 0x51, + 0x13, 0xb3, 0x28, 0x02, 0xcc, 0x56, 0xa3, 0xdc, 0xe3, 0x19, 0xa6, 0xe4, + 0xe3, 0xe3, 0x01, 0x70, 0xbb, 0x5d, 0xf0, 0xe0, 0x61, 0x27, 0xab, 0x33, + 0x68, 0xf4, 0x2f, 0x2b, 0x80, 0x73, 0xef, 0xa7, 0x66, 0xab, 0xbe, 0xc4, + 0xdc, 0x66, 0xb0, 0x63, 0x17, 0x4b, 0x89, 0xc5, 0xe1, 0xe3, 0xb8, 0xdf, + 0x1f, 0x08, 0x8c, 0x41, 0x30, 0x18, 0x00, 0x9f, 0xcf, 0x0b, 0xdd, 0x3d, + 0x5d, 0xf0, 0xa8, 0xe7, 0x21, 0x68, 0x6e, 0x34, 0x4c, 0xab, 0x54, 0xaa, + 0x48, 0x6e, 0x5e, 0x79, 0xb5, 0xe4, 0x33, 0x59, 0x45, 0x89, 0xa8, 0x54, + 0x2a, 0xb6, 0x89, 0x4b, 0x05, 0x0a, 0x7e, 0x31, 0xff, 0xe3, 0xe7, 0x0a, + 0x30, 0x9b, 0x75, 0x1f, 0x74, 0x7c, 0xdf, 0x1e, 0x72, 0x0c, 0xd9, 0x60, + 0x6a, 0x6a, 0x92, 0xb8, 0x17, 0x6e, 0xdf, 0xbd, 0xc9, 0x9a, 0xac, 0xc6, + 0x0c, 0x6e, 0x8e, 0xd1, 0xa4, 0x93, 0x77, 0x3e, 0xb8, 0xcf, 0x38, 0x1c, + 0x36, 0xe8, 0xee, 0xee, 0x82, 0xdf, 0xee, 0xfd, 0x0a, 0x3f, 0xfc, 0x74, + 0x9b, 0x6d, 0xd4, 0xd4, 0xeb, 0x9f, 0x92, 0xcb, 0x4b, 0x53, 0x94, 0xaa, + 0x1a, 0xb6, 0xef, 0x71, 0x1f, 0x4c, 0x4c, 0x4c, 0x40, 0x6f, 0x5f, 0x0f, + 0x94, 0xcb, 0xa5, 0x6c, 0x61, 0x61, 0xc1, 0x97, 0x0b, 0x0a, 0x30, 0xb5, + 0x19, 0x14, 0x84, 0x14, 0x21, 0x04, 0x33, 0x33, 0x33, 0xf4, 0x77, 0x72, + 0x72, 0x92, 0x88, 0x00, 0x93, 0xc5, 0x90, 0x46, 0xe6, 0x34, 0x1b, 0x9a, + 0xd7, 0xea, 0x8d, 0xda, 0x89, 0x3b, 0x77, 0x3b, 0x42, 0x3f, 0xff, 0xf2, + 0x23, 0x74, 0xdc, 0xb1, 0x32, 0x0d, 0x4d, 0xca, 0x60, 0x5d, 0x43, 0x35, + 0xbd, 0x03, 0xd2, 0x72, 0xf1, 0x6e, 0x45, 0x5d, 0x15, 0x3b, 0x86, 0xbd, + 0x14, 0xbe, 0xcf, 0xc3, 0xae, 0x07, 0x70, 0xf1, 0x72, 0x5e, 0xfd, 0x02, + 0x02, 0xa8, 0x7b, 0x07, 0x89, 0xe2, 0xe9, 0xe9, 0x69, 0xec, 0x81, 0x29, + 0x02, 0xfa, 0x7f, 0x7c, 0x7c, 0x1c, 0xda, 0x6e, 0x9a, 0x59, 0xad, 0xae, + 0x69, 0x0f, 0x99, 0xa7, 0xbe, 0xa1, 0xdc, 0xa0, 0x6e, 0x56, 0x29, 0x1b, + 0x31, 0xb1, 0x4a, 0xad, 0xd4, 0xd4, 0xd4, 0xcb, 0xe9, 0x2b, 0x28, 0x96, + 0x88, 0xb6, 0x55, 0xd6, 0x54, 0x30, 0x3e, 0xbf, 0x2f, 0x7c, 0x0f, 0x8a, + 0x60, 0x30, 0x08, 0xb9, 0x79, 0x67, 0x02, 0xb9, 0xb9, 0xb9, 0x4b, 0x17, + 0x12, 0x50, 0xfc, 0xc4, 0xfd, 0x53, 0xc4, 0x75, 0x1c, 0x68, 0x7b, 0x6c, + 0x6c, 0x0c, 0xf4, 0x2d, 0x5a, 0x56, 0xd9, 0x50, 0xbd, 0x7b, 0xee, 0xba, + 0x27, 0xe4, 0xc2, 0x4d, 0xe5, 0x72, 0x59, 0xc8, 0xeb, 0xf5, 0x3c, 0x73, + 0xfd, 0xfd, 0xdf, 0xef, 0xc1, 0xa9, 0xd3, 0xc7, 0x95, 0x0b, 0x7a, 0xc0, + 0x62, 0x31, 0xc6, 0xe0, 0x3b, 0x40, 0xc8, 0xa8, 0xe2, 0x40, 0x20, 0xc0, + 0x81, 0xb6, 0x7d, 0x3e, 0x1f, 0xa8, 0x35, 0x2a, 0xa6, 0xa2, 0x4a, 0xb6, + 0x23, 0x7c, 0x9d, 0xb0, 0x98, 0xff, 0xb5, 0xb4, 0xac, 0x04, 0xb9, 0xdc, + 0xae, 0x67, 0xae, 0x1b, 0x1d, 0x1d, 0x05, 0x9e, 0xe0, 0x3a, 0x64, 0x65, + 0x67, 0x7d, 0xf1, 0xdc, 0x57, 0x60, 0x68, 0xd1, 0x66, 0xb5, 0xdf, 0x6a, + 0x05, 0xff, 0xa8, 0x9f, 0x6c, 0x40, 0x16, 0x73, 0xa0, 0x47, 0x81, 0x9f, + 0x20, 0xd4, 0xd4, 0x55, 0x85, 0x4a, 0xa4, 0xa2, 0x78, 0x32, 0xbf, 0x48, + 0x74, 0x2d, 0x16, 0x5b, 0x3f, 0x33, 0xe4, 0x1c, 0x22, 0xe3, 0xe1, 0xf3, + 0xe9, 0x7a, 0xbf, 0xdf, 0x0f, 0x02, 0x21, 0x0f, 0xb2, 0x8e, 0x66, 0x9e, + 0x7f, 0xe1, 0x38, 0xa0, 0xd6, 0xd6, 0x9f, 0x30, 0x59, 0xf4, 0x58, 0x84, + 0x0f, 0x7b, 0x63, 0x14, 0x6f, 0xe2, 0x7b, 0x0a, 0xf2, 0x04, 0x89, 0xa5, + 0xb2, 0xf2, 0xd2, 0xd0, 0x75, 0xfe, 0xd5, 0x02, 0xa1, 0x98, 0x3f, 0x65, + 0xb7, 0x0f, 0x92, 0xfe, 0xf0, 0x79, 0x74, 0x1d, 0xb9, 0x0b, 0x42, 0x11, + 0x1f, 0x0e, 0x67, 0x65, 0x14, 0xfc, 0xe5, 0x40, 0xa4, 0xa8, 0xab, 0x3c, + 0xab, 0xd3, 0x37, 0x63, 0xb7, 0x8f, 0xd0, 0x0d, 0x47, 0x46, 0xbc, 0x1c, + 0xa8, 0x75, 0x76, 0xbb, 0x0d, 0x24, 0xb2, 0x62, 0x18, 0x18, 0xec, 0x27, + 0x64, 0xe1, 0xe3, 0x64, 0x3e, 0x5d, 0x27, 0xc0, 0xe4, 0x07, 0x0f, 0xa5, + 0x5f, 0xff, 0xdb, 0x91, 0x50, 0x5a, 0x51, 0x7a, 0x51, 0xdd, 0xdc, 0x80, + 0x37, 0xf5, 0xd0, 0x8d, 0x3d, 0x1e, 0x37, 0x07, 0x4c, 0x42, 0x85, 0x51, + 0x84, 0xf7, 0x73, 0x73, 0x85, 0x22, 0x1e, 0xa4, 0x67, 0xec, 0x17, 0xbe, + 0x74, 0x28, 0x16, 0x89, 0xf9, 0xdf, 0x28, 0x55, 0xb5, 0xe4, 0xec, 0x29, + 0x81, 0xcb, 0x35, 0xc4, 0x61, 0x5e, 0x7b, 0x78, 0xd8, 0x05, 0x5e, 0xef, + 0x30, 0x08, 0x30, 0xf9, 0xbe, 0x03, 0x7b, 0x25, 0x11, 0x11, 0x11, 0x4b, + 0x5e, 0x49, 0x2e, 0x28, 0xbc, 0x56, 0xc0, 0xaf, 0x56, 0xc8, 0x71, 0xdc, + 0x77, 0x52, 0x22, 0x1c, 0x05, 0xe7, 0xc1, 0xe9, 0x24, 0x02, 0xdc, 0x94, + 0x7c, 0x6f, 0xea, 0x9e, 0x0a, 0x42, 0xfe, 0x4a, 0x93, 0xd1, 0xf9, 0xfc, + 0x5c, 0x71, 0x99, 0x5c, 0x06, 0x4e, 0x2c, 0xc0, 0x8e, 0x09, 0xf1, 0xd9, + 0x73, 0x20, 0xf7, 0x01, 0xf7, 0x3b, 0xa1, 0x48, 0xc0, 0x83, 0xe4, 0xd4, + 0x24, 0x05, 0x17, 0x6c, 0x5e, 0xa9, 0x80, 0x08, 0x88, 0x58, 0x72, 0xea, + 0x74, 0xb6, 0xac, 0x54, 0x52, 0x4c, 0x72, 0x04, 0x25, 0xee, 0x7b, 0xdc, + 0x4b, 0x7f, 0x87, 0x9c, 0x0e, 0xfc, 0xd4, 0xf8, 0x90, 0xb4, 0x27, 0x41, + 0x15, 0x17, 0x17, 0x17, 0xf9, 0xda, 0xd2, 0x31, 0xb1, 0xec, 0xf0, 0xd1, + 0x43, 0x95, 0x22, 0xb1, 0x80, 0x5a, 0xdd, 0x3f, 0xd0, 0x8f, 0xdd, 0x6f, + 0x87, 0x22, 0x7c, 0xdb, 0x13, 0x12, 0x77, 0x69, 0x62, 0x62, 0x62, 0x96, + 0xbd, 0xf6, 0x7a, 0x80, 0x58, 0xb8, 0xef, 0x40, 0x6a, 0x2d, 0x4f, 0xc0, + 0xc3, 0xd6, 0x0f, 0xe0, 0x33, 0x2f, 0x82, 0x9d, 0xbb, 0x76, 0xe8, 0x70, + 0xff, 0x8a, 0x45, 0x2a, 0xc9, 0xa8, 0x27, 0x96, 0x25, 0x26, 0xed, 0x6a, + 0xcc, 0x38, 0xb4, 0x1f, 0xb6, 0xed, 0x8c, 0x6f, 0xd9, 0xb8, 0x71, 0xe3, + 0xca, 0x45, 0x2f, 0x4a, 0x53, 0x52, 0x52, 0x96, 0xc7, 0x6f, 0xdb, 0x9c, + 0x83, 0x2d, 0x5f, 0xf5, 0xff, 0xa9, 0x8a, 0xb5, 0x66, 0xed, 0x3b, 0xad, + 0x37, 0x4d, 0x65, 0x16, 0xab, 0x31, 0x88, 0x81, 0x4c, 0xad, 0x7a, 0x84, + 0x53, 0x30, 0xd2, 0x7e, 0xab, 0x46, 0x38, 0xff, 0xa3, 0xfa, 0xc6, 0x5a, + 0x54, 0x5b, 0x5f, 0x85, 0xaa, 0x14, 0x65, 0xa8, 0xac, 0x52, 0x82, 0x4a, + 0x65, 0x62, 0x24, 0x2a, 0x29, 0x42, 0x7c, 0xe1, 0x35, 0x54, 0xc8, 0xbb, + 0x82, 0x0a, 0xae, 0xe6, 0x23, 0x5c, 0x74, 0xa0, 0x73, 0x17, 0x72, 0x50, + 0x4e, 0xee, 0x69, 0x74, 0xf2, 0xcc, 0x71, 0x74, 0xec, 0xc4, 0x11, 0x74, + 0xe4, 0x58, 0xe6, 0xe4, 0x91, 0xec, 0xcc, 0xba, 0xb4, 0xb4, 0xc4, 0xf7, + 0x49, 0x7c, 0x98, 0x27, 0x80, 0x74, 0x62, 0x44, 0x9a, 0xad, 0x06, 0xb9, + 0xcb, 0xed, 0x64, 0xe0, 0x85, 0x3e, 0x16, 0x58, 0xf6, 0xcf, 0x11, 0xf6, + 0xd1, 0x76, 0x67, 0x67, 0x27, 0x9b, 0x94, 0xbc, 0xfb, 0x06, 0xe1, 0x21, + 0x7c, 0x73, 0x04, 0xd0, 0xce, 0x55, 0xb8, 0xb0, 0x1c, 0x25, 0x93, 0x11, + 0x42, 0xa4, 0x90, 0xe0, 0xd2, 0x31, 0x49, 0x2c, 0x24, 0xbe, 0x93, 0x50, + 0x4b, 0xdf, 0xbc, 0xcd, 0x36, 0x00, 0x8f, 0xfb, 0xfb, 0xa0, 0xa7, 0xb7, + 0x1b, 0x1e, 0x75, 0x77, 0x91, 0x5f, 0xdc, 0xee, 0x05, 0x9b, 0x7d, 0x80, + 0x8c, 0xd3, 0x88, 0xe8, 0xf5, 0x7a, 0x49, 0x2a, 0x26, 0xa0, 0xf5, 0x05, + 0xa9, 0xa2, 0xf1, 0x9d, 0x99, 0x5e, 0xbd, 0x7a, 0x75, 0x14, 0xe6, 0x5a, + 0x46, 0x44, 0x84, 0x5b, 0xbf, 0x02, 0xe3, 0x2d, 0x49, 0x99, 0xa8, 0x69, + 0xd0, 0x36, 0xc0, 0x32, 0x0c, 0x43, 0x05, 0x04, 0x83, 0xe3, 0xa4, 0xf4, + 0x9e, 0x4d, 0xc9, 0x23, 0xe0, 0x1d, 0xf1, 0x90, 0xcd, 0x69, 0xd4, 0x73, + 0x0c, 0x39, 0x28, 0x19, 0xf6, 0x18, 0x0c, 0x7b, 0xdc, 0x5c, 0x16, 0x24, + 0x64, 0xa4, 0x2e, 0x20, 0x85, 0x08, 0x07, 0x9a, 0x96, 0x9b, 0x9a, 0xd4, + 0xec, 0xd6, 0x1d, 0xf1, 0x56, 0xc2, 0x83, 0xb1, 0x72, 0xae, 0x80, 0xe5, + 0x64, 0x20, 0x36, 0x36, 0xf6, 0x93, 0xfc, 0xcb, 0xe7, 0xdb, 0xaf, 0x14, + 0x5e, 0x42, 0x97, 0xae, 0x5c, 0x64, 0x2e, 0xe4, 0xe7, 0x31, 0xe7, 0xf2, + 0x72, 0x98, 0x33, 0x67, 0x4f, 0x32, 0x27, 0x4e, 0x1d, 0x63, 0x8e, 0x66, + 0x1f, 0x66, 0x32, 0xb3, 0x32, 0x98, 0xf4, 0x83, 0xfb, 0x98, 0xb4, 0xfd, + 0x29, 0x4c, 0x4a, 0x6a, 0x32, 0x93, 0x98, 0x9c, 0xc0, 0xec, 0x4c, 0xd8, + 0xce, 0x6c, 0xdd, 0xbe, 0x85, 0xc1, 0x16, 0x3e, 0x13, 0x5b, 0xb6, 0x6e, + 0x0a, 0x6d, 0xde, 0x12, 0x77, 0x77, 0xfd, 0xfa, 0xf5, 0x5f, 0xcd, 0x0a, + 0x58, 0x41, 0x78, 0xe7, 0x1e, 0xc1, 0x1b, 0x18, 0xd1, 0x18, 0xef, 0x46, + 0x45, 0x45, 0x7d, 0xb8, 0x66, 0xcd, 0x9a, 0x75, 0x4f, 0x10, 0xbd, 0x2e, + 0x3a, 0xfa, 0xe5, 0x80, 0xf7, 0xfb, 0x08, 0xef, 0xfb, 0x1e, 0xc6, 0xdb, + 0xb3, 0x3c, 0x91, 0xf3, 0x5e, 0x01, 0xfe, 0x96, 0x86, 0x09, 0x79, 0xf3, + 0x35, 0x60, 0xe5, 0xac, 0xa7, 0x97, 0xfe, 0x6b, 0xe2, 0xc0, 0x1f, 0xd7, + 0x40, 0x5c, 0xba, 0xa6, 0xc9, 0x79, 0x83, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 +}; +unsigned int go_bottom_png_len = 1483; diff --git a/src/main.cpp b/src/main.cpp index b2658cd..cdf92c1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -288,6 +288,16 @@ void cb_page_down(Fl_Button*, void*) { view->take_focus(); } +void cb_page_top(Fl_Button*, void*) { + view->page_top(); + view->take_focus(); +} + +void cb_page_bottom(Fl_Button*, void*) { + view->page_bottom(); + view->take_focus(); +} + void cb_Zoomin(Fl_Button*, void*) { file->zoom *= 1.2f; applyzoom(file->zoom); @@ -491,18 +501,33 @@ int main(int argc, char **argv) { { Fl_Pack* page_moves = new Fl_Pack(0, pos += 24, 64, 42); page_moves->type(Fl_Pack::HORIZONTAL); { Fl_Button* o = new Fl_Button(0, 0, 32, 42); + o->tooltip(_("First Page")); + o->callback((Fl_Callback*)cb_page_top); + o->image(new Fl_PNG_Image("pagetop.png", img(go_top_png))); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(32, 0, 32, 42); o->tooltip(_("Page Up")); o->callback((Fl_Callback*)cb_page_up); o->image(new Fl_PNG_Image("pageup.png", img(go_up_png))); } // Fl_Button* o + page_moves->end(); + page_moves->show(); + } // Fl_Pack* page_moves + { Fl_Pack* page_moves2 = new Fl_Pack(0, pos += 42, 64, 42); + page_moves2->type(Fl_Pack::HORIZONTAL); + { Fl_Button* o = new Fl_Button(0, 0, 32, 42); + o->tooltip(_("Last Page")); + o->callback((Fl_Callback*)cb_page_bottom); + o->image(new Fl_PNG_Image("pagebottom.png", img(go_bottom_png))); + } // Fl_Button* o { Fl_Button* o = new Fl_Button(32, 0, 32, 42); o->tooltip(_("Page Down")); o->callback((Fl_Callback*)cb_page_down); o->image(new Fl_PNG_Image("pagedown.png", img(go_down_png))); } // Fl_Button* o - page_moves->end(); - page_moves->show(); - } // Fl_Pack* page_moves + page_moves2->end(); + page_moves2->show(); + } // Fl_Pack* page_moves2 { fullscreenbtn = new Fl_Button(0, pos += 42, 64, 38); fullscreenbtn->image(fullscreen_image); fullscreenbtn->callback((Fl_Callback*)cb_fullscreen); @@ -548,22 +573,9 @@ int main(int argc, char **argv) { showbtn->callback(cb_hide); } { view = new pdfview(64, 0, 700-64, 700); - view->type(Fl_Scroll::BOTH); - view->box(FL_DOWN_FRAME); - view->end(); view->show(); } - // { v = new Fl_Scroll(64, 0, 700-64, 700); - // v->type(Fl_Scroll::BOTH); - // v->box(FL_DOWN_FRAME); - // { view = new pdfview(0, 0, 700-64, 700); - // Fl_Scroll::current()->resizable(view); - // } - // v->end(); - // v->show(); - // } - Fl_Group::current()->resizable(view); win_pack->end(); win_pack->show(); diff --git a/src/main.h b/src/main.h index 4d55a60..7562c53 100644 --- a/src/main.h +++ b/src/main.h @@ -33,7 +33,6 @@ along with this program. If not, see . #include #include #include -#include #include #include #include diff --git a/src/view.cpp b/src/view.cpp index 6bb62c8..5c4b1e5 100644 --- a/src/view.cpp +++ b/src/view.cpp @@ -21,7 +21,7 @@ along with this program. If not, see . #define MARGIN 36 #define MARGINHALF 18 -pdfview::pdfview(int x, int y, int w, int h): Fl_Scroll(x, y, w, h), +pdfview::pdfview(int x, int y, int w, int h): Fl_Widget(x, y, w, h), yoff(0), xoff(0), selx(0), sely(0), selx2(0), sely2(0), columns(1) { @@ -41,65 +41,12 @@ void pdfview::resetselection() { } void pdfview::compute_screen_size() { - // This will be changed once I understand Fl_Scroll... screen_x = x(); screen_y = y(); - //bbox(screen_x, screen_y, screen_width, screen_height); - //if (!hscrollbar.visible()) - screen_height = h(); - //if (!scrollbar.visible()) - screen_width = w(); + screen_height = h(); + screen_width = w(); } -void pdfview::adjust_scrollbar_parameters() const { - - s32 tmp; - - float length = maxyoff(); - tmp = length; - length = (length - tmp) + (tmp / columns); - - - float relpos = yoff; - tmp = relpos; - relpos = (relpos - tmp) + (tmp / columns); - - debug(debug6, 50000 * relpos / length, "Scrollbar position"); - debug(debug7, 50000 / length, "Size"); - - //vertical_scrollbar->value(50000 * relpos / length, 50000 / length, 0, 50000); -} - -// From the document position, update scrollbar position. -void pdfview::update_scrollbars() const { - - s32 tmp; - - float length = maxyoff(); - tmp = length; - length = (length - tmp) + (tmp / columns); - - float relpos = yoff; - tmp = relpos; - relpos = (relpos - tmp) + (tmp / columns); - - debug(debug1, relpos, "relpos"); - debug(debug2, length, "length"); - debug(debug3, 50000 * relpos / length, "scrollbar position"); - - //vertical_scrollbar->value(50000 * relpos / length); -} - -// From the scrollbar position, update position in the document. -void pdfview::update_position(const int vscroll_pos) { - return; - float frac = yoff - floorf(yoff); - if (file != NULL && file->pages > 0) { - yoff = (((float)(vscroll_pos)) / 50000) * file->pages + (frac * columns); - adjust_yoff(0); - redraw(); - } -} void pdfview::go(const u32 page) { yoff = page; @@ -111,9 +58,6 @@ void pdfview::go(const u32 page) { void pdfview::set_columns(int count) { if ((count >= 1) && (count <= 5)) { columns = count; - if (file && file->pages > 0) { - adjust_scrollbar_parameters(); - } redraw(); } } @@ -139,8 +83,6 @@ void pdfview::reset() { for (i = 0; i < CACHE_MAX; i++) { cachedpage[i] = USHRT_MAX; } - - adjust_scrollbar_parameters(); } u32 pdfview::pageh(u32 page) const { @@ -288,7 +230,6 @@ void pdfview::update_visible(const bool fromdraw) const { // - file->first_visible // - file->last_visible // - pagebox->value - // - scrollbars update // // This method as been extensively modified to take into account multicolumns // and the fact that no page will be expected to be of the same size as the others, @@ -327,7 +268,6 @@ void pdfview::update_visible(const bool fromdraw) const { if (!fromdraw) pagebox->redraw(); - update_scrollbars(); Fl::check(); } } @@ -617,6 +557,16 @@ void pdfview::page_down() { redraw(); } +void pdfview::page_top() { + yoff = 0.0f; + redraw(); +} + +void pdfview::page_bottom() { + yoff = maxyoff(); + redraw(); +} + int pdfview::handle(int e) { if (!file->cache) @@ -686,16 +636,8 @@ int pdfview::handle(int e) { xoff = -maxchg; if (xoff > maxchg) xoff = maxchg; - // debug(debug5, maxchg, "maxchg"); } - // debug(debug1, zoom, "zoom"); - // debug(debug2, line_width, "Line Width"); - // debug(debug3, movedx, "movedx"); - // debug(debug4, movedy, "movedy"); - // debug(debug6, xoff, " xoff "); - // debug(debug7, yoff, " yoff "); - lasty = my; lastx = mx; } @@ -730,7 +672,7 @@ int pdfview::handle(int e) { s32 shp = sh = pxrel(page); if (page >= columns) shp = pxrel(page - columns); - if ((screen_height + (file->zoom * 2 * MARGIN)) >= sh) { + if (screen_height >= sh) { /* scroll up like Page_Up */ if (floorf(yoff) >= yoff) adjust_floor_yoff(-1.0f); @@ -739,7 +681,7 @@ int pdfview::handle(int e) { } else { /* scroll up less than one page height */ - float d = (screen_height - MARGIN) / (float) sh; + float d = (screen_height - 2 * MARGIN) / (float) sh; if (((u32) yoff) != ((u32) (yoff - d))) { /* scrolling over page border */ d -= (yoff - floorf(yoff)); @@ -748,6 +690,7 @@ int pdfview::handle(int e) { d = d * (float) sh / (float) shp; } adjust_yoff(-d); + debug(debug1, d, "delta up"); } } redraw(); @@ -763,13 +706,13 @@ int pdfview::handle(int e) { s32 shn = sh = pxrel(page); if (page + columns <= (s32)(file->pages - 1)) shn = pxrel(page + columns); - if (screen_height + 2 * MARGIN * file->zoom >= sh) { + if (screen_height >= sh) { /* scroll down like Page_Down */ adjust_floor_yoff(1.0f); } else { /* scroll down less than one page height */ - float d = (screen_height - MARGIN) / (float) sh; + float d = (screen_height - 2 * MARGIN) / (float) sh; if (((u32) yoff) != ((u32) (yoff + d))) { /* scrolling over page border */ d -= (ceilf(yoff) - yoff); @@ -777,7 +720,12 @@ int pdfview::handle(int e) { /* ratio of next page can be different */ d = d * (float) sh / (float) shn; } + debug(debug2, d, "delta down" ); + debug(debug4, yoff, "yoff before"); + adjust_yoff(d); + + debug(debug5, yoff, "yoff after" ); } } redraw(); diff --git a/src/view.h b/src/view.h index d86dcd3..1c61e5e 100644 --- a/src/view.h +++ b/src/view.h @@ -21,7 +21,7 @@ along with this program. If not, see . #define CACHE_MAX 15 -class pdfview: public Fl_Scroll { +class pdfview: public Fl_Widget { public: pdfview(int x, int y, int w, int h); void draw(); @@ -31,19 +31,18 @@ class pdfview: public Fl_Scroll { void reset(); void resetselection(); void set_columns(int count); - void update_position(const int vscroll_pos); inline float get_xoff() { return xoff; }; inline float get_yoff() { return yoff; }; inline int get_columns() { return columns; }; void set_params(int columns_count, float x, float y); void page_up(); void page_down(); + void page_top(); + void page_bottom(); private: void compute_screen_size(); float line_zoom_factor(u32 first_page, u32 &width,u32 &height) const; void update_visible(const bool fromdraw) const; - void update_scrollbars() const; - void adjust_scrollbar_parameters() const; u8 iscached(const u32 page) const; void docache(const u32 page); float maxyoff() const; From 723b2d09e064d16a03b66050528ec9fcee47016e Mon Sep 17 00:00:00 2001 From: Guy Turcotte Date: Fri, 4 Nov 2016 08:22:15 -0400 Subject: [PATCH 15/21] Adjusted screenshot image --- README.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.asciidoc b/README.asciidoc index 02da80d..5640d54 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -40,7 +40,7 @@ FlaxPDF 57% (5% *) 36.5 MB 45 KB FlaxPDF, as the only one of the three, is able to take advantage of the GPU, dropping its CPU use when scrolling to 5% (tested on radeon). -image::sunset.jpg[] +image::screenshot.png[] New capabilities / modifications added (November 2016) ------------------------------------------------------ From 2fb054745eb4f434a25e8fd705f7621a64d4a182 Mon Sep 17 00:00:00 2001 From: Guy Turcotte Date: Fri, 4 Nov 2016 08:27:12 -0400 Subject: [PATCH 16/21] Adjusted screenshot --- README.asciidoc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.asciidoc b/README.asciidoc index 5640d54..2e2f58c 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -40,7 +40,7 @@ FlaxPDF 57% (5% *) 36.5 MB 45 KB FlaxPDF, as the only one of the three, is able to take advantage of the GPU, dropping its CPU use when scrolling to 5% (tested on radeon). -image::screenshot.png[] +image::screenshot.png[Screenshot,350,350,align="center"] New capabilities / modifications added (November 2016) ------------------------------------------------------ @@ -53,7 +53,6 @@ The following modifications have been made - Fullscreen mode - PageUp and PageDown buttons - Exit button -- Scrollbars - Gnome standard icons Installation From 2fe666e650943dfbbbea8f6988bea690412e5187 Mon Sep 17 00:00:00 2001 From: Guy Turcotte Date: Fri, 4 Nov 2016 08:37:59 -0400 Subject: [PATCH 17/21] Adjusted for special characters --- README.asciidoc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.asciidoc b/README.asciidoc index 2e2f58c..23a3861 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -22,7 +22,7 @@ those two itches scratched? Requirements ------------ -Poppler, LZO, libconfig++-dev, and FLTK 1.3. +Poppler, LZO, Config\+\+, and FLTK 1.3. Comparison ---------- @@ -64,9 +64,10 @@ available as a package: - poppler (http://poppler.freedesktop.org/poppler-0.48.0.tar.xz) - fltk 1.3.3 (http://www.fltk.org/software.php?VERSION=1.3.3&FILE=fltk/1.3.3/fltk-1.3.3-source.tar.gz) -The following packages are available via apt-get under linux: +The following packages are usually available via package management under linux (command +examples in parenthesis for the apt-get package management tool): -- libconfig++ ("$ sudo apt-get install libconfig++-dev") +- libconfig\+\+ ("$ sudo apt-get install libconfig\+\+-dev") - libjpeg ("$ sudo apt-get install libjpeg-dev") - libpng ("$ sudo apt-get install libpng-dev") - libtiff ("$ sudi apt-get install libtiff-dev") From a1188cd160e49c942194db7732fe4b62423f9613 Mon Sep 17 00:00:00 2001 From: Guy Turcotte Date: Fri, 4 Nov 2016 08:45:34 -0400 Subject: [PATCH 18/21] Adjusted for special characters --- README.asciidoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.asciidoc b/README.asciidoc index 23a3861..980cde4 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -22,7 +22,7 @@ those two itches scratched? Requirements ------------ -Poppler, LZO, Config\+\+, and FLTK 1.3. +Poppler, LZO, Config{plus}{plus}, and FLTK 1.3. Comparison ---------- @@ -67,7 +67,7 @@ available as a package: The following packages are usually available via package management under linux (command examples in parenthesis for the apt-get package management tool): -- libconfig\+\+ ("$ sudo apt-get install libconfig\+\+-dev") +- libconfig{plus}{plus} ("$ sudo apt-get install libconfig{plus}{plus}-dev") - libjpeg ("$ sudo apt-get install libjpeg-dev") - libpng ("$ sudo apt-get install libpng-dev") - libtiff ("$ sudi apt-get install libtiff-dev") From e9bba5665ce8c9338147a6a93ed3f6163e7f95a2 Mon Sep 17 00:00:00 2001 From: Guy Turcotte Date: Fri, 4 Nov 2016 10:19:13 -0400 Subject: [PATCH 19/21] Minor changes --- README.asciidoc | 2 +- src/main.cpp | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/README.asciidoc b/README.asciidoc index 980cde4..bc8faff 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -77,7 +77,7 @@ Poppler To properly build poppler, some libraries are required to be installed. That's the case for libjpeg, libpng and libtiff to manage embedded images in PDFs. Other libraries are required -and are often already installed. Here is a page to get some more informations about the dependencies: +and are often already installed. Here is a page to get some more information about dependencies: http://www.linuxfromscratch.org/blfs/view/svn/general/poppler.html diff --git a/src/main.cpp b/src/main.cpp index cdf92c1..bf76f61 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -89,7 +89,6 @@ void debug(Fl_Box * ctrl, const float value, const char * hint) { ctrl->copy_label(tmp); ctrl->tooltip(hint); ctrl->redraw_label(); - Fl::check(); } void debug(Fl_Box * ctrl, const u32 value, const char * hint) { From 52a8c2c516052c1b71bd6db4d9afa33af4f5011f Mon Sep 17 00:00:00 2001 From: Guy Turcotte Date: Sat, 5 Nov 2016 21:39:13 -0400 Subject: [PATCH 20/21] Text selection now functional --- README.asciidoc | 4 +- TODO.txt | 4 +- src/main.cpp | 8 +- src/view.cpp | 241 ++++++++++++++++++++++++++---------------------- src/view.h | 22 ++++- 5 files changed, 158 insertions(+), 121 deletions(-) diff --git a/README.asciidoc b/README.asciidoc index bc8faff..5d8e866 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -40,8 +40,6 @@ FlaxPDF 57% (5% *) 36.5 MB 45 KB FlaxPDF, as the only one of the three, is able to take advantage of the GPU, dropping its CPU use when scrolling to 5% (tested on radeon). -image::screenshot.png[Screenshot,350,350,align="center"] - New capabilities / modifications added (November 2016) ------------------------------------------------------ @@ -55,6 +53,8 @@ The following modifications have been made - Exit button - Gnome standard icons +image::screenshot.png[Screenshot,350,350,align="center"] + Installation ============ diff --git a/TODO.txt b/TODO.txt index 219b4a9..b3e9245 100644 --- a/TODO.txt +++ b/TODO.txt @@ -8,9 +8,7 @@ TODO - [DONE] Dimensions functions to be revised for discripencies in the Width / High computations - [DONE] Bug with load of a new file when the current file is still being processed -> crash - [DONE] When changing document, save the previous document parameters - -- Text selection tool not revised yet - +- [DONE] Text selection - Other features diff --git a/src/main.cpp b/src/main.cpp index bf76f61..ed11c36 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -170,7 +170,7 @@ static void applyzoom(const float what) { display_zoom(what); view->take_focus(); - view->resetselection(); + view->reset_selection(); view->redraw(); } @@ -362,7 +362,7 @@ static void checkX() { } static void selecting_changed(Fl_Widget *, void *) { - view->resetselection(); + view->reset_selection(); view->redraw(); } @@ -500,7 +500,7 @@ int main(int argc, char **argv) { { Fl_Pack* page_moves = new Fl_Pack(0, pos += 24, 64, 42); page_moves->type(Fl_Pack::HORIZONTAL); { Fl_Button* o = new Fl_Button(0, 0, 32, 42); - o->tooltip(_("First Page")); + o->tooltip(_("Beginning of Document")); o->callback((Fl_Callback*)cb_page_top); o->image(new Fl_PNG_Image("pagetop.png", img(go_top_png))); } // Fl_Button* o @@ -515,7 +515,7 @@ int main(int argc, char **argv) { { Fl_Pack* page_moves2 = new Fl_Pack(0, pos += 42, 64, 42); page_moves2->type(Fl_Pack::HORIZONTAL); { Fl_Button* o = new Fl_Button(0, 0, 32, 42); - o->tooltip(_("Last Page")); + o->tooltip(_("End of Document")); o->callback((Fl_Callback*)cb_page_bottom); o->image(new Fl_PNG_Image("pagebottom.png", img(go_bottom_png))); } // Fl_Button* o diff --git a/src/view.cpp b/src/view.cpp index 5c4b1e5..a74ec35 100644 --- a/src/view.cpp +++ b/src/view.cpp @@ -14,6 +14,13 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ +/* +The pdfview class has been modified extensively to allow for multiple +columns visualization of a document. You can think of this view as a +matrix of pages, each line of this matrix composed of as many columns +as required by the user. +*/ + #include "view.h" #include @@ -36,7 +43,7 @@ pdfview::pdfview(int x, int y, int w, int h): Fl_Widget(x, y, w, h), } } -void pdfview::resetselection() { +void pdfview::reset_selection() { selx = sely = selx2 = sely2 = 0; } @@ -51,7 +58,7 @@ void pdfview::compute_screen_size() { void pdfview::go(const u32 page) { yoff = page; adjust_yoff(0); - resetselection(); + reset_selection(); redraw(); } @@ -77,7 +84,7 @@ void pdfview::reset() { adjust_yoff(0); - resetselection(); + reset_selection(); u32 i; for (i = 0; i < CACHE_MAX; i++) { @@ -103,7 +110,7 @@ u32 pdfview::pagew(u32 page) const { return file->cache[page].w; else return file->cache[page].w + - file->cache[page].left + + file->cache[page].left + file->cache[page].right; } return 0; @@ -192,7 +199,6 @@ float pdfview::line_zoom_factor(const u32 first_page, u32 &width, u32 &height) c const u32 line_width = fullw(first_page); const u32 line_height = fullh(first_page); - float zoom_factor; switch (file->mode) { @@ -321,6 +327,9 @@ void pdfview::draw() { const float invisibleY = yoff - floorf(yoff); + page_pos_struct *pp = page_pos_on_screen; + page_pos_count = 0; + u32 page = file->first_visible; // Do the following for each line of pages @@ -343,7 +352,7 @@ void pdfview::draw() { X = screen_x + screen_width / 2 - zoom * line_width / 2 + (zoom * xoff * line_width); - // Do the following for each page in line + // Do the following for each page in the line s32 column = 0; page = first_page_in_line; @@ -361,16 +370,27 @@ void pdfview::draw() { const bool margins = hasmargins(page); const bool trimmed = margins && (file->mode == Z_TRIM || file->mode == Z_PGTRIM); + + float ratio_x = 1.0f; + float ratio_y = 1.0f; + if (trimmed) { // If the page was trimmed, have the real one a bit smaller X += zoomedmarginhalf; Y += zoomedmarginhalf; W -= zoomedmargin; H -= zoomedmargin; - } else if (margins) { + + // These changes in size have an impact on the zoom factor + // previously used. We need to keep track of these changes + // to help into the text selection process. + ratio_x = W / (float)(W + zoomedmargin); + ratio_y = H / (float)(H + zoomedmargin); + } + else if (margins) { // Restore the full size with empty borders X += cur->left * zoom; - Y += cur->top * zoom; + Y += cur->top * zoom; W -= (cur->left + cur->right) * zoom; H -= (cur->top + cur->bottom) * zoom; } @@ -378,6 +398,30 @@ void pdfview::draw() { // Render real content content(page, X, Y, W, H); + // For each displayed page, we keep those parameters + // to permit the localization of the page on screen when + // a selection is made to retrieve the text underneath + if (page_pos_count < PAGES_ON_SCREEN_MAX) { + + pp->page = page; + pp->X0 = Xs; + pp->Y0 = Ys; + pp->X = X; + pp->Y = Y; + pp->W = W; + pp->H = H; + pp->zoom = zoom; + pp->ratio_x = ratio_x; + pp->ratio_y = ratio_y; + + if (page_pos_count == 0) + printf("Copy X0:%d Y0:%d X:%d Y:%d W:%d H:%d Zoom: %6.3f page: %d\n", + pp->X0, pp->Y0, pp->X, pp->Y, pp->W, pp->H, pp->zoom, pp->page + 1); + + page_pos_count++; + pp++; + } + // And undo. X = Xs; Y = Ys; @@ -408,10 +452,10 @@ void pdfview::draw() { float pdfview::maxyoff() const { float zoom, f; - u32 line_width, line_height, h; + u32 line_width, line_height, h; s32 last = file->pages - 1; - last -= (last % columns); + last -= (last % columns); if (!file->cache[last].ready) f = last + 0.5f; @@ -420,7 +464,7 @@ float pdfview::maxyoff() const { while (true) { zoom = line_zoom_factor(last, line_width, line_height); - H -= (h = zoom * (line_height + MARGINHALF)); + H -= (h = zoom * (line_height + MARGINHALF)); if (H <= 0) { H += (MARGINHALF * zoom); @@ -438,28 +482,11 @@ float pdfview::maxyoff() const { return f; } -void pdfview::end_of_selection() { - - const u32 zoomedmargin = MARGIN * file->zoom; - const u32 zoomedmarginhalf = zoomedmargin / 2; - - // Which page is selx,sely on? - u32 page = yoff; - const float floored = yoff - floorf(yoff); - const float visible = 1 - floored; - u32 zoomedh = fullh(page) * visible * file->zoom; - const u32 ratiominus = hasmargins(page) ? zoomedmargin : 0; - const float ratio = screen_width / (float) fullw(page); - const float ratiox = (screen_width - ratiominus) / (float) fullw(page); - if (file->mode != Z_CUSTOM && file->mode != Z_PAGE && file->mode != Z_PGTRIM) { - zoomedh = fullh(page) * visible * ratio; - } +#include - if (y() + zoomedh < sely) - page++; +void pdfview::end_of_selection() { - // We assume nobody selects text with a tiny zoom. - u32 X, Y, W, H; + s32 X, Y, W, H; if (selx < selx2) { X = selx; W = selx2 - X; @@ -478,67 +505,68 @@ void pdfview::end_of_selection() { H = sely - Y; } - // Convert to widget coords - X -= screen_x; - Y -= screen_y; - - // Offset - switch (file->mode) { - case Z_TRIM: - case Z_PGTRIM: - // X and Y start in widget space, 0 to w/h. - Y += floored * (fullh(page) * ratiox + zoomedmargin + ratiominus); - Y -= zoomedmarginhalf; // Grey margin - - if (hasmargins(page)) { - X -= zoomedmarginhalf; - Y -= zoomedmarginhalf; - } - - // Now page's area. + // Search for the page caracteristics saved before with + // the draw method. + u32 idx = 0; + page_pos_struct *pp = page_pos_on_screen; - X += file->cache[page].left * ratiox; - Y += file->cache[page].top * ratiox; - - X /= ratiox; - Y /= ratiox; - W /= ratiox; - H /= ratiox; - break; - - case Z_WIDTH: - // X and Y start in widget space, 0 to w/h. - Y += floored * (fullh(page) * ratio + zoomedmargin); - Y -= zoomedmarginhalf; // Grey margin - - X /= ratio; - Y /= ratio; - W /= ratio; - H /= ratio; + while (idx < page_pos_count) { + if ((X >= pp->X0) && + (Y >= pp->Y0) && + (X < (pp->X + pp->W)) && + (Y < (pp->Y + pp->H))) break; - - case Z_PAGE: - case Z_CUSTOM: - // X and Y start in widget space, 0 to w/h. - Y += floored * (fullh(page) * file->zoom + zoomedmargin); - Y -= zoomedmarginhalf; // Grey margin + idx++; + pp++; + } + if (idx >= page_pos_count) + return; // Not found + + // Adjust the selection rectangle to be inside the real page data + if ((X + W) > (pp->X + pp->W)) + W = pp->X + pp->W - X; + if ((Y + H) > (pp->Y + pp->H)) + H = pp->Y + pp->H - Y; + if (((X + W) < pp->X) || + ((Y + H) < pp->Y)) + return; // Out of the printed area + if (X < pp->X) { + W -= (pp->X - X); + X = pp->X; + } + if (Y < pp->Y) { + H -= (pp->Y - Y); + Y = pp->Y; + } - X -= (screen_width - (fullw(page) * file->zoom)) / 2 + xoff * (fullw(page) * file->zoom); + // Convert to page coords + if (file->mode == Z_TRIM || file->mode == Z_PGTRIM) { + X = X - pp->X0 + (pp->zoom * file->cache[pp->page].left); + Y = Y - pp->Y0 + (pp->zoom * file->cache[pp->page].top ) ; - X /= file->zoom; - Y /= file->zoom; - W /= file->zoom; - H /= file->zoom; - break; - } // switch (file->mode) + if (hasmargins(pp->page)) { + X -= (pp->X - pp->X0); + Y -= (pp->Y - pp->Y0); + } + } + else { + X -= pp->X0; + Y -= pp->Y0; + } + + // Convert to original page resolution + X /= (pp->zoom * pp->ratio_x); + Y /= (pp->zoom * pp->ratio_y); + W /= (pp->zoom * pp->ratio_x); + H /= (pp->zoom * pp->ratio_y); TextOutputDev * const dev = new TextOutputDev(NULL, true, 0, false, false); - file->pdf->displayPage(dev, page + 1, 144, 144, 0, true, false, false); + file->pdf->displayPage(dev, pp->page + 1, 144, 144, 0, true, false, false); GooString *str = dev->getText(X, Y, X + W, Y + H); const char * const cstr = str->getCString(); // Put it to clipboard - Fl::copy(cstr, strlen(cstr)); + Fl::copy(cstr, strlen(cstr), 1); delete str; delete dev; @@ -595,7 +623,7 @@ int pdfview::handle(int e) { lasty = Fl::event_y(); lastx = Fl::event_x(); - resetselection(); + reset_selection(); if (selecting->value() && Fl::event_button() == FL_LEFT_MOUSE) { selx = lastx; sely = lasty; @@ -624,6 +652,7 @@ int pdfview::handle(int e) { fl_cursor(FL_CURSOR_MOVE); + // I don't understand this... if (file->maxh) adjust_yoff(-((movedy / zoom) / file->maxh)); else @@ -645,27 +674,25 @@ int pdfview::handle(int e) { break; case FL_MOUSEWHEEL: - if (Fl::event_ctrl()) { + if (Fl::event_ctrl()) if (Fl::event_dy() > 0) cb_Zoomout(NULL, NULL); else cb_Zoomin(NULL, NULL); - } else adjust_yoff(move * Fl::event_dy()); - resetselection(); + reset_selection(); redraw(); break; case FL_KEYDOWN: case FL_SHORTCUT: - resetselection(); + reset_selection(); switch (Fl::event_key()) { case 'k': - if (Fl::event_ctrl()) { + if (Fl::event_ctrl()) yoff = 0; - } else { const s32 page = yoff; s32 sh; @@ -680,52 +707,44 @@ int pdfview::handle(int e) { adjust_floor_yoff(0.0f); } else { - /* scroll up less than one page height */ + /* scroll up a bit less than one screen height */ float d = (screen_height - 2 * MARGIN) / (float) sh; if (((u32) yoff) != ((u32) (yoff - d))) { - /* scrolling over page border */ - d -= (yoff - floorf(yoff)); - yoff = floorf(yoff); - /* ratio of prev page can be different */ - d = d * (float) sh / (float) shp; + /* scrolling over page border */ + d -= (yoff - floorf(yoff)); + yoff = floorf(yoff); + /* ratio of prev page can be different */ + d = d * (float) sh / (float) shp; } adjust_yoff(-d); - debug(debug1, d, "delta up"); } } redraw(); break; case 'j': - if (Fl::event_ctrl()) { + if (Fl::event_ctrl()) yoff = maxyoff(); - } else { const s32 page = yoff; s32 sh; s32 shn = sh = pxrel(page); if (page + columns <= (s32)(file->pages - 1)) shn = pxrel(page + columns); - if (screen_height >= sh) { + if (screen_height >= sh) /* scroll down like Page_Down */ adjust_floor_yoff(1.0f); - } else { - /* scroll down less than one page height */ + /* scroll down a bit less than one screen height */ float d = (screen_height - 2 * MARGIN) / (float) sh; if (((u32) yoff) != ((u32) (yoff + d))) { - /* scrolling over page border */ - d -= (ceilf(yoff) - yoff); - yoff = ceilf(yoff); - /* ratio of next page can be different */ - d = d * (float) sh / (float) shn; + /* scrolling over page border */ + d -= (ceilf(yoff) - yoff); + yoff = floorf(yoff) + columns; + /* ratio of next page can be different */ + d = d * (float) sh / (float) shn; } - debug(debug2, d, "delta down" ); - debug(debug4, yoff, "yoff before"); - adjust_yoff(d); - - debug(debug5, yoff, "yoff after" ); } } redraw(); diff --git a/src/view.h b/src/view.h index 1c61e5e..e45c983 100644 --- a/src/view.h +++ b/src/view.h @@ -14,12 +14,29 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ +/* +The pdfview class has been modified extensively to allow for multiple +columns visualization of a document. You can think of this view as a +matrix of pages, each line of this matrix composed of as many columns +as required by the user. +*/ + #ifndef VIEW_H #define VIEW_H #include "main.h" #define CACHE_MAX 15 +#define PAGES_ON_SCREEN_MAX 50 + +// Used to keep drawing postion of displayed pages to +// help in the identification of the selection zone. +// Used by the end_of_selection method. +struct page_pos_struct { + float zoom, ratio_x, ratio_y; + u32 page; + int X0, Y0, X, Y, W, H; +}; class pdfview: public Fl_Widget { public: @@ -29,7 +46,7 @@ class pdfview: public Fl_Widget { void go(const u32 page); void reset(); - void resetselection(); + void reset_selection(); void set_columns(int count); inline float get_xoff() { return xoff; }; inline float get_yoff() { return yoff; }; @@ -63,6 +80,9 @@ class pdfview: public Fl_Widget { u16 cachedpage[CACHE_MAX]; Pixmap pix[CACHE_MAX]; + page_pos_struct page_pos_on_screen[PAGES_ON_SCREEN_MAX]; + u32 page_pos_count; + // Text selection coords u16 selx, sely, selx2, sely2; s32 columns; From 2e142315d0fa713bbd6981cd2cc4690992620942 Mon Sep 17 00:00:00 2001 From: Guy Turcotte Date: Sun, 6 Nov 2016 07:11:27 -0500 Subject: [PATCH 21/21] Removed tracing printf in the draw method --- src/view.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/view.cpp b/src/view.cpp index a74ec35..e6d5b01 100644 --- a/src/view.cpp +++ b/src/view.cpp @@ -414,9 +414,9 @@ void pdfview::draw() { pp->ratio_x = ratio_x; pp->ratio_y = ratio_y; - if (page_pos_count == 0) - printf("Copy X0:%d Y0:%d X:%d Y:%d W:%d H:%d Zoom: %6.3f page: %d\n", - pp->X0, pp->Y0, pp->X, pp->Y, pp->W, pp->H, pp->zoom, pp->page + 1); + // if (page_pos_count == 0) + // printf("Copy X0:%d Y0:%d X:%d Y:%d W:%d H:%d Zoom: %6.3f page: %d\n", + // pp->X0, pp->Y0, pp->X, pp->Y, pp->W, pp->H, pp->zoom, pp->page + 1); page_pos_count++; pp++;