diff -Nru gimagereader-3.1.99/astyle.options gimagereader-3.2.0/astyle.options
--- gimagereader-3.1.99/astyle.options 1970-01-01 00:00:00.000000000 +0000
+++ gimagereader-3.2.0/astyle.options 2016-11-23 22:08:53.000000000 +0000
@@ -0,0 +1,5 @@
+--preserve-date
+--indent-preprocessor
+--style=java
+--indent=tab#4
+--suffix=none
diff -Nru gimagereader-3.1.99/CMakeLists.txt gimagereader-3.2.0/CMakeLists.txt
--- gimagereader-3.1.99/CMakeLists.txt 2016-10-13 21:45:35.000000000 +0000
+++ gimagereader-3.2.0/CMakeLists.txt 2016-11-23 22:08:53.000000000 +0000
@@ -7,7 +7,7 @@
# Project properties
PROJECT(gimagereader)
SET(PACKAGE_NAME gImageReader)
-SET(PACKAGE_VERSION 3.1.99)
+SET(PACKAGE_VERSION 3.2.0)
SET(PACKAGE_LOCALE_DIR "${CMAKE_INSTALL_PREFIX}/share/locale")
@@ -55,7 +55,7 @@
FIND_PACKAGE(PkgConfig REQUIRED)
PKG_CHECK_MODULES(TESSERACT tesseract)
IF(NOT TESSERACT_FOUND)
- MESSAGE(WANING "Using hardcoded tesseract cflags and libs")
+ MESSAGE(WARNING "Using hardcoded cflags and ldflags for tesseract")
SET(TESSERACT_INCLUDE_DIRS /usr/include/tesseract)
SET(TESSERACT_LDFLAGS -ltesseract)
ENDIF(NOT TESSERACT_FOUND)
@@ -75,7 +75,17 @@
PKG_CHECK_MODULES(POPPLER REQUIRED poppler-glib)
PKG_CHECK_MODULES(JSONGLIB REQUIRED json-glib-1.0)
PKG_CHECK_MODULES(LIBXMLPP REQUIRED libxml++-2.6)
- PKG_CHECK_MODULES(LIBJPEG REQUIRED libjpeg)
+ FIND_PACKAGE(JPEG)
+ IF(JPEG_FOUND)
+ SET(LIBJPEG_INCLUDE_DIRS ${JPEG_INCLUDE_DIRS})
+ SET(LIBJPEG_LDFLAGS ${JPEG_LIBRARIES})
+ ELSE()
+ PKG_CHECK_MODULES(LIBJPEG libjpeg)
+ IF(NOT LIBJPEG_FOUND)
+ MESSAGE(WARNING "Using hardcoded cflags and ldflags for libjpeg")
+ SET(LIBJPEG_LDFLAGS "-ljpeg")
+ ENDIF()
+ ENDIF()
PKG_CHECK_MODULES(FONTCONFIG REQUIRED fontconfig)
INCLUDE_DIRECTORIES(
${GTKMM_INCLUDE_DIRS}
@@ -130,7 +140,6 @@
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/${srcdir}/src/ )
-
# Files
FILE(GLOB gimagereader_SRCS ${srcdir}/src/*.cc)
# sort lists to avoid dependency on readdir() order and make build reproducible
@@ -141,8 +150,6 @@
LIST(SORT gimagereader_FORMS)
FILE(GLOB gimagereader_ICONS data/icons/*.png)
LIST(SORT gimagereader_ICONS)
-FILE(GLOB gimagereader_PO po/*.po)
-LIST(SORT gimagereader_PO)
IF("${srcdir}" STREQUAL "qt")
FILE(GLOB gimagereader_RESOURCES qt/data/*.qrc)
LIST(SORT gimagereader_RESOURCES)
@@ -188,7 +195,9 @@
FILE(READ po/LINGUAS langs_string)
STRING(REGEX MATCHALL "[a-zA-Z_]+" langs "${langs_string}")
-FILE(COPY ${gimagereader_PO} DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
+FOREACH(lang ${langs})
+ CONFIGURE_FILE(po/${lang}.po ${lang}.po COPYONLY)
+ENDFOREACH()
GETTEXT_PROCESS_POT_FILE(po/gimagereader.pot ALL INSTALL_DESTINATION ${PACKAGE_LOCALE_DIR} LANGUAGES ${langs})
IF(MINGW)
diff -Nru gimagereader-3.1.99/data/gimagereader.appdata.xml.in gimagereader-3.2.0/data/gimagereader.appdata.xml.in
--- gimagereader-3.1.99/data/gimagereader.appdata.xml.in 2016-10-13 21:45:35.000000000 +0000
+++ gimagereader-3.2.0/data/gimagereader.appdata.xml.in 2016-11-23 22:08:53.000000000 +0000
@@ -46,6 +46,6 @@
https://github.com/manisandro/gImageReader
- http://the-web-site-with-translation-instructions/
+ https://github.com/manisandro/gImageReader/blob/master/README.md
manisandro@gmail.com
diff -Nru gimagereader-3.1.99/data/gimagereader.desktop.in gimagereader-3.2.0/data/gimagereader.desktop.in
--- gimagereader-3.1.99/data/gimagereader.desktop.in 2016-10-13 21:45:35.000000000 +0000
+++ gimagereader-3.2.0/data/gimagereader.desktop.in 2016-11-23 22:08:53.000000000 +0000
@@ -2,13 +2,11 @@
Name=gImageReader
GenericName=OCR application
GenericName[cs]=optické rozpoznávání znaků (OCR)
-Comment=OCR application
-Comment[cs]=aplikace pro optické rozpoznávání znaků (OCR)
Exec=gimagereader-@INTERFACE_TYPE@ %U
Icon=gimagereader
Terminal=false
Type=Application
StartupNotify=true
-Categories=Graphics;OCR;
+Categories=Graphics;OCR;Scanning;
MimeType=image/bmp;image/jpeg;image/gif;image/png;image/tiff;image/x-bmp;image/x-ico;image/x-png;image/x-pcx;image/x-tga;image/xpm;image/svg+xml;
Keywords=OCR;optical character recognition;Scanner;tesseract;
diff -Nru gimagereader-3.1.99/data/manual.html.in gimagereader-3.2.0/data/manual.html.in
--- gimagereader-3.1.99/data/manual.html.in 2016-10-13 21:45:35.000000000 +0000
+++ gimagereader-3.2.0/data/manual.html.in 2016-11-23 22:08:53.000000000 +0000
@@ -46,6 +46,14 @@
A detailed list of changes can be found in the commit log: https://github.com/manisandro/gImageReader/commits/master
+gImageReader 3.2.0 (Nov 23 2016):
+
+ gImageReader 3.2.0 stable
+ Add PageUp / PageDown keyboard accelerators for browsing multipage documents
+ See 3.1.9x changelogs for all other feature changes since previous stable
+ Many bug fixes since 3.1.99 - special thanks to Daniel Plakhotich
+ Full details in commit log: https://github.com/manisandro/gImageReader/commits/master
+
gImageReader 3.1.99 (Oct 13 2016):
gImageReader 3.2 release candidate
@@ -59,7 +67,7 @@
Plain text mode improvements:
Allow recognizing user-defined regions on multiple pages
- Also tread \u2014 character as a hyphen
+ Also treat \u2014 character as a hyphen
Make preserve paragraphs option correctly deal with trailing whitespace
@@ -301,7 +309,7 @@
If you find an issue or have a suggestion, please file a ticket to the gImageReader issue tracker , or contact me directly at manisandro@gmail.com . If you are experiencing crashes or hangs, please also try to include the following information in the ticket/email:
+ href="mailto:manisandro@gmail.com">manisandro@gmail.com. Be sure to also consult the FAQ . If you are experiencing crashes or hangs, please also try to include the following information in the ticket/email:
If the crash handler appears, include the backtrace which is shown there. To make sure that the backtrace is complete, if you are running the application under Linux, make sure that the gdb debugger as well as the debugging symbols are installed if your distribution provides them. The package containing the debugging symbols is usually called <packagename>-debuginfo or <packagename>-dbg . If you are running the application under Windows, some debugging symbols are installed by default.
diff -Nru gimagereader-3.1.99/debian/changelog gimagereader-3.2.0/debian/changelog
--- gimagereader-3.1.99/debian/changelog 2016-10-13 22:59:50.000000000 +0000
+++ gimagereader-3.2.0/debian/changelog 2016-11-23 22:42:12.000000000 +0000
@@ -1,5 +1,5 @@
-gimagereader (3.1.99-1~yakketyppa1) yakkety; urgency=low
+gimagereader (3.2.0-1~yakketyppa1) yakkety; urgency=low
- * gimagereader 3.1.99.
+ * gimagereader 3.2.0.
- -- Sandro Mani Fri, 14 Oct 2016 00:20:40 +0200
+ -- Sandro Mani Wed, 23 Nov 2016 23:42:12 +0100
diff -Nru gimagereader-3.1.99/formatSourceFiles.sh gimagereader-3.2.0/formatSourceFiles.sh
--- gimagereader-3.1.99/formatSourceFiles.sh 1970-01-01 00:00:00.000000000 +0000
+++ gimagereader-3.2.0/formatSourceFiles.sh 2016-11-23 22:08:53.000000000 +0000
@@ -0,0 +1,3 @@
+#!/bin/sh
+which astyle &> /dev/null || echo "Please install astyle." && exit 1
+find gtk qt \( -name '*.cc' -or -name '*.hh' \) -exec astyle --options=$dir/astyle.options {} \;
diff -Nru gimagereader-3.1.99/gtk/data/gimagereader.ui gimagereader-3.2.0/gtk/data/gimagereader.ui
--- gimagereader-3.1.99/gtk/data/gimagereader.ui 2016-10-13 21:45:35.000000000 +0000
+++ gimagereader-3.2.0/gtk/data/gimagereader.ui 2016-11-23 22:08:53.000000000 +0000
@@ -197,7 +197,7 @@
True
False
- edit-delete-symbolic
+ list-remove-symbolic
True
@@ -848,12 +848,12 @@
True
- False
+ True
GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_STRUCTURE_MASK
none
- False
+ True
center
center
@@ -1111,7 +1111,6 @@
True
False
- 0
- Plain text
- hOCR, PDF
diff -Nru gimagereader-3.1.99/gtk/src/Acquirer.cc gimagereader-3.2.0/gtk/src/Acquirer.cc
--- gimagereader-3.1.99/gtk/src/Acquirer.cc 2016-10-13 21:45:35.000000000 +0000
+++ gimagereader-3.2.0/gtk/src/Acquirer.cc 2016-11-23 22:08:53.000000000 +0000
@@ -29,8 +29,7 @@
#include "scanner/ScannerSane.hh"
#endif
-Acquirer::Acquirer()
-{
+Acquirer::Acquirer() {
m_devCombo = MAIN->getWidget("combo:sources.acquire.device");
m_refreshButton = MAIN->getWidget("button:inpute.acquire.device.refresh");
m_refreshSpinner = MAIN->getWidget("spinner:sources.acquire.device");
@@ -55,16 +54,24 @@
m_scanner = new ScannerImpl;
- CONNECT(m_refreshButton, clicked, [this]{ startDetectDevices(); });
- CONNECT(m_scanButton, clicked, [this]{ startScan(); });
- CONNECT(m_cancelButton, clicked, [this]{ cancelScan(); });
- CONNECT(MAIN->getWidget("button:sources.acquire.output").as(), clicked, [this]{ selectOutputPath(); });
- CONNECT(m_devCombo, changed, [this]{ setDeviceComboTooltip(); });
- CONNECT(m_scanner, initFailed, [this]{ scanInitFailed(); });
- CONNECT(m_scanner, devicesDetected, [this](const std::vector& devices){ doneDetectDevices(devices); });
- CONNECT(m_scanner, scanFailed, [this](const std::string& msg){ scanFailed(msg); });
- CONNECT(m_scanner, scanStateChanged, [this](Scanner::State state){ setScanState(state); });
- CONNECT(m_scanner, pageAvailable, [this](const std::string& file){ m_signal_scanPageAvailable.emit(file); });
+ CONNECT(m_refreshButton, clicked, [this] { startDetectDevices(); });
+ CONNECT(m_scanButton, clicked, [this] { startScan(); });
+ CONNECT(m_cancelButton, clicked, [this] { cancelScan(); });
+ CONNECT(MAIN->getWidget("button:sources.acquire.output").as(), clicked, [this] { selectOutputPath(); });
+ CONNECT(m_devCombo, changed, [this] { setDeviceComboTooltip(); });
+ CONNECT(m_scanner, initFailed, [this] { scanInitFailed(); });
+ CONNECT(m_scanner, devicesDetected, [this](const std::vector& devices) {
+ doneDetectDevices(devices);
+ });
+ CONNECT(m_scanner, scanFailed, [this](const std::string& msg) {
+ scanFailed(msg);
+ });
+ CONNECT(m_scanner, scanStateChanged, [this](Scanner::State state) {
+ setScanState(state);
+ });
+ CONNECT(m_scanner, pageAvailable, [this](const std::string& file) {
+ m_signal_scanPageAvailable.emit(file);
+ });
MAIN->getConfig()->addSetting(new ComboSetting("scanres", MAIN->getWidget("combo:sources.acquire.resolution")));
MAIN->getConfig()->addSetting(new ComboSetting("scanmode", MAIN->getWidget("combo:sources.acquire.mode")));
@@ -79,33 +86,29 @@
m_scanner->init();
}
-Acquirer::~Acquirer()
-{
+Acquirer::~Acquirer() {
m_scanner->close();
delete m_scanner;
}
-void Acquirer::selectOutputPath()
-{
+void Acquirer::selectOutputPath() {
FileDialogs::FileFilter filter = FileDialogs::FileFilter::pixbuf_formats();
filter.name = _("Images");
std::string filename = FileDialogs::save_dialog(_("Choose Output Filename..."), m_outputPath, filter);
- if(!filename.empty()){
+ if(!filename.empty()) {
m_outputPath = filename;
genOutputPath();
}
}
-void Acquirer::genOutputPath()
-{
+void Acquirer::genOutputPath() {
m_outputPath = Utils::make_output_filename(m_outputPath);
m_outputLabel->set_text(m_outputPath);
m_outputLabel->set_tooltip_text(m_outputPath);
MAIN->getConfig()->getSetting>("scanoutput")->setValue(m_outputPath);
}
-void Acquirer::scanInitFailed()
-{
+void Acquirer::scanInitFailed() {
m_msgLabel->set_markup(Glib::ustring::compose("%1 ", _("Failed to initialize the scanning backend.")));
m_scanButton->set_sensitive(false);
m_refreshButton->set_sensitive(false);
@@ -114,13 +117,11 @@
m_refreshSpinner->stop();
}
-void Acquirer::scanFailed(const Glib::ustring &msg)
-{
+void Acquirer::scanFailed(const Glib::ustring &msg) {
m_msgLabel->set_markup(Glib::ustring::compose("%1: %2 ", _("Scan failed"), msg));
}
-void Acquirer::startDetectDevices()
-{
+void Acquirer::startDetectDevices() {
m_refreshButton->hide();
m_refreshSpinner->show();
m_refreshSpinner->start();
@@ -130,16 +131,15 @@
m_scanner->redetect();
}
-void Acquirer::doneDetectDevices(const std::vector& devices)
-{
+void Acquirer::doneDetectDevices(const std::vector& devices) {
m_refreshButton->show();
m_refreshSpinner->hide();
m_refreshSpinner->stop();
- if(devices.empty()){
+ if(devices.empty()) {
m_msgLabel->set_markup(Glib::ustring::compose("%1 ", _("No scanners were detected.")));
- }else{
+ } else {
Glib::RefPtr store = Glib::RefPtr::cast_static(m_devCombo->get_model());
- for(const Scanner::Device& device : devices){
+ for(const Scanner::Device& device : devices) {
Gtk::TreeIter it = store->append();
it->set_value(m_devComboCols.label, device.label);
it->set_value(m_devComboCols.name, device.name);
@@ -149,8 +149,7 @@
}
}
-void Acquirer::startScan()
-{
+void Acquirer::startScan() {
m_buttonBox->remove(*m_scanButton);
m_cancelButton->set_sensitive(true);
m_buttonBox->pack_start(*m_cancelButton, false, true);
@@ -165,39 +164,35 @@
genOutputPath();
}
-void Acquirer::setScanState(Scanner::State state)
-{
- if(state == Scanner::State::OPEN){
+void Acquirer::setScanState(Scanner::State state) {
+ if(state == Scanner::State::OPEN) {
m_msgLabel->set_text(_("Opening device..."));
- }else if(state == Scanner::State::SET_OPTIONS){
+ } else if(state == Scanner::State::SET_OPTIONS) {
m_msgLabel->set_text(_("Setting options..."));
- }else if(state == Scanner::State::START){
+ } else if(state == Scanner::State::START) {
m_msgLabel->set_text(_("Starting scan..."));
- }else if(state == Scanner::State::GET_PARAMETERS){
+ } else if(state == Scanner::State::GET_PARAMETERS) {
m_msgLabel->set_text(_("Getting parameters..."));
- }else if(state == Scanner::State::READ){
+ } else if(state == Scanner::State::READ) {
m_msgLabel->set_text(_("Transferring data..."));
- }else if(state == Scanner::State::IDLE){
+ } else if(state == Scanner::State::IDLE) {
doneScan();
}
}
-void Acquirer::cancelScan()
-{
+void Acquirer::cancelScan() {
m_msgLabel->set_text(_("Canceling scan..."));
m_scanner->cancel();
m_cancelButton->set_sensitive(false);
}
-void Acquirer::doneScan()
-{
+void Acquirer::doneScan() {
m_buttonBox->remove(*m_cancelButton);
m_buttonBox->pack_start(*m_scanButton, false, true);
m_msgLabel->set_text("");
}
-void Acquirer::setDeviceComboTooltip()
-{
+void Acquirer::setDeviceComboTooltip() {
auto it = m_devCombo->get_active();
m_devCombo->set_tooltip_text(it ? static_cast((*it)[m_devComboCols.label]) : "");
}
diff -Nru gimagereader-3.1.99/gtk/src/Acquirer.hh gimagereader-3.2.0/gtk/src/Acquirer.hh
--- gimagereader-3.1.99/gtk/src/Acquirer.hh 2016-10-13 21:45:35.000000000 +0000
+++ gimagereader-3.2.0/gtk/src/Acquirer.hh 2016-11-23 22:08:53.000000000 +0000
@@ -29,14 +29,19 @@
Acquirer();
~Acquirer();
- sigc::signal signal_scanPageAvailable() const{ return m_signal_scanPageAvailable; }
+ sigc::signal signal_scanPageAvailable() const {
+ return m_signal_scanPageAvailable;
+ }
private:
class DevicesComboColumns : public Gtk::TreeModel::ColumnRecord {
public:
Gtk::TreeModelColumn label;
Gtk::TreeModelColumn name;
- DevicesComboColumns() { add(label); add(name); }
+ DevicesComboColumns() {
+ add(label);
+ add(name);
+ }
};
Gtk::Button* m_refreshButton;
diff -Nru gimagereader-3.1.99/gtk/src/Application.hh gimagereader-3.2.0/gtk/src/Application.hh
--- gimagereader-3.1.99/gtk/src/Application.hh 2016-10-13 21:45:35.000000000 +0000
+++ gimagereader-3.2.0/gtk/src/Application.hh 2016-11-23 22:08:53.000000000 +0000
@@ -26,28 +26,25 @@
class Application : public Gtk::Application {
public:
Application(int &argc, char **&argv, const Glib::ustring &application_id, Gio::ApplicationFlags flags)
- : Gtk::Application(argc, argv, application_id, flags)
- {
+ : Gtk::Application(argc, argv, application_id, flags) {
Glib::set_application_name(PACKAGE_NAME);
}
private:
- void on_activate()
- {
- if(m_mainWindow){
+ void on_activate() override {
+ if(m_mainWindow) {
m_mainWindow->getWindow()->present();
}
}
- void on_startup()
- {
+ void on_startup() override {
Gtk::Application::on_startup();
- add_action("redetectLangs", [this]{ m_mainWindow->redetectLanguages(); });
- add_action("preferences", [this]{ m_mainWindow->showConfig(); });
- add_action("help", [this]{ m_mainWindow->showHelp(); });
- add_action("about", [this]{ m_mainWindow->showAbout(); });
- add_action("quit", [this]{ on_quit(); });
+ add_action("redetectLangs", [this] { m_mainWindow->redetectLanguages(); });
+ add_action("preferences", [this] { m_mainWindow->showConfig(); });
+ add_action("help", [this] { m_mainWindow->showHelp(); });
+ add_action("about", [this] { m_mainWindow->showAbout(); });
+ add_action("quit", [this] { on_quit(); });
Glib::RefPtr appMenuBuilder = Gtk::Builder::create_from_resource("/org/gnome/gimagereader/appmenu.ui");
Glib::RefPtr menuModel = Glib::RefPtr::cast_static(appMenuBuilder->get_object("appmenu"));
@@ -56,28 +53,27 @@
#if GTK_CHECK_VERSION(3,14,0)
appMenu = prefers_app_menu();
#endif
- if(appMenu){
+ if(appMenu) {
set_app_menu(menuModel);
}
g_assert(m_mainWindow == nullptr);
m_mainWindow = new MainWindow();
- CONNECT(m_mainWindow->getWindow(), hide, [this]{ on_quit(); });
- if(!appMenu){
+ CONNECT(m_mainWindow->getWindow(), hide, [this] { on_quit(); });
+ if(!appMenu) {
m_mainWindow->setMenuModel(menuModel);
}
add_window(*m_mainWindow->getWindow());
m_mainWindow->getWindow()->show();
}
- void on_open(const type_vec_files& files, const Glib::ustring& /*hint*/)
- {
+ void on_open(const type_vec_files& files, const Glib::ustring& /*hint*/) override {
m_mainWindow->openFiles(files);
m_mainWindow->getWindow()->present();
}
- void on_quit(){
- if(m_mainWindow){
+ void on_quit() {
+ if(m_mainWindow) {
remove_window(*m_mainWindow->getWindow());
delete m_mainWindow;
m_mainWindow = nullptr;
diff -Nru gimagereader-3.1.99/gtk/src/common.hh gimagereader-3.2.0/gtk/src/common.hh
--- gimagereader-3.1.99/gtk/src/common.hh 2016-10-13 21:45:35.000000000 +0000
+++ gimagereader-3.2.0/gtk/src/common.hh 2016-11-23 22:08:53.000000000 +0000
@@ -25,16 +25,16 @@
#include
#include
-namespace sigc{
+namespace sigc {
#ifndef SIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE
#define SIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE \
-template \
-struct functor_trait \
-{ \
- typedef typename functor_trait::result_type result_type; \
- typedef T_functor functor_type; \
-};
+ template \
+ struct functor_trait \
+ { \
+ typedef typename functor_trait::result_type result_type; \
+ typedef T_functor functor_type; \
+ };
#endif
SIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE
@@ -61,9 +61,15 @@
public:
struct CastProxy {
CastProxy(Gtk::Widget* widget) : m_widget(widget) {}
- template operator T*(){ return static_cast(m_widget); }
- template T* as(){ return static_cast(m_widget); }
- Gtk::Widget* operator->(){ return m_widget; }
+ template operator T*() {
+ return static_cast(m_widget);
+ }
+ template T* as() {
+ return static_cast(m_widget);
+ }
+ Gtk::Widget* operator->() {
+ return m_widget;
+ }
Gtk::Widget* m_widget;
};
@@ -72,7 +78,7 @@
m_builder = Gtk::Builder::create_from_resource(resourcePath);
m_builder->set_translation_domain(GETTEXT_PACKAGE);
}
- CastProxy operator()(const Glib::ustring& name) const{
+ CastProxy operator()(const Glib::ustring& name) const {
Gtk::Widget* widget;
m_builder->get_widget(name, widget);
return CastProxy(widget);
diff -Nru gimagereader-3.1.99/gtk/src/Config.cc gimagereader-3.2.0/gtk/src/Config.cc
--- gimagereader-3.1.99/gtk/src/Config.cc 2016-10-13 21:45:35.000000000 +0000
+++ gimagereader-3.2.0/gtk/src/Config.cc 2016-11-23 22:08:53.000000000 +0000
@@ -276,8 +276,7 @@
const std::multimap Config::LANGUAGE_CULTURES = Config::buildLanguageCultureTable();
-Config::Config()
-{
+Config::Config() {
m_dialog = MAIN->getWidget("dialog:config");
m_addLangBox = MAIN->getWidget("box:config.langs.custom.add");
m_addLangPrefix = MAIN->getWidget("entry:config.langs.custom.add.prefix");
@@ -291,12 +290,14 @@
m_customLangView = MAIN->getWidget("treeview:config.langs.custom");
m_dialogOkButton = MAIN->getWidget("button:config.ok");
- for(Gtk::TreeView* view : {m_predefLangView, m_customLangView}){
+ for(Gtk::TreeView* view : {
+ m_predefLangView, m_customLangView
+ }) {
view->set_model(Gtk::ListStore::create(m_langViewCols));
view->append_column_editable(_("Filename prefix"), m_langViewCols.prefix);
view->append_column_editable(_("Code"), m_langViewCols.code);
view->append_column_editable(_("Native name"), m_langViewCols.name);
- for(int i=0; i<3; ++i){
+ for(int i=0; i<3; ++i) {
view->get_column(i)->set_sizing(Gtk::TREE_VIEW_COLUMN_FIXED);
view->get_column(i)->set_expand(true);
}
@@ -304,26 +305,37 @@
}
Glib::RefPtr store = Glib::RefPtr::cast_static(m_predefLangView->get_model());
- for(const auto& lang : LANGUAGES){
+ for(const auto& lang : LANGUAGES) {
Gtk::TreeIter it = store->append();
(*it)[m_langViewCols.prefix] = lang.prefix;
(*it)[m_langViewCols.code] = lang.code;
(*it)[m_langViewCols.name] = lang.name;
}
- CONNECTS(MAIN->getWidget("checkbutton:config.settings.defaultoutputfont").as(), toggled, [](Gtk::CheckButton* btn){
+ CONNECTS(MAIN->getWidget("checkbutton:config.settings.defaultoutputfont").as(), toggled, [](Gtk::CheckButton* btn) {
MAIN->getWidget("fontbutton:config.settings.customoutputfont").as()->set_sensitive(!btn->get_active());
});
- CONNECT(m_addLangButton, clicked, [this]{ toggleAddLanguage(); });
- CONNECT(m_removeLangButton, clicked, [this]{ removeLanguage(); });
- CONNECT(m_addLangButtonOk, clicked, [this]{ addLanguage(); });
- CONNECT(MAIN->getWidget("button:config.langs.custom.add.cancel").as(), clicked, [this]{ toggleAddLanguage(); });
- CONNECT(m_customLangView->get_selection(), changed, [this]{ langTableSelectionChanged(); });
- CONNECT(MAIN->getWidget("button:config.help").as(), clicked, []{ MAIN->showHelp("#Usage_Options"); });
- CONNECT(m_addLangPrefix, focus_in_event, [this](GdkEventFocus*){ Utils::clear_error_state(m_addLangPrefix); return false; });
- CONNECT(m_addLangName, focus_in_event, [this](GdkEventFocus*){ Utils::clear_error_state(m_addLangName); return false; });
- CONNECT(m_addLangCode, focus_in_event, [this](GdkEventFocus*){ Utils::clear_error_state(m_addLangCode); return false; });
- CONNECTS(MAIN->getWidget("combo:config.datadirs").as(), changed, [this](Gtk::ComboBox* combo){ setDataLocations(combo->get_active_row_number()); });
+ CONNECT(m_addLangButton, clicked, [this] { toggleAddLanguage(); });
+ CONNECT(m_removeLangButton, clicked, [this] { removeLanguage(); });
+ CONNECT(m_addLangButtonOk, clicked, [this] { addLanguage(); });
+ CONNECT(MAIN->getWidget("button:config.langs.custom.add.cancel").as(), clicked, [this] { toggleAddLanguage(); });
+ CONNECT(m_customLangView->get_selection(), changed, [this] { langTableSelectionChanged(); });
+ CONNECT(MAIN->getWidget("button:config.help").as(), clicked, [] { MAIN->showHelp("#Usage_Options"); });
+ CONNECT(m_addLangPrefix, focus_in_event, [this](GdkEventFocus*) {
+ Utils::clear_error_state(m_addLangPrefix);
+ return false;
+ });
+ CONNECT(m_addLangName, focus_in_event, [this](GdkEventFocus*) {
+ Utils::clear_error_state(m_addLangName);
+ return false;
+ });
+ CONNECT(m_addLangCode, focus_in_event, [this](GdkEventFocus*) {
+ Utils::clear_error_state(m_addLangCode);
+ return false;
+ });
+ CONNECTS(MAIN->getWidget("combo:config.datadirs").as(), changed, [this](Gtk::ComboBox* combo) {
+ setDataLocations(combo->get_active_row_number());
+ });
addSetting(new SwitchSettingT("dictinstall", MAIN->getWidget("check:config.settings.dictinstall")));
addSetting(new SwitchSettingT("updatecheck", MAIN->getWidget("check:config.settings.update")));
@@ -334,19 +346,21 @@
addSetting(new ComboSetting("datadirs", MAIN->getWidget("combo:config.datadirs")));
}
-Config::~Config()
-{
- for(const auto& keyVal : m_settings){
+Config::~Config() {
+ for(const auto& keyVal : m_settings) {
delete keyVal.second;
}
}
-bool Config::searchLangSpec(Lang& lang) const
-{
- for(const Glib::RefPtr& model : {m_predefLangView->get_model(), m_customLangView->get_model()}){
+bool Config::searchLangSpec(Lang& lang) const {
+ for(const Glib::RefPtr& model : {
+ m_predefLangView->get_model(), m_customLangView->get_model()
+ }) {
Gtk::TreeIter it = std::find_if(model->children().begin(), model->children().end(),
- [this, &lang](const Gtk::TreeRow& row){ return row[m_langViewCols.prefix] == lang.prefix; });
- if(it){
+ [this, &lang](const Gtk::TreeRow& row) {
+ return row[m_langViewCols.prefix] == lang.prefix;
+ });
+ if(it) {
lang = {(*it)[m_langViewCols.prefix], (*it)[m_langViewCols.code], (*it)[m_langViewCols.name]};
return true;
}
@@ -354,8 +368,7 @@
return false;
}
-std::vector Config::searchLangCultures(const Glib::ustring& code) const
-{
+std::vector Config::searchLangCultures(const Glib::ustring& code) const {
std::vector result;
auto ii = LANGUAGE_CULTURES.equal_range(code);
for(auto it = ii.first; it != ii.second; ++it) {
@@ -364,31 +377,26 @@
return result;
}
-bool Config::useSystemDataLocations() const
-{
+bool Config::useSystemDataLocations() const {
return MAIN->getWidget("combo:config.datadirs").as()->get_active_row_number() == 0;
}
-std::string Config::tessdataLocation() const
-{
+std::string Config::tessdataLocation() const {
return MAIN->getWidget("entry:config.tessdatadir").as()->get_text();
}
-std::string Config::spellingLocation() const
-{
+std::string Config::spellingLocation() const {
return MAIN->getWidget("entry:config.spelldir").as()->get_text();
}
-void Config::showDialog()
-{
+void Config::showDialog() {
toggleAddLanguage(true);
while(m_dialog->run() == Gtk::RESPONSE_HELP);
getSetting("customlangs")->serialize();
m_dialog->hide();
}
-void Config::setDataLocations(int idx)
-{
+void Config::setDataLocations(int idx) {
if(idx == 0) {
#ifdef G_OS_WIN32
std::string dataDir = Glib::build_filename(pkgDir, "share");
@@ -408,12 +416,14 @@
MAIN->getWidget("entry:config.spelldir").as()->set_text(Glib::build_filename(configDir, "enchant", "myspell"));
}
tesseract::TessBaseAPI tess;
+ std::string current = setlocale(LC_NUMERIC, NULL);
+ setlocale(LC_NUMERIC, "C");
tess.Init(nullptr, nullptr);
+ setlocale(LC_NUMERIC, current.c_str());
MAIN->getWidget("entry:config.tessdatadir").as()->set_text(tess.GetDatapath());
}
-void Config::openTessdataDir()
-{
+void Config::openTessdataDir() {
int idx = Gio::Settings::create(APPLICATION_ID)->get_int("datadirs");
if(idx == 0) {
#ifdef G_OS_WIN32
@@ -427,12 +437,14 @@
Glib::setenv("TESSDATA_PREFIX", Glib::build_filename(configDir, "tessdata"));
}
tesseract::TessBaseAPI tess;
+ std::string current = setlocale(LC_NUMERIC, NULL);
+ setlocale(LC_NUMERIC, "C");
tess.Init(nullptr, nullptr);
+ setlocale(LC_NUMERIC, current.c_str());
Utils::openUri(Glib::filename_to_uri(tess.GetDatapath()));
}
-void Config::openSpellingDir()
-{
+void Config::openSpellingDir() {
int idx = Gio::Settings::create(APPLICATION_ID)->get_int("datadirs");
if(idx == 0) {
#ifdef G_OS_WIN32
@@ -451,14 +463,13 @@
}
}
-void Config::toggleAddLanguage(bool forceHide)
-{
+void Config::toggleAddLanguage(bool forceHide) {
bool addVisible = forceHide ? true : m_addLangBox->get_visible();
m_addLangBox->set_visible(!addVisible);
m_editLangBox->set_visible(addVisible);
- if(addVisible){
+ if(addVisible) {
m_addLangButton->grab_focus();
- }else{
+ } else {
m_addLangButtonOk->grab_focus();
}
m_addLangPrefix->set_text("");
@@ -469,23 +480,22 @@
Utils::clear_error_state(m_addLangName);
}
-void Config::addLanguage()
-{
+void Config::addLanguage() {
bool invalid = false;
- if(!Glib::Regex::create("^\\w+$")->match(m_addLangPrefix->get_text())){
+ if(!Glib::Regex::create("^\\w+$")->match(m_addLangPrefix->get_text())) {
invalid = true;
Utils::set_error_state(m_addLangPrefix);
}
- if(!Glib::Regex::create("^.+$")->match(m_addLangName->get_text())){
+ if(!Glib::Regex::create("^.+$")->match(m_addLangName->get_text())) {
invalid = true;
Utils::set_error_state(m_addLangName);
}
if(!Glib::Regex::create("^[a-z]{2}$")->match(m_addLangCode->get_text()) &&
- !Glib::Regex::create("^[a-z]{2}_[A-Z]{2}$")->match(m_addLangCode->get_text())){
+ !Glib::Regex::create("^[a-z]{2}_[A-Z]{2}$")->match(m_addLangCode->get_text())) {
invalid = true;
Utils::set_error_state(m_addLangCode);
}
- if(!invalid){
+ if(!invalid) {
Glib::RefPtr store = Glib::RefPtr::cast_static(m_customLangView->get_model());
Gtk::TreeIter it = store->append();
(*it)[m_langViewCols.prefix] = m_addLangPrefix->get_text();
@@ -498,15 +508,13 @@
}
}
-void Config::removeLanguage()
-{
- if(m_customLangView->get_selection()->count_selected_rows() != 0){
+void Config::removeLanguage() {
+ if(m_customLangView->get_selection()->count_selected_rows() != 0) {
Glib::RefPtr store = Glib::RefPtr::cast_static(m_customLangView->get_model());
store->erase(m_customLangView->get_selection()->get_selected());
}
}
-void Config::langTableSelectionChanged()
-{
+void Config::langTableSelectionChanged() {
m_removeLangButton->set_sensitive(m_customLangView->get_selection()->count_selected_rows() != 0);
}
diff -Nru gimagereader-3.1.99/gtk/src/Config.hh gimagereader-3.2.0/gtk/src/Config.hh
--- gimagereader-3.1.99/gtk/src/Config.hh 2016-10-13 21:45:35.000000000 +0000
+++ gimagereader-3.2.0/gtk/src/Config.hh 2016-11-23 22:08:53.000000000 +0000
@@ -48,10 +48,17 @@
}
}
template
- T* getSetting(const Glib::ustring& key) const{
+ T* getSetting(const Glib::ustring& key) const {
auto it = m_settings.find(key);
return it == m_settings.end() ? nullptr : static_cast(it->second);
}
+ void removeSetting(const Glib::ustring& key) {
+ auto it = m_settings.find(key);
+ if(it != m_settings.end()) {
+ delete it->second;
+ m_settings.erase(it);
+ }
+ }
bool searchLangSpec(Lang& lang) const;
std::vector searchLangCultures(const Glib::ustring& code) const;
@@ -69,7 +76,11 @@
Gtk::TreeModelColumn prefix;
Gtk::TreeModelColumn code;
Gtk::TreeModelColumn name;
- LangViewColumns() { add(prefix); add(code); add(name); }
+ LangViewColumns() {
+ add(prefix);
+ add(code);
+ add(name);
+ }
};
static const std::vector LANGUAGES;
diff -Nru gimagereader-3.1.99/gtk/src/ConfigSettings.cc gimagereader-3.2.0/gtk/src/ConfigSettings.cc
--- gimagereader-3.1.99/gtk/src/ConfigSettings.cc 2016-10-13 21:45:35.000000000 +0000
+++ gimagereader-3.2.0/gtk/src/ConfigSettings.cc 2016-11-23 22:08:53.000000000 +0000
@@ -20,38 +20,36 @@
#include "ConfigSettings.hh"
#include "Utils.hh"
-Glib::RefPtr get_default_settings(){
+Glib::RefPtr get_default_settings() {
static Glib::RefPtr settings = Gio::Settings::create(APPLICATION_ID);
return settings;
}
ListStoreSetting::ListStoreSetting(const Glib::ustring &key, Glib::RefPtr liststore)
- : AbstractSetting(key), m_liststore(liststore)
-{
+ : AbstractSetting(key), m_liststore(liststore) {
Glib::ustring str = get_default_settings()->get_string(m_key);
m_liststore->clear();
std::size_t nCols = m_liststore->get_n_columns();
- for(const Glib::ustring& row : Utils::string_split(str, ';', false)){
+ for(const Glib::ustring& row : Utils::string_split(str, ';', false)) {
int colidx = 0;
std::vector cols = Utils::string_split(row, ',', true);
- if(cols.size() != nCols){
+ if(cols.size() != nCols) {
continue;
}
Gtk::TreeModel::Row treerow = *(m_liststore->append());
- for(const Glib::ustring& col : cols){
+ for(const Glib::ustring& col : cols) {
treerow.set_value(colidx++, col);
}
}
}
-void ListStoreSetting::serialize()
-{
+void ListStoreSetting::serialize() {
// Serialized string has format a11,a12,a13;a21,a22,a23;...
Glib::ustring str;
int nCols = m_liststore->get_n_columns();
- for(const Gtk::TreeModel::Row& row : m_liststore->children()){
- for(int col = 0; col < nCols; ++col){
+ for(const Gtk::TreeModel::Row& row : m_liststore->children()) {
+ for(int col = 0; col < nCols; ++col) {
Glib::ustring field;
row.get_value(col, field);
str += field + (col == nCols - 1 ? ";" : ",");
diff -Nru gimagereader-3.1.99/gtk/src/ConfigSettings.hh gimagereader-3.2.0/gtk/src/ConfigSettings.hh
--- gimagereader-3.1.99/gtk/src/ConfigSettings.hh 2016-10-13 21:45:35.000000000 +0000
+++ gimagereader-3.2.0/gtk/src/ConfigSettings.hh 2016-11-23 22:08:53.000000000 +0000
@@ -33,7 +33,9 @@
AbstractSetting(const Glib::ustring& key)
: m_key(key) {}
virtual ~AbstractSetting() {}
- const Glib::ustring& key() const{ return m_key; }
+ const Glib::ustring& key() const {
+ return m_key;
+ }
virtual void serialize() {}
protected:
@@ -44,12 +46,12 @@
class VarSetting : public AbstractSetting {
public:
using AbstractSetting::AbstractSetting;
- T getValue() const{
+ T getValue() const {
Glib::Variant v;
get_default_settings()->get_value(m_key, v);
return v.get();
}
- void setValue(const T& value){
+ void setValue(const T& value) {
get_default_settings()->set_value(m_key, Glib::Variant::create(value));
}
};
@@ -57,15 +59,14 @@
class FontSetting : public AbstractSetting {
public:
FontSetting(const Glib::ustring& key, Gtk::FontButton* widget)
- : AbstractSetting(key), m_widget(widget)
- {
+ : AbstractSetting(key), m_widget(widget) {
m_widget->set_font_name(get_default_settings()->get_string(m_key));
- CONNECTP(m_widget, font_name, [this]{ serialize(); });
+ CONNECTP(m_widget, font_name, [this] { serialize(); });
}
- void serialize(){
+ void serialize() override {
get_default_settings()->set_string(m_key, m_widget->get_font_name());
}
- Glib::ustring getValue() const{
+ Glib::ustring getValue() const {
return m_widget->get_font_name();
}
@@ -84,18 +85,17 @@
class SwitchSettingT : public SwitchSetting {
public:
SwitchSettingT(const Glib::ustring& key, T* widget)
- : SwitchSetting(key), m_widget(widget)
- {
+ : SwitchSetting(key), m_widget(widget) {
m_widget->set_active(get_default_settings()->get_boolean(m_key));
- CONNECT(m_widget, toggled, [this]{ serialize(); });
+ CONNECT(m_widget, toggled, [this] { serialize(); });
}
- void serialize(){
+ void serialize() override {
get_default_settings()->set_boolean(m_key, m_widget->get_active());
}
- void setValue(bool value){
+ void setValue(bool value) override {
m_widget->set_active(value);
}
- bool getValue() const{
+ bool getValue() const override {
return m_widget->get_active();
}
@@ -106,14 +106,13 @@
class ComboSetting : public AbstractSetting {
public:
ComboSetting(const Glib::ustring& key, Gtk::ComboBox* widget)
- : AbstractSetting(key), m_widget(widget)
- {
+ : AbstractSetting(key), m_widget(widget) {
int idx = get_default_settings()->get_int(m_key);
int nrows = m_widget->get_model()->children().size();
m_widget->set_active(std::min(std::max(0, idx), nrows - 1));
- CONNECT(m_widget, changed, [this]{ serialize(); });
+ CONNECT(m_widget, changed, [this] { serialize(); });
}
- void serialize(){
+ void serialize() override {
get_default_settings()->set_int(m_key, m_widget->get_active_row_number());
}
@@ -124,13 +123,12 @@
class SpinSetting : public AbstractSetting {
public:
SpinSetting(const Glib::ustring& key, Gtk::SpinButton* widget)
- : AbstractSetting(key), m_widget(widget)
- {
+ : AbstractSetting(key), m_widget(widget) {
int value = get_default_settings()->get_int(m_key);
m_widget->set_value(value);
- CONNECT(m_widget, value_changed, [this]{ serialize(); });
+ CONNECT(m_widget, value_changed, [this] { serialize(); });
}
- void serialize(){
+ void serialize() override {
get_default_settings()->set_int(m_key, m_widget->get_value());
}
@@ -141,7 +139,7 @@
class ListStoreSetting : public AbstractSetting {
public:
ListStoreSetting(const Glib::ustring& key, Glib::RefPtr liststore);
- void serialize();
+ void serialize() override;
private:
Glib::RefPtr m_liststore;
diff -Nru gimagereader-3.1.99/gtk/src/CrashHandler.cc gimagereader-3.2.0/gtk/src/CrashHandler.cc
--- gimagereader-3.1.99/gtk/src/CrashHandler.cc 2016-10-13 21:45:35.000000000 +0000
+++ gimagereader-3.2.0/gtk/src/CrashHandler.cc 2016-11-23 22:08:53.000000000 +0000
@@ -22,8 +22,7 @@
CrashHandler::CrashHandler(int argc, char* argv[])
: Gtk::Application(argc, argv, APPLICATION_ID".crashhandler", Gio::APPLICATION_HANDLES_COMMAND_LINE)
- , m_builder("/org/gnome/gimagereader/crashhandler.ui")
-{
+ , m_builder("/org/gnome/gimagereader/crashhandler.ui") {
Glib::set_application_name(Glib::ustring::compose("%1 - %2", PACKAGE_NAME, _("Crash Handler")));
if(argc > 2) {
@@ -34,8 +33,7 @@
}
}
-void CrashHandler::on_startup()
-{
+void CrashHandler::on_startup() {
Gtk::Application::on_startup();
m_dialog = m_builder("dialog:crashhandler");
m_progressBar = m_builder("progressbar:backtrace");
@@ -45,12 +43,15 @@
m_dialog->set_title(Glib::ustring::compose("%1 %2", PACKAGE_NAME, _("Crash Handler")));
if(!m_saveFile.empty()) {
m_builder("label:crashhandler.autosave").as()->set_markup(Glib::ustring::compose(_("Your work has been saved under %1 ."), m_saveFile));
- }else{
+ } else {
m_builder("label:crashhandler.autosave").as()->set_text(_("There was no unsaved work."));
}
- CONNECT(m_dialog, delete_event, [this](GdkEventAny* /*ev*/) { quit(); return true; });
- CONNECT(m_builder("button:crashhandler.close").as(), clicked, [this]{ quit(); });
- CONNECT(m_refreshButton, clicked, [this]{ generate_backtrace(); });
+ CONNECT(m_dialog, delete_event, [this](GdkEventAny* /*ev*/) {
+ quit();
+ return true;
+ });
+ CONNECT(m_builder("button:crashhandler.close").as(), clicked, [this] { quit(); });
+ CONNECT(m_refreshButton, clicked, [this] { generate_backtrace(); });
add_window(*m_dialog);
m_dialog->show_all();
@@ -63,9 +64,8 @@
#endif
}
-void CrashHandler::generate_backtrace()
-{
- m_progressConnection = Glib::signal_timeout().connect([this]{ return pulse_progress(); }, 200);
+void CrashHandler::generate_backtrace() {
+ m_progressConnection = Glib::signal_timeout().connect([this] { return pulse_progress(); }, 200);
m_refreshButton->set_sensitive(false);
m_textview->set_sensitive(false);
m_textview->get_buffer()->set_text(Glib::ustring::compose("%1 %2 (rev %3)\n\n", PACKAGE_NAME, PACKAGE_VERSION, PACKAGE_REVISION));
@@ -75,7 +75,7 @@
int child_stdin;
int child_stdout;
try {
- Glib::spawn_async_with_pipes("", std::vector{"gdb", "-q", "-p", Glib::ustring::compose("%1", m_pid)}, Glib::SPAWN_DO_NOT_REAP_CHILD|Glib::SPAWN_SEARCH_PATH|Glib::SPAWN_STDERR_TO_DEV_NULL, sigc::slot(), &child_pid, &child_stdin, &child_stdout);
+ Glib::spawn_async_with_pipes("", std::vector {"gdb", "-q", "-p", Glib::ustring::compose("%1", m_pid)}, Glib::SPAWN_DO_NOT_REAP_CHILD|Glib::SPAWN_SEARCH_PATH|Glib::SPAWN_STDERR_TO_DEV_NULL, sigc::slot(), &child_pid, &child_stdin, &child_stdout);
} catch(Glib::Error&) {
generate_backtrace_end(false);
return;
@@ -85,7 +85,9 @@
Glib::RefPtr ch_out = Glib::IOChannel::create_from_fd(child_stdout);
Glib::RefPtr src_out = ch_out->create_watch(Glib::IO_IN|Glib::IO_HUP);
- src_out->connect([this, ch_out](Glib::IOCondition cond){ return handle_stdout(cond, ch_out); });
+ src_out->connect([this, ch_out](Glib::IOCondition cond) {
+ return handle_stdout(cond, ch_out);
+ });
src_out->attach(Glib::MainContext::get_default());
Glib::RefPtr ch_in = Glib::IOChannel::create_from_fd(child_stdin);
@@ -95,21 +97,20 @@
ch_in->write("quit\n");
}
-void CrashHandler::generate_backtrace_end(bool success)
-{
+void CrashHandler::generate_backtrace_end(bool success) {
m_progressConnection.disconnect();
m_progressBar->hide();
m_textview->set_sensitive(true);
m_refreshButton->set_sensitive(true);
if(!success) {
m_textview->get_buffer()->set_text(_("Failed to obtain backtrace. Is gdb installed?"));
- }else{
- std::vector lines = Utils::string_split(m_textview->get_buffer()->get_text(false), '\n');
+ } else {
+ std::vector lines = Utils::string_split(m_textview->get_buffer()->get_text(false), '\n', false);
Glib::ustring text = Glib::ustring::compose("%1\n\n", lines[0]);
- for(int i = 1, n = lines.size(); i < n; ++i){
- if(lines[i].substr(0, 6) == "Thread"){
+ for(int i = 1, n = lines.size(); i < n; ++i) {
+ if(lines[i].substr(0, 6) == "Thread") {
text += Glib::ustring::compose("\n%1\n", lines[i]);
- }else if(lines[i].substr(0, 1) == "#"){
+ } else if(lines[i].substr(0, 1) == "#") {
text += Glib::ustring::compose("%1\n", lines[i]);
}
}
@@ -119,15 +120,13 @@
m_textview->scroll_to(begin);
}
-bool CrashHandler::pulse_progress()
-{
+bool CrashHandler::pulse_progress() {
m_progressBar->pulse();
return true;
}
-bool CrashHandler::handle_stdout(Glib::IOCondition cond, Glib::RefPtr ch)
-{
- if(cond == Glib::IO_HUP){
+bool CrashHandler::handle_stdout(Glib::IOCondition cond, Glib::RefPtr ch) {
+ if(cond == Glib::IO_HUP) {
return false;
}
Glib::ustring text;
@@ -138,8 +137,7 @@
return true;
}
-void CrashHandler::handle_child_exit(GPid pid, gint status, void* data)
-{
+void CrashHandler::handle_child_exit(GPid pid, gint status, void* data) {
CrashHandler* instance = reinterpret_cast(data);
bool success = g_spawn_check_exit_status(status, nullptr);
instance->generate_backtrace_end(success);
diff -Nru gimagereader-3.1.99/gtk/src/Displayer.cc gimagereader-3.2.0/gtk/src/Displayer.cc
--- gimagereader-3.1.99/gtk/src/Displayer.cc 2016-10-13 21:45:35.000000000 +0000
+++ gimagereader-3.2.0/gtk/src/Displayer.cc 2016-11-23 22:08:53.000000000 +0000
@@ -28,8 +28,7 @@
#include
-Displayer::Displayer()
-{
+Displayer::Displayer() {
m_canvas = MAIN->getWidget("drawingarea:display");
m_viewport = MAIN->getWidget("viewport:display");
m_scrollwin = MAIN->getWidget("scrollwin:display");
@@ -61,48 +60,62 @@
m_scrollwin->drag_dest_set({Gtk::TargetEntry("text/uri-list")}, Gtk::DEST_DEFAULT_MOTION | Gtk::DEST_DEFAULT_DROP, Gdk::ACTION_COPY | Gdk::ACTION_MOVE);
m_viewport->override_background_color(Gdk::RGBA("#a0a0a4"));
- m_connection_rotSpinChanged = CONNECT(m_rotspin, value_changed, [this]{ setAngle(m_rotspin->get_value()); });
- m_connection_pageSpinChanged = CONNECT(m_pagespin, value_changed, [this]{ setCurrentPage(m_pagespin->get_value_as_int()); });
- m_connection_briSpinChanged = CONNECT(m_brispin, value_changed, [this]{ queueRenderImage(); });
- m_connection_conSpinChanged = CONNECT(m_conspin, value_changed, [this]{ queueRenderImage(); });
- m_connection_resSpinChanged = CONNECT(m_resspin, value_changed, [this]{ queueRenderImage(); });
- m_connection_invcheckToggled = CONNECT(m_invcheck, toggled, [this]{ queueRenderImage(); });
- CONNECT(m_viewport, size_allocate, [this](Gdk::Rectangle&){ resizeEvent(); });
- CONNECT(m_viewport, motion_notify_event, [this](GdkEventMotion* ev){ return mouseMoveEvent(ev); });
- CONNECT(m_viewport, button_press_event, [this](GdkEventButton* ev){ return mousePressEvent(ev); });
- CONNECT(m_viewport, button_release_event, [this](GdkEventButton* ev){ return mouseReleaseEvent(ev); });
- CONNECT(m_viewport, scroll_event, [this](GdkEventScroll* ev){ return scrollEvent(ev); });
- CONNECT(m_canvas, draw, [this](const Cairo::RefPtr& ctx){ drawCanvas(ctx); return false; });
- CONNECT(m_zoominbtn, clicked, [this]{ setZoom(Zoom::In); });
- CONNECT(m_zoomoutbtn, clicked, [this]{ setZoom(Zoom::Out); });
- m_connection_zoomfitClicked = CONNECT(m_zoomfitbtn, clicked, [this]{ setZoom(Zoom::Fit); });
- m_connection_zoomoneClicked = CONNECT(m_zoomonebtn, clicked, [this]{ setZoom(Zoom::One); });
+ m_connection_rotSpinChanged = CONNECT(m_rotspin, value_changed, [this] { setAngle(m_rotspin->get_value()); });
+ m_connection_pageSpinChanged = CONNECT(m_pagespin, value_changed, [this] { setCurrentPage(m_pagespin->get_value_as_int()); });
+ m_connection_briSpinChanged = CONNECT(m_brispin, value_changed, [this] { queueRenderImage(); });
+ m_connection_conSpinChanged = CONNECT(m_conspin, value_changed, [this] { queueRenderImage(); });
+ m_connection_resSpinChanged = CONNECT(m_resspin, value_changed, [this] { queueRenderImage(); });
+ m_connection_invcheckToggled = CONNECT(m_invcheck, toggled, [this] { queueRenderImage(); });
+ CONNECT(m_viewport, size_allocate, [this](Gdk::Rectangle&) {
+ resizeEvent();
+ });
+ CONNECT(m_viewport, key_press_event, [this](GdkEventKey* ev) {
+ return keyPressEvent(ev);
+ });
+ CONNECT(m_viewport, motion_notify_event, [this](GdkEventMotion* ev) {
+ return mouseMoveEvent(ev);
+ });
+ CONNECT(m_viewport, button_press_event, [this](GdkEventButton* ev) {
+ return mousePressEvent(ev);
+ });
+ CONNECT(m_viewport, button_release_event, [this](GdkEventButton* ev) {
+ return mouseReleaseEvent(ev);
+ });
+ CONNECT(m_viewport, scroll_event, [this](GdkEventScroll* ev) {
+ return scrollEvent(ev);
+ });
+ CONNECT(m_canvas, draw, [this](const Cairo::RefPtr& ctx) {
+ drawCanvas(ctx);
+ return false;
+ });
+ CONNECT(m_zoominbtn, clicked, [this] { setZoom(Zoom::In); });
+ CONNECT(m_zoomoutbtn, clicked, [this] { setZoom(Zoom::Out); });
+ m_connection_zoomfitClicked = CONNECT(m_zoomfitbtn, clicked, [this] { setZoom(Zoom::Fit); });
+ m_connection_zoomoneClicked = CONNECT(m_zoomonebtn, clicked, [this] { setZoom(Zoom::One); });
CONNECT(MAIN->getWidget("spin:display.rotate").as(), icon_press, [this](Gtk::EntryIconPosition pos, const GdkEventButton*) {
setAngle(m_rotspin->get_value() + (pos == Gtk::ENTRY_ICON_PRIMARY ? -90 : 90));
});
- CONNECT(MAIN->getWidget("applicationwindow:main").as()->get_style_context(), changed, [this]{ m_canvas->queue_draw(); });
+ CONNECT(MAIN->getWidget("applicationwindow:main").as()->get_style_context(), changed, [this] { m_canvas->queue_draw(); });
CONNECT(m_scrollwin, drag_data_received, sigc::ptr_fun(Utils::handle_drag_drop));
}
-void Displayer::drawCanvas(const Cairo::RefPtr &ctx)
-{
- if(!m_imageItem){
+void Displayer::drawCanvas(const Cairo::RefPtr &ctx) {
+ if(!m_imageItem) {
return;
}
Gtk::Allocation alloc = m_canvas->get_allocation();
ctx->translate(Utils::round(0.5 * alloc.get_width()), Utils::round(0.5 * alloc.get_height()));
ctx->scale(m_scale, m_scale);
m_imageItem->draw(ctx);
- for(const DisplayerItem* item : m_items){
+ for(const DisplayerItem* item : m_items) {
if(item->visible()) {
item->draw(ctx);
}
}
}
-void Displayer::positionCanvas()
-{
+void Displayer::positionCanvas() {
Geometry::Rectangle bb = getSceneBoundingRect();
m_canvas->set_size_request(Utils::round(bb.width * m_scale), Utils::round(bb.height * m_scale));
// Immediately resize viewport, so that adjustment values are correct below
@@ -113,8 +126,7 @@
m_canvas->queue_draw();
}
-std::string Displayer::getCurrentImage(int& page) const
-{
+std::string Displayer::getCurrentImage(int& page) const {
auto it = m_pageMap.find(m_pagespin->get_value_as_int());
if(it != m_pageMap.end()) {
page = it->second.second;
@@ -123,8 +135,7 @@
return "";
}
-bool Displayer::setCurrentPage(int page)
-{
+bool Displayer::setCurrentPage(int page) {
if(m_sources.empty()) {
return false;
}
@@ -136,13 +147,13 @@
delete m_renderer;
std::string filename = source->file->get_path();
#ifdef G_OS_WIN32
- if(Glib::ustring(filename.substr(filename.length() - 4)).lowercase() == ".pdf"){
+ if(Glib::ustring(filename.substr(filename.length() - 4)).lowercase() == ".pdf") {
#else
- if(Utils::get_content_type(filename) == "application/pdf"){
+ if(Utils::get_content_type(filename) == "application/pdf") {
#endif
m_renderer = new PDFRenderer(filename);
if(source->resolution == -1) source->resolution = 300;
- }else{
+ } else {
m_renderer = new ImageRenderer(filename);
if(source->resolution == -1) source->resolution = 100;
}
@@ -159,12 +170,11 @@
return renderImage();
}
-bool Displayer::setSources(std::vector sources)
-{
+bool Displayer::setSources(std::vector sources) {
if(sources == m_sources) {
return true;
}
- if(m_scaleThread){
+ if(m_scaleThread) {
sendScaleRequest({ScaleRequest::Quit});
m_scaleThread->join();
m_scaleThread = nullptr;
@@ -184,7 +194,7 @@
m_sources.clear();
m_pageMap.clear();
m_canvas->hide();
- m_pagespin->set_value(1);
+ m_pagespin->set_range(1, 1);
m_rotspin->set_value(0);
m_brispin->set_value(0);
m_conspin->set_value(0);
@@ -197,7 +207,7 @@
if(m_viewport->get_window()) m_viewport->get_window()->set_cursor();
m_sources = sources;
- if(sources.empty()){
+ if(sources.empty()) {
return false;
}
@@ -205,13 +215,12 @@
for(Source* source : m_sources) {
std::string filename = source->file->get_path();
#ifdef G_OS_WIN32
- if(Glib::ustring(filename.substr(filename.length() - 4)).lowercase() == ".pdf"){
+ if(Glib::ustring(filename.substr(filename.length() - 4)).lowercase() == ".pdf") {
#else
- if(Utils::get_content_type(filename) == "application/pdf"){
+ if(Utils::get_content_type(filename) == "application/pdf") {
#endif
PDFRenderer r(filename);
- for(int pdfPage = 1, nPdfPages = r.getNPages(); pdfPage <= nPdfPages; ++pdfPage)
- {
+ for(int pdfPage = 1, nPdfPages = r.getNPages(); pdfPage <= nPdfPages; ++pdfPage) {
m_pageMap.insert(std::make_pair(++page, std::make_pair(source, pdfPage)));
}
} else {
@@ -227,37 +236,33 @@
m_imageItem = new DisplayerImageItem;
if(!setCurrentPage(1)) {
- setSources(std::vector());
+ g_assert_nonnull(m_currentSource);
Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Failed to load image"), Glib::ustring::compose(_("The file might not be an image or be corrupt:\n%1"), m_currentSource->displayname));
+ setSources(std::vector());
return false;
}
return true;
}
-bool Displayer::hasMultipleOCRAreas()
-{
+bool Displayer::hasMultipleOCRAreas() {
return m_tool->hasMultipleOCRAreas();
}
-std::vector> Displayer::getOCRAreas()
-{
+std::vector> Displayer::getOCRAreas() {
return m_tool->getOCRAreas();
}
-bool Displayer::allowAutodetectOCRAreas() const
-{
+bool Displayer::allowAutodetectOCRAreas() const {
return m_tool->allowAutodetectOCRAreas();
}
-void Displayer::autodetectOCRAreas()
-{
+void Displayer::autodetectOCRAreas() {
m_tool->autodetectOCRAreas();
}
-bool Displayer::renderImage()
-{
+bool Displayer::renderImage() {
sendScaleRequest({ScaleRequest::Abort});
- if(m_currentSource->resolution != m_resspin->get_value_as_int()){
+ if(m_currentSource->resolution != m_resspin->get_value_as_int()) {
double factor = double(m_resspin->get_value_as_int()) / double(m_currentSource->resolution);
if(m_tool) {
m_tool->resolutionChanged(factor);
@@ -277,16 +282,15 @@
m_imageItem->setImage(m_image);
m_imageItem->setRect(Geometry::Rectangle(-0.5 * m_image->get_width(), -0.5 * m_image->get_height(), m_image->get_width(), m_image->get_height()));
setAngle(m_rotspin->get_value());
- if(m_scale < 1.0){
+ if(m_scale < 1.0) {
ScaleRequest request = {ScaleRequest::Scale, m_scale, m_currentSource->resolution, m_currentSource->page, m_currentSource->brightness, m_currentSource->contrast, m_currentSource->invert};
- m_scaleTimer = Glib::signal_timeout().connect([this,request]{ sendScaleRequest(request); return false; }, 100);
+ m_scaleTimer = Glib::signal_timeout().connect([this,request] { sendScaleRequest(request); return false; }, 100);
}
return true;
}
-void Displayer::setZoom(Zoom zoom)
-{
- if(!m_image){
+void Displayer::setZoom(Zoom zoom) {
+ if(!m_image) {
return;
}
sendScaleRequest({ScaleRequest::Abort});
@@ -297,15 +301,15 @@
Geometry::Rectangle bb = getSceneBoundingRect();
double fit = std::min(alloc.get_width() / bb.width, alloc.get_height() / bb.height);
- if(zoom == Zoom::In){
+ if(zoom == Zoom::In) {
m_scale = std::min(10., m_scale * 1.25);
- }else if(zoom == Zoom::Out){
+ } else if(zoom == Zoom::Out) {
m_scale = std::max(0.05, m_scale * 0.8);
- }else if(zoom == Zoom::One){
+ } else if(zoom == Zoom::One) {
m_scale = 1.0;
}
m_zoomfitbtn->set_active(false);
- if(zoom == Zoom::Fit || (m_scale / fit >= 0.9 && m_scale / fit <= 1.09)){
+ if(zoom == Zoom::Fit || (m_scale / fit >= 0.9 && m_scale / fit <= 1.09)) {
m_scale = fit;
m_zoomfitbtn->set_active(true);
}
@@ -315,10 +319,10 @@
m_zoomoutbtn->set_sensitive(m_scale > 0.05);
m_zoominbtn->set_sensitive(m_scale < 10.);
m_zoomonebtn->set_active(m_scale == 1.);
- if(m_scale < 1.0){
+ if(m_scale < 1.0) {
ScaleRequest request = {ScaleRequest::Scale, m_scale, m_currentSource->resolution, m_currentSource->page, m_currentSource->brightness, m_currentSource->contrast, m_currentSource->invert};
- m_scaleTimer = Glib::signal_timeout().connect([this,request]{ sendScaleRequest(request); return false; }, 100);
- }else{
+ m_scaleTimer = Glib::signal_timeout().connect([this,request] { sendScaleRequest(request); return false; }, 100);
+ } else {
m_imageItem->setImage(m_image);
}
positionCanvas();
@@ -327,9 +331,8 @@
m_connection_zoomoneClicked.block(false);
}
-void Displayer::setAngle(double angle)
-{
- if(m_image){
+void Displayer::setAngle(double angle) {
+ if(m_image) {
angle = angle < 0 ? angle + 360. : angle >= 360 ? angle - 360 : angle,
Utils::set_spin_blocked(m_rotspin, angle, m_connection_rotSpinChanged);
angle *= M_PI / 180.;
@@ -339,22 +342,20 @@
if(m_tool) {
m_tool->rotationChanged(delta);
}
- if(m_zoomfitbtn->get_active() == true){
+ if(m_zoomfitbtn->get_active() == true) {
setZoom(Zoom::Fit);
- }else{
+ } else {
positionCanvas();
}
}
}
-void Displayer::setResolution(int resolution)
-{
+void Displayer::setResolution(int resolution) {
Utils::set_spin_blocked(m_resspin, resolution, m_connection_resSpinChanged);
renderImage();
}
-void Displayer::setCursor(Glib::RefPtr cursor)
-{
+void Displayer::setCursor(Glib::RefPtr cursor) {
if(cursor) {
m_viewport->get_window()->set_cursor(cursor);
} else {
@@ -362,31 +363,29 @@
}
}
-void Displayer::queueRenderImage()
-{
- if(m_image){
+void Displayer::queueRenderImage() {
+ if(m_image) {
m_renderTimer.disconnect();
- m_renderTimer = Glib::signal_timeout().connect([this]{ renderImage(); return false; }, 200);
+ m_renderTimer = Glib::signal_timeout().connect([this] { renderImage(); return false; }, 200);
}
}
-void Displayer::resizeEvent()
-{
- if(m_zoomfitbtn->get_active() == true){
+void Displayer::resizeEvent() {
+ if(m_zoomfitbtn->get_active() == true) {
setZoom(Zoom::Fit);
}
}
-bool Displayer::mousePressEvent(GdkEventButton* ev)
-{
- if(ev->button == 2){
+bool Displayer::mousePressEvent(GdkEventButton* ev) {
+ m_viewport->grab_focus();
+ if(ev->button == 2) {
m_panPos[0] = ev->x_root;
m_panPos[1] = ev->y_root;
return true;
}
Geometry::Point scenePos = mapToSceneClamped(Geometry::Point(ev->x, ev->y));
- for(DisplayerItem* item : Utils::reverse(m_items)){
- if(item->rect().contains(scenePos)){
+ for(DisplayerItem* item : Utils::reverse(m_items)) {
+ if(item->rect().contains(scenePos)) {
m_activeItem = item;
break;
}
@@ -400,8 +399,19 @@
return false;
}
-bool Displayer::mouseMoveEvent(GdkEventMotion *ev)
-{
+bool Displayer::keyPressEvent(GdkEventKey* ev) {
+ if(ev->keyval == GDK_KEY_Page_Up) {
+ m_pagespin->set_value(m_pagespin->get_value_as_int() - 1);
+ return true;
+ } else if(ev->keyval == GDK_KEY_Page_Down) {
+ m_pagespin->set_value(m_pagespin->get_value_as_int() + 1);
+ return true;
+ } else {
+ return false;
+ }
+}
+
+bool Displayer::mouseMoveEvent(GdkEventMotion *ev) {
if(ev->state & Gdk::BUTTON2_MASK) {
double dx = m_panPos[0] - ev->x_root;
double dy = m_panPos[1] - ev->y_root;
@@ -416,8 +426,8 @@
}
bool overItem = false;
Geometry::Point scenePos = mapToSceneClamped(Geometry::Point(ev->x, ev->y));
- for(DisplayerItem* item : Utils::reverse(m_items)){
- if(item->rect().contains(scenePos)){
+ for(DisplayerItem* item : Utils::reverse(m_items)) {
+ if(item->rect().contains(scenePos)) {
overItem = true;
if(item->mouseMoveEvent(ev)) {
return true;
@@ -434,8 +444,7 @@
return false;
}
-bool Displayer::mouseReleaseEvent(GdkEventButton* ev)
-{
+bool Displayer::mouseReleaseEvent(GdkEventButton* ev) {
if(m_activeItem) {
bool accepted = m_activeItem->mouseReleaseEvent(ev);
m_activeItem = nullptr;
@@ -449,22 +458,21 @@
return false;
}
-bool Displayer::scrollEvent(GdkEventScroll *ev)
-{
- if((ev->state & Gdk::CONTROL_MASK) != 0){
- if((ev->direction == GDK_SCROLL_UP || (ev->direction == GDK_SCROLL_SMOOTH && ev->delta_y < 0)) && m_scale * 1.25 < 10){
+bool Displayer::scrollEvent(GdkEventScroll *ev) {
+ if((ev->state & Gdk::CONTROL_MASK) != 0) {
+ if((ev->direction == GDK_SCROLL_UP || (ev->direction == GDK_SCROLL_SMOOTH && ev->delta_y < 0)) && m_scale * 1.25 < 10) {
Gtk::Allocation alloc = m_canvas->get_allocation();
m_scrollPos[0] = std::max(0., std::min((ev->x + m_hadj->get_value() - alloc.get_x())/alloc.get_width(), 1.0));
m_scrollPos[1] = std::max(0., std::min((ev->y + m_vadj->get_value() - alloc.get_y())/alloc.get_height(), 1.0));
setZoom(Zoom::In);
- }else if((ev->direction == GDK_SCROLL_DOWN || (ev->direction == GDK_SCROLL_SMOOTH && ev->delta_y > 0)) && m_scale * 0.8 > 0.05){
+ } else if((ev->direction == GDK_SCROLL_DOWN || (ev->direction == GDK_SCROLL_SMOOTH && ev->delta_y > 0)) && m_scale * 0.8 > 0.05) {
setZoom(Zoom::Out);
}
return true;
- }else if((ev->state & Gdk::SHIFT_MASK) != 0){
- if(ev->direction == GDK_SCROLL_UP || (ev->direction == GDK_SCROLL_SMOOTH && ev->delta_y < 0)){
+ } else if((ev->state & Gdk::SHIFT_MASK) != 0) {
+ if(ev->direction == GDK_SCROLL_UP || (ev->direction == GDK_SCROLL_SMOOTH && ev->delta_y < 0)) {
m_hadj->set_value(m_hadj->get_value() - m_hadj->get_step_increment());
- }else if(ev->direction == GDK_SCROLL_DOWN || (ev->direction == GDK_SCROLL_SMOOTH && ev->delta_y > 0)){
+ } else if(ev->direction == GDK_SCROLL_DOWN || (ev->direction == GDK_SCROLL_SMOOTH && ev->delta_y > 0)) {
m_hadj->set_value(m_hadj->get_value() + m_hadj->get_step_increment());
}
return true;
@@ -472,22 +480,20 @@
return false;
}
-void Displayer::ensureVisible(double evx, double evy)
-{
- if(evx - 30. < m_hadj->get_value()){
+void Displayer::ensureVisible(double evx, double evy) {
+ if(evx - 30. < m_hadj->get_value()) {
m_hadj->set_value(std::max(0., evx - 30.));
- }else if(evx + 30. > m_hadj->get_value() + m_hadj->get_page_size()){
+ } else if(evx + 30. > m_hadj->get_value() + m_hadj->get_page_size()) {
m_hadj->set_value(std::min(m_hadj->get_upper(), evx + 30.) - m_hadj->get_page_size());
}
- if(evy - 30.< m_vadj->get_value()){
+ if(evy - 30.< m_vadj->get_value()) {
m_vadj->set_value(std::max(0., evy - 30.));
- }else if(evy + 30. > m_vadj->get_value() + m_vadj->get_page_size()){
+ } else if(evy + 30. > m_vadj->get_value() + m_vadj->get_page_size()) {
m_vadj->set_value(std::min(m_vadj->get_upper(), evy + 30.) - m_vadj->get_page_size());
}
}
-void Displayer::addItem(DisplayerItem* item)
-{
+void Displayer::addItem(DisplayerItem* item) {
if(!m_items.empty())
item->setZIndex(m_items.back()->zIndex() + 1);
m_items.push_back(item);
@@ -495,8 +501,7 @@
invalidateRect(item->rect());
}
-void Displayer::removeItem(DisplayerItem* item)
-{
+void Displayer::removeItem(DisplayerItem* item) {
if(item == m_activeItem) {
m_activeItem = nullptr;
}
@@ -505,8 +510,7 @@
invalidateRect(item->rect());
}
-void Displayer::invalidateRect(const Geometry::Rectangle &rect)
-{
+void Displayer::invalidateRect(const Geometry::Rectangle &rect) {
Gtk::Allocation alloc = m_canvas->get_allocation();
Geometry::Rectangle canvasRect = rect;
canvasRect.x = (canvasRect.x * m_scale + 0.5 * alloc.get_width()) - 2;
@@ -516,13 +520,11 @@
m_canvas->queue_draw_area(canvasRect.x, canvasRect.y, canvasRect.width, canvasRect.height);
}
-void Displayer::resortItems()
-{
+void Displayer::resortItems() {
std::sort(m_items.begin(), m_items.end(), DisplayerItem::zIndexCmp);
}
-Geometry::Rectangle Displayer::getSceneBoundingRect() const
-{
+Geometry::Rectangle Displayer::getSceneBoundingRect() const {
int w = m_image->get_width();
int h = m_image->get_height();
Geometry::Rotation R(m_currentSource->angle);
@@ -531,8 +533,7 @@
return Geometry::Rectangle(-0.5 * width, -0.5 * height, width, height);
}
-Geometry::Point Displayer::mapToSceneClamped(const Geometry::Point& p) const
-{
+Geometry::Point Displayer::mapToSceneClamped(const Geometry::Point& p) const {
// Selection coordinates are with respect to the center of the image in unscaled (but rotated) coordinates
Gtk::Allocation alloc = m_canvas->get_allocation();
double x = (std::max(0., std::min(p.x - alloc.get_x(), double(alloc.get_width()))) - 0.5 * alloc.get_width()) / m_scale;
@@ -540,22 +541,20 @@
return Geometry::Point(x, y);
}
-Cairo::RefPtr Displayer::getImage(const Geometry::Rectangle &rect) const
-{
+Cairo::RefPtr Displayer::getImage(const Geometry::Rectangle &rect) const {
Cairo::RefPtr surf = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, std::ceil(rect.width), std::ceil(rect.height));
- Cairo::RefPtr ctx = Cairo::Context::create(surf);
- ctx->set_source_rgba(1., 1., 1., 1.);
- ctx->paint();
- ctx->translate(-rect.x, -rect.y);
- ctx->rotate(m_currentSource->angle);
- ctx->translate(-0.5 * m_image->get_width(), -0.5 * m_image->get_height());
- ctx->set_source(m_image, 0, 0);
- ctx->paint();
- return surf;
+ Cairo::RefPtr ctx = Cairo::Context::create(surf);
+ ctx->set_source_rgba(1., 1., 1., 1.);
+ ctx->paint();
+ ctx->translate(-rect.x, -rect.y);
+ ctx->rotate(m_currentSource->angle);
+ ctx->translate(-0.5 * m_image->get_width(), -0.5 * m_image->get_height());
+ ctx->set_source(m_image, 0, 0);
+ ctx->paint();
+ return surf;
}
-void Displayer::sendScaleRequest(const ScaleRequest& request)
-{
+void Displayer::sendScaleRequest(const ScaleRequest& request) {
m_scaleTimer.disconnect();
m_scaleMutex.lock();
m_scaleRequests.push(request);
@@ -563,23 +562,22 @@
m_scaleMutex.unlock();
}
-void Displayer::scaleThread()
-{
+void Displayer::scaleThread() {
m_scaleMutex.lock();
- while(true){
- while(m_scaleRequests.empty()){
+ while(true) {
+ while(m_scaleRequests.empty()) {
m_scaleCond.wait(m_scaleMutex);
}
ScaleRequest req = m_scaleRequests.front();
m_scaleRequests.pop();
- if(req.type == ScaleRequest::Quit){
+ if(req.type == ScaleRequest::Quit) {
break;
- }else if(req.type == ScaleRequest::Scale){
+ } else if(req.type == ScaleRequest::Scale) {
m_scaleMutex.unlock();
Cairo::RefPtr image = m_renderer->render(req.page, 2 * req.scale * req.resolution);
m_scaleMutex.lock();
- if(!m_scaleRequests.empty() && m_scaleRequests.front().type == ScaleRequest::Abort){
+ if(!m_scaleRequests.empty() && m_scaleRequests.front().type == ScaleRequest::Abort) {
m_scaleRequests.pop();
continue;
}
@@ -588,26 +586,25 @@
m_renderer->adjustImage(image, req.brightness, req.contrast, req.invert);
m_scaleMutex.lock();
- if(!m_scaleRequests.empty() && m_scaleRequests.front().type == ScaleRequest::Abort){
+ if(!m_scaleRequests.empty() && m_scaleRequests.front().type == ScaleRequest::Abort) {
m_scaleRequests.pop();
continue;
}
m_scaleMutex.unlock();
double scale = req.scale;
- Glib::signal_idle().connect_once([this,image,scale]{ setScaledImage(image, scale); });
+ Glib::signal_idle().connect_once([this,image,scale] { setScaledImage(image, scale); });
m_scaleMutex.lock();
}
};
m_scaleMutex.unlock();
}
-void Displayer::setScaledImage(Cairo::RefPtr image, double scale)
-{
+void Displayer::setScaledImage(Cairo::RefPtr image, double scale) {
m_scaleMutex.lock();
- if(!m_scaleRequests.empty() && m_scaleRequests.front().type == ScaleRequest::Abort){
+ if(!m_scaleRequests.empty() && m_scaleRequests.front().type == ScaleRequest::Abort) {
m_scaleRequests.pop();
- }else{
+ } else {
m_imageItem->setImage(image);
m_canvas->queue_draw();
}
@@ -616,8 +613,7 @@
///////////////////////////////////////////////////////////////////////////////
-void DisplayerItem::setZIndex(int zIndex)
-{
+void DisplayerItem::setZIndex(int zIndex) {
m_zIndex = zIndex;
if(m_displayer) {
m_displayer->invalidateRect(m_rect);
@@ -625,28 +621,24 @@
}
}
-void DisplayerItem::setRect(const Geometry::Rectangle &rect)
-{
+void DisplayerItem::setRect(const Geometry::Rectangle &rect) {
Geometry::Rectangle invalidateArea = m_rect.unite(rect);
m_rect = rect;
if(m_displayer)
m_displayer->invalidateRect(invalidateArea);
}
-void DisplayerItem::setVisible(bool visible)
-{
+void DisplayerItem::setVisible(bool visible) {
m_visible = visible;
update();
}
-void DisplayerItem::update()
-{
+void DisplayerItem::update() {
if(m_displayer)
m_displayer->invalidateRect(m_rect);
}
-void DisplayerImageItem::draw(Cairo::RefPtr ctx) const
-{
+void DisplayerImageItem::draw(Cairo::RefPtr ctx) const {
if(m_image) {
double sx = rect().width / m_image->get_width();
double sy = rect().height / m_image->get_height();
@@ -661,8 +653,7 @@
}
-void DisplayerSelection::draw(Cairo::RefPtr ctx) const
-{
+void DisplayerSelection::draw(Cairo::RefPtr ctx) const {
Gdk::RGBA bgcolor("#4A90D9");
double scale = displayer()->getCurrentScale();
@@ -684,23 +675,22 @@
ctx->restore();
}
-bool DisplayerSelection::mousePressEvent(GdkEventButton *event)
-{
+bool DisplayerSelection::mousePressEvent(GdkEventButton *event) {
if(event->button == 1) {
Geometry::Point p = displayer()->mapToSceneClamped(Geometry::Point(event->x, event->y));
double tol = 10.0 / displayer()->getCurrentScale();
m_resizeOffset = Geometry::Point(0., 0.);
- if(std::abs(m_point.x - p.x) < tol){ // pointx
+ if(std::abs(m_point.x - p.x) < tol) { // pointx
m_resizeHandlers.push_back(resizePointX);
m_resizeOffset.x = p.x - m_point.x;
- }else if(std::abs(m_anchor.x - p.x) < tol){ // anchorx
+ } else if(std::abs(m_anchor.x - p.x) < tol) { // anchorx
m_resizeHandlers.push_back(resizeAnchorX);
m_resizeOffset.x = p.x - m_anchor.x;
}
- if(std::abs(m_point.y - p.y) < tol){ // pointy
+ if(std::abs(m_point.y - p.y) < tol) { // pointy
m_resizeHandlers.push_back(resizePointY);
m_resizeOffset.y = p.y - m_point.y;
- }else if(std::abs(m_anchor.y - p.y) < tol){ // anchory
+ } else if(std::abs(m_anchor.y - p.y) < tol) { // anchory
m_resizeHandlers.push_back(resizeAnchorY);
m_resizeOffset.y = p.y - m_anchor.y;
}
@@ -711,14 +701,12 @@
return false;
}
-bool DisplayerSelection::mouseReleaseEvent(GdkEventButton */*event*/)
-{
+bool DisplayerSelection::mouseReleaseEvent(GdkEventButton */*event*/) {
m_resizeHandlers.clear();
return false;
}
-bool DisplayerSelection::mouseMoveEvent(GdkEventMotion *event)
-{
+bool DisplayerSelection::mouseMoveEvent(GdkEventMotion *event) {
Geometry::Point p = displayer()->mapToSceneClamped(Geometry::Point(event->x, event->y));
if(m_resizeHandlers.empty()) {
double tol = 10.0 / displayer()->getCurrentScale();
@@ -728,15 +716,15 @@
bool top = std::abs(rect().y - p.y) < tol;
bool bottom = std::abs(rect().y + rect().height - p.y) < tol;
- if((top && left) || (bottom && right)){
+ if((top && left) || (bottom && right)) {
displayer()->setCursor(Gdk::Cursor::create(MAIN->getWindow()->get_display(), "nwse-resize"));
- }else if((top && right) || (bottom && left)){
+ } else if((top && right) || (bottom && left)) {
displayer()->setCursor(Gdk::Cursor::create(MAIN->getWindow()->get_display(), "nesw-resize"));
- }else if(top || bottom){
+ } else if(top || bottom) {
displayer()->setCursor(Gdk::Cursor::create(MAIN->getWindow()->get_display(), "ns-resize"));
- }else if(left || right){
+ } else if(left || right) {
displayer()->setCursor(Gdk::Cursor::create(MAIN->getWindow()->get_display(), "ew-resize"));
- }else{
+ } else {
displayer()->setCursor(Glib::RefPtr(0));
}
}
@@ -744,8 +732,8 @@
Geometry::Rectangle bb = displayer()->getSceneBoundingRect();
movePos.x = std::min(std::max(bb.x, movePos.x), bb.x + bb.width);
movePos.y = std::min(std::max(bb.y, movePos.y), bb.y + bb.height);
- if(!m_resizeHandlers.empty()){
- for(const ResizeHandler& handler : m_resizeHandlers){
+ if(!m_resizeHandlers.empty()) {
+ for(const ResizeHandler& handler : m_resizeHandlers) {
handler(movePos, m_anchor, m_point);
}
setRect(Geometry::Rectangle(m_anchor, m_point));
diff -Nru gimagereader-3.1.99/gtk/src/Displayer.hh gimagereader-3.2.0/gtk/src/Displayer.hh
--- gimagereader-3.1.99/gtk/src/Displayer.hh 2016-10-13 21:45:35.000000000 +0000
+++ gimagereader-3.2.0/gtk/src/Displayer.hh 2016-11-23 22:08:53.000000000 +0000
@@ -37,21 +37,37 @@
class Displayer {
public:
Displayer();
- ~Displayer(){ setSources(std::vector()); }
- void setTool(DisplayerTool* tool) { m_tool = tool; }
+ ~Displayer() {
+ setSources(std::vector());
+ }
+ void setTool(DisplayerTool* tool) {
+ m_tool = tool;
+ }
bool setSources(const std::vector sources);
- int getCurrentPage() const{ return m_pagespin->get_value_as_int(); }
+ int getCurrentPage() const {
+ return m_pagespin->get_value_as_int();
+ }
bool setCurrentPage(int page);
- double getCurrentAngle() const{ return m_rotspin->get_value(); }
- double getCurrentScale() const{ return m_scale; }
+ double getCurrentAngle() const {
+ return m_rotspin->get_value();
+ }
+ double getCurrentScale() const {
+ return m_scale;
+ }
void setAngle(double angle);
- int getCurrentResolution(){ return m_resspin->get_value_as_int(); }
+ int getCurrentResolution() {
+ return m_resspin->get_value_as_int();
+ }
void setResolution(int resolution);
std::string getCurrentImage(int& page) const;
Cairo::RefPtr getImage(const Geometry::Rectangle& rect) const;
Geometry::Rectangle getSceneBoundingRect() const;
Geometry::Point mapToSceneClamped(const Geometry::Point& p) const;
- int getNPages(){ double min, max; m_pagespin->get_range(min, max); return int(max); }
+ int getNPages() {
+ double min, max;
+ m_pagespin->get_range(min, max);
+ return int(max);
+ }
bool hasMultipleOCRAreas();
std::vector> getOCRAreas();
bool allowAutodetectOCRAreas() const;
@@ -108,6 +124,7 @@
sigc::connection m_connection_zoomoneClicked;
void resizeEvent();
+ bool keyPressEvent(GdkEventKey* ev);
bool mouseMoveEvent(GdkEventMotion* ev);
bool mousePressEvent(GdkEventButton* ev);
bool mouseReleaseEvent(GdkEventButton* ev);
@@ -146,22 +163,36 @@
class DisplayerItem {
public:
friend class Displayer;
- virtual ~DisplayerItem(){}
+ virtual ~DisplayerItem() {}
- Displayer* displayer() const{ return m_displayer; }
+ Displayer* displayer() const {
+ return m_displayer;
+ }
void setZIndex(int zIndex);
- double zIndex() const{ return m_zIndex; }
+ double zIndex() const {
+ return m_zIndex;
+ }
void setRect(const Geometry::Rectangle& rect);
- const Geometry::Rectangle& rect() const{ return m_rect; }
+ const Geometry::Rectangle& rect() const {
+ return m_rect;
+ }
void setVisible(bool visible);
- bool visible() const{ return m_visible; }
+ bool visible() const {
+ return m_visible;
+ }
void update();
virtual void draw(Cairo::RefPtr ctx) const = 0;
- virtual bool mousePressEvent(GdkEventButton */*event*/) { return false; }
- virtual bool mouseMoveEvent(GdkEventMotion */*event*/) { return false; }
- virtual bool mouseReleaseEvent(GdkEventButton */*event*/) { return false; }
+ virtual bool mousePressEvent(GdkEventButton */*event*/) {
+ return false;
+ }
+ virtual bool mouseMoveEvent(GdkEventMotion */*event*/) {
+ return false;
+ }
+ virtual bool mouseReleaseEvent(GdkEventButton */*event*/) {
+ return false;
+ }
static bool zIndexCmp(const DisplayerItem* lhs, const DisplayerItem* rhs) {
return lhs->m_zIndex < rhs->m_zIndex;
@@ -174,28 +205,29 @@
bool m_visible = true;
};
-class DisplayerImageItem : public DisplayerItem
-{
+class DisplayerImageItem : public DisplayerItem {
public:
using DisplayerItem::DisplayerItem;
void draw(Cairo::RefPtr ctx) const override;
- void setImage(Cairo::RefPtr image) { m_image = image; }
- void setRotation(double rotation) { m_rotation = rotation; }
+ void setImage(Cairo::RefPtr image) {
+ m_image = image;
+ }
+ void setRotation(double rotation) {
+ m_rotation = rotation;
+ }
protected:
Cairo::RefPtr m_image;
double m_rotation = 0.;
};
-class DisplayerSelection : public DisplayerItem
-{
+class DisplayerSelection : public DisplayerItem {
public:
DisplayerSelection(DisplayerTool* tool, const Geometry::Point& anchor)
- : m_tool(tool), m_anchor(anchor), m_point(anchor)
- {
+ : m_tool(tool), m_anchor(anchor), m_point(anchor) {
setRect(Geometry::Rectangle(anchor, anchor));
}
- void setPoint(const Geometry::Point& point){
+ void setPoint(const Geometry::Point& point) {
m_point = point;
setRect(Geometry::Rectangle(m_anchor, m_point));
}
@@ -204,16 +236,16 @@
m_point = point;
setRect(Geometry::Rectangle(m_anchor, m_point));
}
- void rotate(const Geometry::Rotation &R){
+ void rotate(const Geometry::Rotation &R) {
m_anchor = R.rotate(m_anchor);
m_point = R.rotate(m_point);
setRect(Geometry::Rectangle(m_anchor, m_point));
}
- void scale(double factor){
+ void scale(double factor) {
m_anchor = Geometry::Point(m_anchor.x * factor, m_anchor.y * factor);
m_point = Geometry::Point(m_point.x * factor, m_point.y * factor);
}
- sigc::signal signal_geometry_changed(){
+ sigc::signal signal_geometry_changed() {
return m_signalGeometryChanged;
}
@@ -236,28 +268,46 @@
Geometry::Point m_resizeOffset;
sigc::signal m_signalGeometryChanged;
- static void resizeAnchorX(const Geometry::Point& pos, Geometry::Point& anchor, Geometry::Point& /*point*/){ anchor.x = pos.x; }
- static void resizeAnchorY(const Geometry::Point& pos, Geometry::Point& anchor, Geometry::Point& /*point*/){ anchor.y = pos.y; }
- static void resizePointX(const Geometry::Point& pos, Geometry::Point& /*anchor*/, Geometry::Point& point){ point.x = pos.x; }
- static void resizePointY(const Geometry::Point& pos, Geometry::Point& /*anchor*/, Geometry::Point& point){ point.y = pos.y; }
+ static void resizeAnchorX(const Geometry::Point& pos, Geometry::Point& anchor, Geometry::Point& /*point*/) {
+ anchor.x = pos.x;
+ }
+ static void resizeAnchorY(const Geometry::Point& pos, Geometry::Point& anchor, Geometry::Point& /*point*/) {
+ anchor.y = pos.y;
+ }
+ static void resizePointX(const Geometry::Point& pos, Geometry::Point& /*anchor*/, Geometry::Point& point) {
+ point.x = pos.x;
+ }
+ static void resizePointY(const Geometry::Point& pos, Geometry::Point& /*anchor*/, Geometry::Point& point) {
+ point.y = pos.y;
+ }
};
class DisplayerTool {
public:
DisplayerTool(Displayer* displayer) : m_displayer(displayer) {}
- virtual ~DisplayerTool(){}
- virtual bool mousePressEvent(GdkEventButton */*event*/){ return false; }
- virtual bool mouseMoveEvent(GdkEventMotion */*event*/){ return false; }
- virtual bool mouseReleaseEvent(GdkEventButton */*event*/){ return false; }
- virtual void pageChanged(){}
- virtual void resolutionChanged(double /*factor*/){}
- virtual void rotationChanged(double /*delta*/){}
+ virtual ~DisplayerTool() {}
+ virtual bool mousePressEvent(GdkEventButton */*event*/) {
+ return false;
+ }
+ virtual bool mouseMoveEvent(GdkEventMotion */*event*/) {
+ return false;
+ }
+ virtual bool mouseReleaseEvent(GdkEventButton */*event*/) {
+ return false;
+ }
+ virtual void pageChanged() {}
+ virtual void resolutionChanged(double /*factor*/) {}
+ virtual void rotationChanged(double /*delta*/) {}
virtual std::vector> getOCRAreas() = 0;
- virtual bool hasMultipleOCRAreas() const{ return false; }
- virtual bool allowAutodetectOCRAreas() const{ return false; }
- virtual void autodetectOCRAreas(){}
- virtual void reset(){}
+ virtual bool hasMultipleOCRAreas() const {
+ return false;
+ }
+ virtual bool allowAutodetectOCRAreas() const {
+ return false;
+ }
+ virtual void autodetectOCRAreas() {}
+ virtual void reset() {}
protected:
Displayer* m_displayer;
diff -Nru gimagereader-3.1.99/gtk/src/DisplayerToolHOCR.cc gimagereader-3.2.0/gtk/src/DisplayerToolHOCR.cc
--- gimagereader-3.1.99/gtk/src/DisplayerToolHOCR.cc 2016-10-13 21:45:35.000000000 +0000
+++ gimagereader-3.2.0/gtk/src/DisplayerToolHOCR.cc 2016-11-23 22:08:53.000000000 +0000
@@ -24,26 +24,22 @@
DisplayerToolHOCR::DisplayerToolHOCR(Displayer *displayer)
- : DisplayerTool(displayer)
-{
+ : DisplayerTool(displayer) {
MAIN->getRecognizer()->setRecognizeMode(_("Recognize"));
}
-DisplayerToolHOCR::~DisplayerToolHOCR()
-{
+DisplayerToolHOCR::~DisplayerToolHOCR() {
clearSelection();
}
-std::vector> DisplayerToolHOCR::getOCRAreas()
-{
+std::vector> DisplayerToolHOCR::getOCRAreas() {
std::vector> surfaces;
surfaces.push_back(m_displayer->getImage(m_displayer->getSceneBoundingRect()));
return surfaces;
}
-bool DisplayerToolHOCR::mousePressEvent(GdkEventButton* event)
-{
- if(event->button == 1 && m_drawingSelection){
+bool DisplayerToolHOCR::mousePressEvent(GdkEventButton* event) {
+ if(event->button == 1 && m_drawingSelection) {
clearSelection();
m_selection = new DisplayerSelection(this, m_displayer->mapToSceneClamped(Geometry::Point(event->x, event->y)));
m_displayer->addItem(m_selection);
@@ -52,9 +48,8 @@
return false;
}
-bool DisplayerToolHOCR::mouseMoveEvent(GdkEventMotion* event)
-{
- if(m_selection && m_drawingSelection){
+bool DisplayerToolHOCR::mouseMoveEvent(GdkEventMotion* event) {
+ if(m_selection && m_drawingSelection) {
Geometry::Point p = m_displayer->mapToSceneClamped(Geometry::Point(event->x, event->y));
m_selection->setPoint(p);
m_displayer->ensureVisible(event->x, event->y);
@@ -63,12 +58,11 @@
return false;
}
-bool DisplayerToolHOCR::mouseReleaseEvent(GdkEventButton* /*event*/)
-{
- if(m_selection && m_drawingSelection){
- if(m_selection->rect().width < 5. || m_selection->rect().height < 5.){
+bool DisplayerToolHOCR::mouseReleaseEvent(GdkEventButton* /*event*/) {
+ if(m_selection && m_drawingSelection) {
+ if(m_selection->rect().width < 5. || m_selection->rect().height < 5.) {
clearSelection();
- }else{
+ } else {
Geometry::Rectangle sceneRect = m_displayer->getSceneBoundingRect();
Geometry::Rectangle r = m_selection->rect().translate(-sceneRect.x, -sceneRect.y);
m_signalSelectionDrawn.emit(Geometry::Rectangle(int(r.x), int(r.y), int(r.width), int(r.height)));
@@ -80,27 +74,26 @@
return false;
}
-void DisplayerToolHOCR::setSelection(const Geometry::Rectangle& rect)
-{
+void DisplayerToolHOCR::setSelection(const Geometry::Rectangle& rect) {
m_drawingSelection = false;
Geometry::Rectangle sceneRect = m_displayer->getSceneBoundingRect();
Geometry::Rectangle r = rect.translate(sceneRect.x, sceneRect.y);
if(!m_selection) {
m_selection = new DisplayerSelection(this, Geometry::Point(r.x, r.y));
- CONNECT(m_selection, geometry_changed, [this](const Geometry::Rectangle& rect){ selectionChanged(rect); });
+ CONNECT(m_selection, geometry_changed, [this](const Geometry::Rectangle& rect) {
+ selectionChanged(rect);
+ });
m_displayer->addItem(m_selection);
}
m_selection->setAnchorAndPoint(Geometry::Point(r.x, r.y), Geometry::Point(r.x + r.width, r.y + r.height));
}
-Cairo::RefPtr DisplayerToolHOCR::getSelection(const Geometry::Rectangle& rect)
-{
+Cairo::RefPtr DisplayerToolHOCR::getSelection(const Geometry::Rectangle& rect) {
Geometry::Rectangle sceneRect = m_displayer->getSceneBoundingRect();
return m_displayer->getImage(rect.translate(sceneRect.x, sceneRect.y));
}
-void DisplayerToolHOCR::clearSelection()
-{
+void DisplayerToolHOCR::clearSelection() {
if(m_selection) {
m_displayer->removeItem(m_selection);
delete m_selection;
@@ -108,8 +101,7 @@
}
}
-void DisplayerToolHOCR::selectionChanged(const Geometry::Rectangle& rect)
-{
+void DisplayerToolHOCR::selectionChanged(const Geometry::Rectangle& rect) {
Geometry::Rectangle sceneRect = m_displayer->getSceneBoundingRect();
Geometry::Rectangle r = rect.translate(-sceneRect.x, -sceneRect.y);
m_signalSelectionGeometryChanged.emit(Geometry::Rectangle(int(r.x), int(r.y), int(r.width), int(r.height)));
diff -Nru gimagereader-3.1.99/gtk/src/DisplayerToolHOCR.hh gimagereader-3.2.0/gtk/src/DisplayerToolHOCR.hh
--- gimagereader-3.1.99/gtk/src/DisplayerToolHOCR.hh 2016-10-13 21:45:35.000000000 +0000
+++ gimagereader-3.2.0/gtk/src/DisplayerToolHOCR.hh 2016-11-23 22:08:53.000000000 +0000
@@ -22,30 +22,45 @@
#include "Displayer.hh"
-namespace Geometry { class Rectangle; }
+namespace Geometry {
+class Rectangle;
+}
-class DisplayerToolHOCR : public DisplayerTool
-{
+class DisplayerToolHOCR : public DisplayerTool {
public:
DisplayerToolHOCR(Displayer* displayer);
~DisplayerToolHOCR();
std::vector> getOCRAreas() override;
- void pageChanged() override{ clearSelection(); }
- void resolutionChanged(double /*factor*/) override{ clearSelection(); }
- void rotationChanged(double /*delta*/) override{ clearSelection(); }
- void reset() override{ clearSelection(); }
+ void pageChanged() override {
+ clearSelection();
+ }
+ void resolutionChanged(double /*factor*/) override {
+ clearSelection();
+ }
+ void rotationChanged(double /*delta*/) override {
+ clearSelection();
+ }
+ void reset() override {
+ clearSelection();
+ }
bool mousePressEvent(GdkEventButton *event) override;
bool mouseMoveEvent(GdkEventMotion *event) override;
bool mouseReleaseEvent(GdkEventButton *event) override;
- void activateDrawSelection(){ m_drawingSelection = true; }
+ void activateDrawSelection() {
+ m_drawingSelection = true;
+ }
void setSelection(const Geometry::Rectangle& rect);
Cairo::RefPtr getSelection(const Geometry::Rectangle& rect);
void clearSelection();
- sigc::signal signal_selection_drawn(){ return m_signalSelectionDrawn; }
- sigc::signal signal_selection_geometry_changed(){ return m_signalSelectionGeometryChanged; }
+ sigc::signal signal_selection_drawn() {
+ return m_signalSelectionDrawn;
+ }
+ sigc::signal signal_selection_geometry_changed() {
+ return m_signalSelectionGeometryChanged;
+ }
private:
DisplayerSelection* m_selection = nullptr;
diff -Nru gimagereader-3.1.99/gtk/src/DisplayerToolSelect.cc gimagereader-3.2.0/gtk/src/DisplayerToolSelect.cc
--- gimagereader-3.1.99/gtk/src/DisplayerToolSelect.cc 2016-10-13 21:45:35.000000000 +0000
+++ gimagereader-3.2.0/gtk/src/DisplayerToolSelect.cc 2016-11-23 22:08:53.000000000 +0000
@@ -29,10 +29,9 @@
DisplayerToolSelect::DisplayerToolSelect(Displayer *displayer)
- : DisplayerTool(displayer)
-{
+ : DisplayerTool(displayer) {
Gtk::Button* autolayoutButton = MAIN->getWidget("button:main.autolayout");
- m_connectionAutolayout = CONNECT(autolayoutButton, clicked, [this]{ autodetectLayout(); });
+ m_connectionAutolayout = CONNECT(autolayoutButton, clicked, [this] { autodetectLayout(); });
MAIN->getConfig()->addSetting(new VarSetting("selectionsavefile"));
std::string selectionsavefile = MAIN->getConfig()->getSetting>("selectionsavefile")->getValue();
@@ -45,17 +44,15 @@
updateRecognitionModeLabel();
}
-DisplayerToolSelect::~DisplayerToolSelect()
-{
+DisplayerToolSelect::~DisplayerToolSelect() {
clearSelections();
MAIN->getWidget("button:main.autolayout").as()->set_visible(false);
m_connectionAutolayout.disconnect();
}
-bool DisplayerToolSelect::mousePressEvent(GdkEventButton* event)
-{
- if(event->button == 1 && m_curSel == nullptr){
- if((event->state & Gdk::CONTROL_MASK) == 0){
+bool DisplayerToolSelect::mousePressEvent(GdkEventButton* event) {
+ if(event->button == 1 && m_curSel == nullptr) {
+ if((event->state & Gdk::CONTROL_MASK) == 0) {
clearSelections();
}
m_curSel = new NumberedDisplayerSelection(this, 1 + m_selections.size(), m_displayer->mapToSceneClamped(Geometry::Point(event->x, event->y)));
@@ -66,9 +63,8 @@
return false;
}
-bool DisplayerToolSelect::mouseMoveEvent(GdkEventMotion* event)
-{
- if(m_curSel){
+bool DisplayerToolSelect::mouseMoveEvent(GdkEventMotion* event) {
+ if(m_curSel) {
Geometry::Point p = m_displayer->mapToSceneClamped(Geometry::Point(event->x, event->y));
m_curSel->setPoint(p);
m_displayer->ensureVisible(event->x, event->y);
@@ -77,13 +73,12 @@
return false;
}
-bool DisplayerToolSelect::mouseReleaseEvent(GdkEventButton* /*event*/)
-{
- if(m_curSel){
- if(m_curSel->rect().width < 5. || m_curSel->rect().height < 5.){
+bool DisplayerToolSelect::mouseReleaseEvent(GdkEventButton* /*event*/) {
+ if(m_curSel) {
+ if(m_curSel->rect().width < 5. || m_curSel->rect().height < 5.) {
m_displayer->removeItem(m_curSel);
delete m_curSel;
- }else{
+ } else {
m_selections.push_back(m_curSel);
updateRecognitionModeLabel();
}
@@ -93,36 +88,32 @@
return false;
}
-void DisplayerToolSelect::resolutionChanged(double factor)
-{
- for(NumberedDisplayerSelection* sel : m_selections){
+void DisplayerToolSelect::resolutionChanged(double factor) {
+ for(NumberedDisplayerSelection* sel : m_selections) {
sel->scale(factor);
}
}
-void DisplayerToolSelect::rotationChanged(double delta)
-{
+void DisplayerToolSelect::rotationChanged(double delta) {
Geometry::Rotation R(delta);
- for(NumberedDisplayerSelection* sel : m_selections){
+ for(NumberedDisplayerSelection* sel : m_selections) {
sel->rotate(R);
}
}
-std::vector> DisplayerToolSelect::getOCRAreas()
-{
+std::vector> DisplayerToolSelect::getOCRAreas() {
std::vector> images;
- if(m_selections.empty()){
+ if(m_selections.empty()) {
images.push_back(m_displayer->getImage(m_displayer->getSceneBoundingRect()));
- }else{
- for(const NumberedDisplayerSelection* sel : m_selections){
+ } else {
+ for(const NumberedDisplayerSelection* sel : m_selections) {
images.push_back(m_displayer->getImage(sel->rect()));
}
}
return images;
}
-void DisplayerToolSelect::clearSelections()
-{
+void DisplayerToolSelect::clearSelections() {
for(NumberedDisplayerSelection* sel : m_selections) {
m_displayer->removeItem(sel);
delete sel;
@@ -131,47 +122,42 @@
updateRecognitionModeLabel();
}
-void DisplayerToolSelect::removeSelection(int num)
-{
+void DisplayerToolSelect::removeSelection(int num) {
m_displayer->removeItem(m_selections[num - 1]);
delete m_selections[num - 1];
m_selections.erase(m_selections.begin() + num - 1);
- for(int i = 0, n = m_selections.size(); i < n; ++i){
+ for(int i = 0, n = m_selections.size(); i < n; ++i) {
m_selections[i]->setNumber(1 + i);
m_selections[i]->setZIndex(1 + i);
}
}
-void DisplayerToolSelect::reorderSelection(int oldNum, int newNum)
-{
+void DisplayerToolSelect::reorderSelection(int oldNum, int newNum) {
NumberedDisplayerSelection* sel = m_selections[oldNum - 1];
m_selections.erase(m_selections.begin() + oldNum - 1);
m_selections.insert(m_selections.begin() + newNum - 1, sel);
- for(int i = 0, n = m_selections.size(); i < n; ++i){
+ for(int i = 0, n = m_selections.size(); i < n; ++i) {
m_selections[i]->setNumber(1 + i);
m_selections[i]->setZIndex(1 + i);
}
}
-void DisplayerToolSelect::saveSelection(NumberedDisplayerSelection* selection)
-{
+void DisplayerToolSelect::saveSelection(NumberedDisplayerSelection* selection) {
Cairo::RefPtr img = m_displayer->getImage(selection->rect());
std::string filename = Utils::make_output_filename(MAIN->getConfig()->getSetting>("selectionsavefile")->getValue());
FileDialogs::FileFilter filter = {_("PNG Images"), {"image/png"}, {"*.png"}};
filename = FileDialogs::save_dialog(_("Save Selection Image"), filename, filter);
- if(!filename.empty()){
+ if(!filename.empty()) {
MAIN->getConfig()->getSetting>("selectionsavefile")->setValue(filename);
img->write_to_png(filename);
}
}
-void DisplayerToolSelect::updateRecognitionModeLabel()
-{
+void DisplayerToolSelect::updateRecognitionModeLabel() {
MAIN->getRecognizer()->setRecognizeMode(m_selections.empty() ? _("Recognize all") : _("Recognize selection"));
}
-void DisplayerToolSelect::autodetectLayout(bool noDeskew)
-{
+void DisplayerToolSelect::autodetectLayout(bool noDeskew) {
clearSelections();
double avgDeskew = 0.;
@@ -180,14 +166,14 @@
Cairo::RefPtr img = m_displayer->getImage(m_displayer->getSceneBoundingRect());
// Perform layout analysis
- Utils::busyTask([this,&nDeskew,&avgDeskew,&rects,&img]{
+ Utils::busyTask([this,&nDeskew,&avgDeskew,&rects,&img] {
tesseract::TessBaseAPI tess;
tess.InitForAnalysePage();
tess.SetPageSegMode(tesseract::PSM_AUTO_ONLY);
tess.SetImage(img->get_data(), img->get_width(), img->get_height(), 4, 4 * img->get_width());
tesseract::PageIterator* it = tess.AnalyseLayout();
- if(it && !it->Empty(tesseract::RIL_BLOCK)){
- do{
+ if(it && !it->Empty(tesseract::RIL_BLOCK)) {
+ do {
int x1, y1, x2, y2;
tesseract::Orientation orient;
tesseract::WritingDirection wdir;
@@ -198,10 +184,10 @@
avgDeskew += deskew;
++nDeskew;
float width = x2 - x1, height = y2 - y1;
- if(width > 10 && height > 10){
+ if(width > 10 && height > 10) {
rects.push_back(Geometry::Rectangle(x1 - 0.5 * img->get_width(), y1 - 0.5 * img->get_height(), width, height));
}
- }while(it->Next(tesseract::RIL_BLOCK));
+ } while(it->Next(tesseract::RIL_BLOCK));
}
delete it;
return true;
@@ -210,10 +196,10 @@
// If a somewhat large deskew angle is detected, automatically rotate image and redetect layout,
// unless we already attempted to rotate (to prevent endless loops)
avgDeskew = Utils::round(((avgDeskew/nDeskew)/M_PI * 180.) * 10.) / 10.;
- if(std::abs(avgDeskew > .1) && !noDeskew){
+ if(std::abs(avgDeskew > .1) && !noDeskew) {
m_displayer->setAngle(m_displayer->getCurrentAngle() - avgDeskew);
autodetectLayout(true);
- }else{
+ } else {
// Merge overlapping rectangles
for(int i = rects.size(); i-- > 1;) {
for(int j = i; j-- > 0;) {
@@ -224,7 +210,7 @@
}
}
}
- for(int i = 0, n = rects.size(); i < n; ++i){
+ for(int i = 0, n = rects.size(); i < n; ++i) {
m_selections.push_back(new NumberedDisplayerSelection(this, 1 + i, Geometry::Point(rects[i].x, rects[i].y)));
m_selections.back()->setPoint(Geometry::Point(rects[i].x + rects[i].width, rects[i].y + rects[i].height));
m_displayer->addItem(m_selections.back());
@@ -235,7 +221,7 @@
///////////////////////////////////////////////////////////////////////////////
-void NumberedDisplayerSelection::showContextMenu(GdkEventButton* event){
+void NumberedDisplayerSelection::showContextMenu(GdkEventButton* event) {
Gtk::Window* selmenu = MAIN->getWidget("window:selectionmenu");
Gtk::SpinButton* spin = MAIN->getWidget("spin:selectionmenu.order");
spin->get_adjustment()->set_upper(static_cast(m_tool)->m_selections.size());
@@ -260,14 +246,16 @@
selmenu->hide(); // Explicitly hide here to avoid conflicts with file dialog which pops up
static_cast(m_tool)->saveSelection(this);
}),
- CONNECT(selmenu, button_press_event, [&](GdkEventButton* ev){
+ CONNECT(selmenu, button_press_event, [&](GdkEventButton* ev) {
Gtk::Allocation a = selmenu->get_allocation();
- if(ev->x < a.get_x() || ev->x > a.get_x() + a.get_width() || ev->y < a.get_y() || ev->y > a.get_y() + a.get_height()){
+ if(ev->x < a.get_x() || ev->x > a.get_x() + a.get_width() || ev->y < a.get_y() || ev->y > a.get_y() + a.get_height()) {
loop->quit();
}
- return true; }),
- CONNECT(selmenu, key_press_event, [&](GdkEventKey* ev){
- if(ev->keyval == GDK_KEY_Escape) loop->quit(); return true;
+ return true;
+ }),
+ CONNECT(selmenu, key_press_event, [&](GdkEventKey* ev) {
+ if(ev->keyval == GDK_KEY_Escape) loop->quit();
+ return true;
})
};
Glib::RefPtr screen = MAIN->getWindow()->get_screen();
@@ -289,7 +277,7 @@
loop->run();
selmenu->hide();
- for(sigc::connection& conn : selmenuConnections){
+ for(sigc::connection& conn : selmenuConnections) {
conn.disconnect();
}
#if GTK_CHECK_VERSION(3,20,0)
@@ -299,13 +287,11 @@
#endif
}
-void NumberedDisplayerSelection::reorderSelection(int newNumber)
-{
+void NumberedDisplayerSelection::reorderSelection(int newNumber) {
static_cast(m_tool)->reorderSelection(m_number, newNumber);
}
-void NumberedDisplayerSelection::draw(Cairo::RefPtr ctx) const
-{
+void NumberedDisplayerSelection::draw(Cairo::RefPtr ctx) const {
DisplayerSelection::draw(ctx);
Gdk::RGBA fgcolor("#FFFFFF");
@@ -329,7 +315,8 @@
// Text
ctx->select_font_face("sans", Cairo::FONT_SLANT_NORMAL, Cairo::FONT_WEIGHT_BOLD);
ctx->set_font_size(0.7 * w);
- Cairo::TextExtents ext; ctx->get_text_extents(idx, ext);
+ Cairo::TextExtents ext;
+ ctx->get_text_extents(idx, ext);
ctx->translate(paintrect.x + .5 * w, paintrect.y + .5 * w);
ctx->translate(-ext.x_bearing - .5 * ext.width, -ext.y_bearing - .5 * ext.height);
ctx->set_source_rgba(fgcolor.get_red(), fgcolor.get_green(), bgcolor.get_blue(), 1.0);
diff -Nru gimagereader-3.1.99/gtk/src/DisplayerToolSelect.hh gimagereader-3.2.0/gtk/src/DisplayerToolSelect.hh
--- gimagereader-3.1.99/gtk/src/DisplayerToolSelect.hh 2016-10-13 21:45:35.000000000 +0000
+++ gimagereader-3.2.0/gtk/src/DisplayerToolSelect.hh 2016-11-23 22:08:53.000000000 +0000
@@ -35,10 +35,18 @@
void rotationChanged(double delta) override;
std::vector> getOCRAreas() override;
- bool hasMultipleOCRAreas() const override{ return !m_selections.empty(); }
- bool allowAutodetectOCRAreas() const override{ return true; }
- void autodetectOCRAreas() override{ autodetectLayout(); }
- void reset() override{ clearSelections(); }
+ bool hasMultipleOCRAreas() const override {
+ return !m_selections.empty();
+ }
+ bool allowAutodetectOCRAreas() const override {
+ return true;
+ }
+ void autodetectOCRAreas() override {
+ autodetectLayout();
+ }
+ void reset() override {
+ clearSelections();
+ }
private:
friend class NumberedDisplayerSelection;
@@ -54,14 +62,12 @@
void autodetectLayout(bool noDeskew = false);
};
-class NumberedDisplayerSelection : public DisplayerSelection
-{
+class NumberedDisplayerSelection : public DisplayerSelection {
public:
NumberedDisplayerSelection(DisplayerToolSelect* selectTool, int number, const Geometry::Point& anchor)
- : DisplayerSelection(selectTool, anchor), m_number(number)
- {
+ : DisplayerSelection(selectTool, anchor), m_number(number) {
}
- void setNumber(int number){
+ void setNumber(int number) {
m_number = number;
}
diff -Nru gimagereader-3.1.99/gtk/src/DisplayRenderer.cc gimagereader-3.2.0/gtk/src/DisplayRenderer.cc
--- gimagereader-3.1.99/gtk/src/DisplayRenderer.cc 2016-10-13 21:45:35.000000000 +0000
+++ gimagereader-3.2.0/gtk/src/DisplayRenderer.cc 2016-11-23 22:08:53.000000000 +0000
@@ -23,9 +23,8 @@
#include
#include
-void DisplayRenderer::adjustImage(const Cairo::RefPtr &surf, int brightness, int contrast, bool invert) const
-{
- if(brightness == 0 && contrast == 0 && !invert){
+void DisplayRenderer::adjustImage(const Cairo::RefPtr &surf, int brightness, int contrast, bool invert) const {
+ if(brightness == 0 && contrast == 0 && !invert) {
return;
}
@@ -38,8 +37,8 @@
int n = surf->get_height() * surf->get_width();
uint8_t* data = surf->get_data();
-#pragma omp parallel for schedule(static)
- for(int i = 0; i < n; ++i){
+ #pragma omp parallel for schedule(static)
+ for(int i = 0; i < n; ++i) {
uint8_t& r = data[4*i + 2];
uint8_t& g = data[4*i + 1];
uint8_t& b = data[4*i + 0];
@@ -52,7 +51,7 @@
g = std::max(0.f, std::min(FCn * (g - 128.f) + 128.f, 255.f));
b = std::max(0.f, std::min(FCn * (b - 128.f) + 128.f, 255.f));
// Invert
- if(invert){
+ if(invert) {
r = 255 - r;
g = 255 - g;
b = 255 - b;
@@ -60,12 +59,11 @@
}
}
-Cairo::RefPtr ImageRenderer::render(int /*page*/, double resolution) const
-{
+Cairo::RefPtr ImageRenderer::render(int /*page*/, double resolution) const {
Glib::RefPtr pixbuf;
- try{
+ try {
pixbuf = Gdk::Pixbuf::create_from_file(m_filename);
- }catch(const Glib::Error&){
+ } catch(const Glib::Error&) {
return Cairo::RefPtr();
}
@@ -75,12 +73,11 @@
Cairo::RefPtr surf;
try {
surf = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, w, h);
- } catch(const std::exception&)
- {
+ } catch(const std::exception&) {
return Cairo::RefPtr();
}
Cairo::RefPtr ctx = Cairo::Context::create(surf);
- if(pixbuf->get_has_alpha()){
+ if(pixbuf->get_has_alpha()) {
ctx->set_source_rgba(1., 1., 1., 1.);
ctx->paint();
}
@@ -90,19 +87,17 @@
return surf;
}
-PDFRenderer::PDFRenderer(const std::string& filename) : DisplayRenderer(filename)
-{
+PDFRenderer::PDFRenderer(const std::string& filename) : DisplayRenderer(filename) {
m_document = poppler_document_new_from_file(Glib::filename_to_uri(m_filename).c_str(), 0, 0);
}
-PDFRenderer::~PDFRenderer()
-{
- g_object_unref(m_document);
+PDFRenderer::~PDFRenderer() {
+ if(m_document)
+ g_object_unref(m_document);
}
-Cairo::RefPtr PDFRenderer::render(int page, double resolution) const
-{
- if(!m_document){
+Cairo::RefPtr PDFRenderer::render(int page, double resolution) const {
+ if(!m_document) {
return Cairo::RefPtr();
}
m_mutex.lock();
@@ -115,8 +110,7 @@
Cairo::RefPtr surf;
try {
surf = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, w, h);
- } catch(const std::exception&)
- {
+ } catch(const std::exception&) {
m_mutex.unlock();
return Cairo::RefPtr();
}
@@ -130,7 +124,6 @@
return surf;
}
-int PDFRenderer::getNPages() const
-{
- return poppler_document_get_n_pages(m_document);
+int PDFRenderer::getNPages() const {
+ return m_document ? poppler_document_get_n_pages(m_document) : 1;
}
diff -Nru gimagereader-3.1.99/gtk/src/DisplayRenderer.hh gimagereader-3.2.0/gtk/src/DisplayRenderer.hh
--- gimagereader-3.1.99/gtk/src/DisplayRenderer.hh 2016-10-13 21:45:35.000000000 +0000
+++ gimagereader-3.2.0/gtk/src/DisplayRenderer.hh 2016-11-23 22:08:53.000000000 +0000
@@ -27,7 +27,7 @@
class DisplayRenderer {
public:
DisplayRenderer(const std::string& filename) : m_filename(filename) {}
- virtual ~DisplayRenderer(){}
+ virtual ~DisplayRenderer() {}
virtual Cairo::RefPtr render(int page, double resolution) const = 0;
virtual int getNPages() const = 0;
@@ -40,16 +40,18 @@
class ImageRenderer : public DisplayRenderer {
public:
ImageRenderer(const std::string& filename) : DisplayRenderer(filename) {}
- Cairo::RefPtr render(int page, double resolution) const;
- int getNPages() const{ return 1; }
+ Cairo::RefPtr render(int page, double resolution) const override;
+ int getNPages() const override {
+ return 1;
+ }
};
class PDFRenderer : public DisplayRenderer {
public:
PDFRenderer(const std::string& filename);
~PDFRenderer();
- Cairo::RefPtr render(int page, double resolution) const;
- int getNPages() const;
+ Cairo::RefPtr render(int page, double resolution) const override;
+ int getNPages() const override;
private:
PopplerDocument* m_document;
diff -Nru gimagereader-3.1.99/gtk/src/FileDialogs.cc gimagereader-3.2.0/gtk/src/FileDialogs.cc
--- gimagereader-3.1.99/gtk/src/FileDialogs.cc 2016-10-13 21:45:35.000000000 +0000
+++ gimagereader-3.2.0/gtk/src/FileDialogs.cc 2016-11-23 22:08:53.000000000 +0000
@@ -32,8 +32,7 @@
#ifdef G_OS_WIN32
-static std::wstring s2ws(const std::string& s)
-{
+static std::wstring s2ws(const std::string& s) {
g_assert(sizeof(wchar_t) == sizeof(gunichar2));
const char* in = s.c_str();
wchar_t* buf = reinterpret_cast(g_utf8_to_utf16(in, -1, nullptr, nullptr, nullptr));
@@ -42,8 +41,7 @@
return out;
}
-static std::string ws2s(const std::wstring& s)
-{
+static std::string ws2s(const std::wstring& s) {
g_assert(sizeof(wchar_t) == sizeof(gunichar2));
const gunichar2* in = reinterpret_cast(s.c_str());
char* buf = g_utf16_to_utf8(in, -1, nullptr, nullptr, nullptr);
@@ -53,21 +51,19 @@
}
-std::wstring FileDialogs::FileFilter::to_win32_filter() const
-{
+std::wstring FileDialogs::FileFilter::to_win32_filter() const {
std::wstring filterstr = s2ws(name);
filterstr += L'\0';
- for(const std::string& pattern : patterns){
+ for(const std::string& pattern : patterns) {
filterstr += s2ws(pattern) + L';';
}
- if(filterstr.back() == L';'){
+ if(filterstr.back() == L';') {
filterstr.back() = L'\0';
}
return filterstr;
}
-static std::vector> win32_open_dialog(const Glib::ustring &title, const std::string& initialDirectory, const std::wstring& filter, bool multiple, Gtk::Window *parent)
-{
+static std::vector> win32_open_dialog(const Glib::ustring &title, const std::string& initialDirectory, const std::wstring& filter, bool multiple, Gtk::Window *parent) {
wchar_t wfile[1024] = {};
std::wstring winitialDirectory = s2ws(initialDirectory);
std::wstring wtitle = s2ws(title);
@@ -86,7 +82,7 @@
bool ok = GetOpenFileNameW(&ofn);
std::vector> files;
- if(ok){
+ if(ok) {
if(ofn.nFileOffset == 0) {
// One file only
std::string filename = ws2s(ofn.lpstrFile);
@@ -109,8 +105,7 @@
return files;
}
-static std::string win32_save_dialog(const Glib::ustring &title, const std::string &suggestedFile, const std::wstring& filter, Gtk::Window *parent)
-{
+static std::string win32_save_dialog(const Glib::ustring &title, const std::string &suggestedFile, const std::wstring& filter, Gtk::Window *parent) {
std::wstring wsuggestedFile = s2ws(suggestedFile);
std::wstring wtitle = s2ws(title);
std::wstring suggestedName = s2ws(Glib::path_get_basename(suggestedFile));
@@ -130,7 +125,7 @@
bool ok = GetSaveFileNameW(&ofn);
std::string filename;
- if(ok){
+ if(ok) {
filename = ws2s(ofn.lpstrFile);
}
return filename;
@@ -138,21 +133,19 @@
#else
-Glib::RefPtr FileDialogs::FileFilter::to_gnome_filter() const
-{
+Glib::RefPtr FileDialogs::FileFilter::to_gnome_filter() const {
Glib::RefPtr filefilter = Gtk::FileFilter::create();
filefilter->set_name(name);
- for(const std::string& mime_type : mime_types){
+ for(const std::string& mime_type : mime_types) {
filefilter->add_mime_type(mime_type);
}
- for(const std::string& pattern : patterns){
+ for(const std::string& pattern : patterns) {
filefilter->add_pattern(pattern);
}
return filefilter;
}
-static std::vector> gnome_open_dialog(const std::string& title, const std::string& initialDirectory, Glib::RefPtr filter, bool multiple, Gtk::Window* parent)
-{
+static std::vector> gnome_open_dialog(const std::string& title, const std::string& initialDirectory, Glib::RefPtr filter, bool multiple, Gtk::Window* parent) {
Gtk::FileChooserDialog dialog(*parent, title);
dialog.add_button(_("Cancel"), Gtk::RESPONSE_CANCEL);
dialog.add_button(_("OK"), Gtk::RESPONSE_OK);
@@ -161,14 +154,13 @@
dialog.set_filter(filter);
dialog.set_current_folder(initialDirectory);
- if(dialog.run() == Gtk::RESPONSE_OK){
+ if(dialog.run() == Gtk::RESPONSE_OK) {
return dialog.get_files();
}
return std::vector>();
}
-static std::string gnome_save_dialog(const Glib::ustring &title, const std::string &suggestedFile, Glib::RefPtr filter, Gtk::Window *parent)
-{
+static std::string gnome_save_dialog(const Glib::ustring &title, const std::string &suggestedFile, Glib::RefPtr filter, Gtk::Window *parent) {
Gtk::FileChooserDialog dialog(*parent, title, Gtk::FILE_CHOOSER_ACTION_SAVE);
dialog.add_button("gtk-cancel", Gtk::RESPONSE_CANCEL);
dialog.add_button("gtk-ok", Gtk::RESPONSE_OK);
@@ -181,23 +173,21 @@
dialog.set_filter(filter);
- if(dialog.run() == Gtk::RESPONSE_OK){
+ if(dialog.run() == Gtk::RESPONSE_OK) {
return dialog.get_filename();
}
return "";
}
-Glib::ustring FileDialogs::FileFilter::to_kde_filter() const
-{
+Glib::ustring FileDialogs::FileFilter::to_kde_filter() const {
Glib::ustring filter;
- for(const std::string& mime_type : mime_types){
+ for(const std::string& mime_type : mime_types) {
filter += mime_type + " ";
}
return filter;
}
-static std::vector> kde_open_dialog(const Glib::ustring& title, const std::string& initialDirectory, const Glib::ustring& filter, bool multiple, Gtk::Window* parent)
-{
+static std::vector> kde_open_dialog(const Glib::ustring& title, const std::string& initialDirectory, const Glib::ustring& filter, bool multiple, Gtk::Window* parent) {
// Command line
std::vector argv = {
"/usr/bin/kdialog",
@@ -223,8 +213,7 @@
return files;
}
-static std::string kde_save_dialog(const Glib::ustring &title, const std::string &suggestedFile, const Glib::ustring& filter, Gtk::Window *parent)
-{
+static std::string kde_save_dialog(const Glib::ustring &title, const std::string &suggestedFile, const Glib::ustring& filter, Gtk::Window *parent) {
std::string filename = suggestedFile;
do {
std::vector argv = {
@@ -251,7 +240,7 @@
"--caption", PACKAGE_NAME
};
Glib::spawn_sync("", argv, /*Glib::SPAWN_DEFAULT*/Glib::SpawnFlags(0), sigc::slot(), nullptr, nullptr, &exit_status);
- if(exit_status != 0){
+ if(exit_status != 0) {
continue;
}
}
@@ -260,24 +249,22 @@
return std::string();
}
-static bool is_kde()
-{
+static bool is_kde() {
static bool is_kde =
- Glib::ustring(Glib::getenv("XDG_CURRENT_DESKTOP")).lowercase() == "kde" &&
- Glib::file_test("/usr/bin/kdialog", Glib::FILE_TEST_EXISTS);
+ Glib::ustring(Glib::getenv("XDG_CURRENT_DESKTOP")).lowercase() == "kde" &&
+ Glib::file_test("/usr/bin/kdialog", Glib::FILE_TEST_EXISTS);
return is_kde;
}
#endif
-FileDialogs::FileFilter FileDialogs::FileFilter::pixbuf_formats()
-{
+FileDialogs::FileFilter FileDialogs::FileFilter::pixbuf_formats() {
FileFilter filter;
for(const Gdk::PixbufFormat& format : Gdk::Pixbuf::get_formats()) {
for(const Glib::ustring& mime : format.get_mime_types()) {
filter.mime_types.push_back(mime);
}
- for(const Glib::ustring& extension : format.get_extensions()){
+ for(const Glib::ustring& extension : format.get_extensions()) {
filter.patterns.push_back(Glib::ustring::compose("*.%1", extension));
}
}
@@ -286,8 +273,7 @@
namespace FileDialogs {
-std::vector> open_dialog(const Glib::ustring &title, const std::string& initialDirectory, const FileFilter &filter, bool multiple, Gtk::Window *parent)
-{
+std::vector> open_dialog(const Glib::ustring &title, const std::string& initialDirectory, const FileFilter &filter, bool multiple, Gtk::Window *parent) {
std::vector> filenames;
parent = parent == nullptr ? MAIN->getWindow() : parent;
std::string initialDir = initialDirectory.empty() ? Glib::get_home_dir() : initialDirectory;
@@ -303,8 +289,7 @@
return filenames;
}
-std::string save_dialog(const Glib::ustring &title, const std::string& suggestedFile, const FileFilter& filter, Gtk::Window *parent)
-{
+std::string save_dialog(const Glib::ustring &title, const std::string& suggestedFile, const FileFilter& filter, Gtk::Window *parent) {
std::string filename;
parent = parent == nullptr ? MAIN->getWindow() : parent;
#ifdef G_OS_WIN32
@@ -321,7 +306,7 @@
std::string base, ext;
Utils::get_filename_parts(suggestedFile, sbase, sext);
Utils::get_filename_parts(filename, base, ext);
- if(ext.empty()){
+ if(ext.empty()) {
filename = base + "." + sext;
}
}
diff -Nru gimagereader-3.1.99/gtk/src/Geometry.hh gimagereader-3.2.0/gtk/src/Geometry.hh
--- gimagereader-3.1.99/gtk/src/Geometry.hh 2016-10-13 21:45:35.000000000 +0000
+++ gimagereader-3.2.0/gtk/src/Geometry.hh 2016-11-23 22:08:53.000000000 +0000
@@ -28,24 +28,34 @@
public:
union {
double data[2];
- struct { double x, y; };
+ struct {
+ double x, y;
+ };
};
Point(double _x = 0., double _y = 0.) : x(_x), y(_y) {}
- double operator[](int i) const{ return data[i]; }
- double& operator[](int i){ return data[i]; }
+ double operator[](int i) const {
+ return data[i];
+ }
+ double& operator[](int i) {
+ return data[i];
+ }
};
class Rotation {
public:
Rotation(double angle = 0.) {
double cosa = std::cos(angle), sina = std::sin(angle);
- m_data[0] = cosa; m_data[1] = -sina;
- m_data[2] = sina; m_data[3] = cosa;
+ m_data[0] = cosa;
+ m_data[1] = -sina;
+ m_data[2] = sina;
+ m_data[3] = cosa;
}
- Point rotate(const Point& p) const{
+ Point rotate(const Point& p) const {
return Point(m_data[0] * p.x + m_data[1] * p.y, m_data[2] * p.x + m_data[3] * p.y);
}
- double operator()(int i, int j) const{ return m_data[2*i + j]; }
+ double operator()(int i, int j) const {
+ return m_data[2*i + j];
+ }
private:
double m_data[4];
};
@@ -60,20 +70,20 @@
Rectangle(const Point& p1, const Point& p2)
: x(std::min(p1.x, p2.x)), y(std::min(p1.y, p2.y)),
width(std::abs(p2.x - p1.x)), height(std::abs(p2.y - p1.y)) {}
- bool contains(const Point& p) const{
+ bool contains(const Point& p) const {
return p.x >= x && p.x <= x + width && p.y >= y && p.y <= y + height;
}
bool overlaps(const Rectangle& r) const {
return x < r.x + r.width && x + width > r.x && y < r.y + r.height && y + height > r.y;
}
- Rectangle unite(const Rectangle& r) const{
+ Rectangle unite(const Rectangle& r) const {
double _x = std::min(x, r.x);
double _y = std::min(y, r.y);
double _w = std::max(x + width, r.x + r.width) - _x;
double _h = std::max(y + height, r.y + r.height) - _y;
return Rectangle(_x, _y, _w, _h);
}
- Rectangle translate(double dx, double dy) const{
+ Rectangle translate(double dx, double dy) const {
return Rectangle(x + dx, y + dy, width, height);
}
};
diff -Nru gimagereader-3.1.99/gtk/src/Image.cc gimagereader-3.2.0/gtk/src/Image.cc
--- gimagereader-3.1.99/gtk/src/Image.cc 2016-10-13 21:45:35.000000000 +0000
+++ gimagereader-3.2.0/gtk/src/Image.cc 2016-11-23 22:08:53.000000000 +0000
@@ -37,8 +37,7 @@
return val > 255 ? 255 : val < 0 ? 0 : val;
}
-Image::Image(Cairo::RefPtr src, Format targetFormat)
-{
+Image::Image(Cairo::RefPtr src, Format targetFormat) {
width = src->get_width();
height = src->get_height();
format = targetFormat;
@@ -108,8 +107,7 @@
}
}
-void Image::writeJpeg(int quality, uint8_t*& buf, unsigned long& bufLen)
-{
+void Image::writeJpeg(int quality, uint8_t*& buf, unsigned long& bufLen) {
buf = nullptr;
bufLen = 0;
if(format == Format_Mono) {
@@ -138,8 +136,7 @@
jpeg_destroy_compress(&cinfo);
}
-Cairo::RefPtr Image::simulateFormat(Cairo::RefPtr src, Format format)
-{
+Cairo::RefPtr Image::simulateFormat(Cairo::RefPtr src, Format format) {
int imgw = src->get_width();
int imgh = src->get_height();
int stride = src->get_stride();
@@ -194,8 +191,7 @@
return src;
}
-Cairo::RefPtr Image::scale(Cairo::RefPtr src, double scaleFactor)
-{
+Cairo::RefPtr Image::scale(Cairo::RefPtr src, double scaleFactor) {
if(scaleFactor == 1.0) {
return src;
}
diff -Nru gimagereader-3.1.99/gtk/src/Image.hh gimagereader-3.2.0/gtk/src/Image.hh
--- gimagereader-3.1.99/gtk/src/Image.hh 2016-10-13 21:45:35.000000000 +0000
+++ gimagereader-3.2.0/gtk/src/Image.hh 2016-11-23 22:08:53.000000000 +0000
@@ -32,7 +32,9 @@
unsigned char* data = nullptr;
Image(Cairo::RefPtr src, Format targetFormat);
- ~Image(){ delete[] data; }
+ ~Image() {
+ delete[] data;
+ }
void writeJpeg(int quality, uint8_t*& buf, unsigned long& bufLen);
static Cairo::RefPtr simulateFormat(Cairo::RefPtr src, Format format);
diff -Nru gimagereader-3.1.99/gtk/src/main.cc gimagereader-3.2.0/gtk/src/main.cc
--- gimagereader-3.1.99/gtk/src/main.cc 2016-10-13 21:45:35.000000000 +0000
+++ gimagereader-3.2.0/gtk/src/main.cc 2016-11-23 22:08:53.000000000 +0000
@@ -23,6 +23,10 @@
#include
#include
+#ifdef G_OS_WIN32
+#include
+#endif
+
#include "common.hh"
#include "Application.hh"
#include "Config.hh"
@@ -31,8 +35,7 @@
std::string pkgDir;
std::string pkgExePath;
-static std::string get_application_dir(char* argv0)
-{
+static std::string get_application_dir(char* argv0) {
#ifdef G_OS_WIN32
gchar* dir = g_win32_get_package_installation_directory_of_module(0);
std::string pathstr = dir;
@@ -44,10 +47,10 @@
char* path = g_file_read_link(exe.c_str(), &err);
std::string pathstr = Glib::build_filename(Glib::path_get_dirname(path), "..");
g_free(path);
- if(err){
- if(Glib::path_is_absolute(argv0)){
+ if(err) {
+ if(Glib::path_is_absolute(argv0)) {
pathstr = Glib::build_filename(Glib::path_get_dirname(argv0), "..");
- }else{
+ } else {
pathstr = Glib::build_filename(Glib::get_current_dir(), Glib::path_get_dirname(argv0), "..");
}
}
@@ -55,10 +58,33 @@
return pathstr;
}
-int main (int argc, char *argv[])
-{
+static std::string get_application_exec_path(char* argv0) {
+#ifdef G_OS_WIN32
+ char buf[MAX_PATH];
+ bool success = GetModuleFileName(0, buf, MAX_PATH) > 0;
+ std::string pathstr = buf;
+#else
+ pid_t pid = getpid();
+ std::string exe = Glib::ustring::compose("/proc/%1/exe", pid);
+ GError* err = nullptr;
+ char* path = g_file_read_link(exe.c_str(), &err);
+ std::string pathstr = path;
+ g_free(path);
+ bool success = err == nullptr;
+#endif
+ if(!success) {
+ if(Glib::path_is_absolute(argv0)) {
+ pathstr = Glib::path_get_dirname(argv0);
+ } else {
+ pathstr = Glib::build_filename(Glib::get_current_dir(), argv0);
+ }
+ }
+ return pathstr;
+}
+
+int main (int argc, char *argv[]) {
pkgDir = get_application_dir(argv[0]);
- pkgExePath = argv[0];
+ pkgExePath = get_application_exec_path(argv[0]);
#ifdef G_OS_WIN32
if(Glib::getenv("LANG").empty()) {
diff -Nru gimagereader-3.1.99/gtk/src/MainWindow.cc gimagereader-3.2.0/gtk/src/MainWindow.cc
--- gimagereader-3.1.99/gtk/src/MainWindow.cc 2016-10-13 21:45:35.000000000 +0000
+++ gimagereader-3.2.0/gtk/src/MainWindow.cc 2016-11-23 22:08:53.000000000 +0000
@@ -58,21 +58,20 @@
static Glib::Quark notificationHandleKey("handle");
-void MainWindow::signalHandler(int sig)
-{
+void MainWindow::signalHandler(int sig) {
std::signal(sig, nullptr);
std::string filename;
- if(MAIN->getOutputEditor() && MAIN->getOutputEditor()->getModified()){
+ if(MAIN->getOutputEditor() && MAIN->getOutputEditor()->getModified()) {
filename = Glib::build_filename(g_get_home_dir(), Glib::ustring::compose("%1_crash-save.txt", PACKAGE_NAME));
int i = 0;
- while(Glib::file_test(filename, Glib::FILE_TEST_EXISTS)){
+ while(Glib::file_test(filename, Glib::FILE_TEST_EXISTS)) {
++i;
filename = Glib::build_filename(g_get_home_dir(), Glib::ustring::compose("%1_crash-save_%2.txt", PACKAGE_NAME, i));
}
MAIN->getOutputEditor()->save(filename);
}
Glib::Pid pid;
- Glib::spawn_async("", std::vector{pkgExePath, "crashhandle", Glib::ustring::compose("%1", getpid()), filename}, Glib::SPAWN_DO_NOT_REAP_CHILD, sigc::slot(), &pid);
+ Glib::spawn_async("", std::vector {pkgExePath, "crashhandle", Glib::ustring::compose("%1", getpid()), filename}, Glib::SPAWN_DO_NOT_REAP_CHILD, sigc::slot(), &pid);
#ifdef G_OS_WIN32
WaitForSingleObject((HANDLE)pid, 0);
#elif __linux__
@@ -84,19 +83,18 @@
}
#ifndef __ARMEL__
-static void terminateHandler()
-{
+static void terminateHandler() {
std::set_terminate(nullptr);
std::exception_ptr exptr = std::current_exception();
- if (exptr != 0){
- try{
+ if (exptr != 0) {
+ try {
std::rethrow_exception(exptr);
- }catch (std::exception &ex){
+ } catch (std::exception &ex) {
std::cerr << "Terminated due to exception: " << ex.what() << std::endl;
- }catch (...){
+ } catch (...) {
std::cerr << "Terminated due to unknown exception" << std::endl;
}
- }else{
+ } else {
std::cerr << "Terminated due to unknown reason:" << std::endl;
}
MainWindow::signalHandler(SIGABRT);
@@ -106,8 +104,7 @@
MainWindow* MainWindow::s_instance = nullptr;
MainWindow::MainWindow()
- : m_builder("/org/gnome/gimagereader/gimagereader.ui")
-{
+ : m_builder("/org/gnome/gimagereader/gimagereader.ui") {
s_instance = this;
std::signal(SIGSEGV, signalHandler);
@@ -144,17 +141,26 @@
m_idlegroup.push_back(getWidget("button:main.autolayout"));
m_idlegroup.push_back(getWidget("menubutton:main.languages"));
- CONNECT(m_window, delete_event, [this](GdkEventAny* ev) { return closeEvent(ev); });
+ CONNECT(m_window, delete_event, [this](GdkEventAny* ev) {
+ return closeEvent(ev);
+ });
CONNECTS(getWidget("button:main.controls").as(), toggled,
- [this](Gtk::ToggleButton* b) { getWidget("toolbar:display").as()->set_visible(b->get_active()); });
- CONNECT(m_acquirer, scanPageAvailable, [this](const std::string& filename){ m_sourceManager->addSources({Gio::File::create_for_path(filename)}); });
- CONNECT(m_sourceManager, sourceChanged, [this]{ onSourceChanged(); });
- CONNECT(m_outputPaneToggleButton, toggled, [this]{ m_outputEditor->getUI()->set_visible(m_outputPaneToggleButton->get_active()); });
- m_connection_setOCRMode = CONNECT(m_ocrModeCombo, changed, [this]{ setOCRMode(m_ocrModeCombo->get_active_row_number()); });
- CONNECT(m_recognizer, languageChanged, [this] (const Config::Lang& /*lang*/ ){ languageChanged(); });
- CONNECTS(getWidget("combo:config.settings.paneorient").as(), changed, [this](Gtk::ComboBoxText* combo){
- getWidget("paned:output").as()->set_orientation(static_cast(!combo->get_active_row_number())); });
- CONNECT(getWidget("button:main.progress.cancel").as(), clicked, [this]{ progressCancel(); });
+ [this](Gtk::ToggleButton* b) {
+ getWidget("toolbar:display").as()->set_visible(b->get_active());
+ });
+ CONNECT(m_acquirer, scanPageAvailable, [this](const std::string& filename) {
+ m_sourceManager->addSources({Gio::File::create_for_path(filename)});
+ });
+ CONNECT(m_sourceManager, sourceChanged, [this] { onSourceChanged(); });
+ CONNECT(m_outputPaneToggleButton, toggled, [this] { m_outputEditor->getUI()->set_visible(m_outputPaneToggleButton->get_active()); });
+ m_connection_setOCRMode = CONNECT(m_ocrModeCombo, changed, [this] { setOCRMode(m_ocrModeCombo->get_active_row_number()); });
+ CONNECT(m_recognizer, languageChanged, [this] (const Config::Lang& /*lang*/ ) {
+ languageChanged();
+ });
+ CONNECTS(getWidget("combo:config.settings.paneorient").as(), changed, [this](Gtk::ComboBoxText* combo) {
+ getWidget("paned:output").as()->set_orientation(static_cast(!combo->get_active_row_number()));
+ });
+ CONNECT(getWidget("button:main.progress.cancel").as(), clicked, [this] { progressCancel(); });
m_config->addSetting(new VarSetting>("wingeom"));
@@ -166,23 +172,21 @@
pushState(State::Idle, _("Select an image to begin..."));
- setOCRMode(m_ocrModeCombo->get_active_row_number());
const std::vector& geom = m_config->getSetting>>("wingeom")->getValue();
- if(geom.size() == 4){
+ if(geom.size() == 4) {
m_window->resize(geom[2], geom[3]);
m_window->move(geom[0], geom[1]);
}
#if ENABLE_VERSIONCHECK
- if(m_config->getSetting