Library renamed to Pdf4Qt

This commit is contained in:
Jakub Melka
2020-12-20 19:03:58 +01:00
parent 6811820e1a
commit 7614ab8240
506 changed files with 1191 additions and 1081 deletions

View File

@@ -0,0 +1,95 @@
# Copyright (C) 2018-2020 Jakub Melka
#
# This file is part of Pdf4Qt.
#
# Pdf4Qt is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Pdf4Qt is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with Pdf4Qt. If not, see <https://www.gnu.org/licenses/>.
QT += core gui widgets winextras printsupport texttospeech network xml
TARGET = Pdf4QtViewer
TEMPLATE = lib
win32:TARGET_EXT = .dll
VERSION = 1.0.0
DEFINES += Pdf4QtVIEWER_LIBRARY
QMAKE_TARGET_DESCRIPTION = "PDF viewer support library"
QMAKE_TARGET_COPYRIGHT = "(c) Jakub Melka 2018-2020"
DEFINES += QT_DEPRECATED_WARNINGS
QMAKE_CXXFLAGS += /std:c++latest /utf-8
INCLUDEPATH += $$PWD/../PDF4QtLib/Sources
DESTDIR = $$OUT_PWD/..
LIBS += -L$$OUT_PWD/..
LIBS += -lPDF4QtLib
SOURCES += \
pdfaboutdialog.cpp \
pdfadvancedfindwidget.cpp \
pdfdocumentpropertiesdialog.cpp \
pdfoptimizedocumentdialog.cpp \
pdfprogramcontroller.cpp \
pdfrecentfilemanager.cpp \
pdfrendertoimagesdialog.cpp \
pdfsendmail.cpp \
pdfsidebarwidget.cpp \
pdftexttospeech.cpp \
pdfundoredomanager.cpp \
pdfviewermainwindow.cpp \
pdfviewersettings.cpp \
pdfviewersettingsdialog.cpp
HEADERS += \
pdfaboutdialog.h \
pdfadvancedfindwidget.h \
pdfdocumentpropertiesdialog.h \
pdfoptimizedocumentdialog.h \
pdfprogramcontroller.h \
pdfrecentfilemanager.h \
pdfrendertoimagesdialog.h \
pdfsendmail.h \
pdfsidebarwidget.h \
pdftexttospeech.h \
pdfundoredomanager.h \
pdfviewerglobal.h \
pdfviewermainwindow.h \
pdfviewersettings.h \
pdfviewersettingsdialog.h
FORMS += \
pdfaboutdialog.ui \
pdfadvancedfindwidget.ui \
pdfdocumentpropertiesdialog.ui \
pdfoptimizedocumentdialog.ui \
pdfrendertoimagesdialog.ui \
pdfsidebarwidget.ui \
pdfviewermainwindow.ui \
pdfviewersettingsdialog.ui
CONFIG += force_debug_info
viewer_library.files = $$DESTDIR/Pdf4QtViewer.dll
viewer_library.path = $$DESTDIR/install
INSTALLS += viewer_library
plugins.files = $$files($$DESTDIR/pdfplugins/*.dll)
plugins.path = $$DESTDIR/install/pdfplugins
INSTALLS += plugins
RESOURCES += \
pdf4qtviewer.qrc

52
Pdf4QtViewer/main.cpp Normal file
View File

@@ -0,0 +1,52 @@
// Copyright (C) 2019-2020 Jakub Melka
//
// This file is part of Pdf4Qt.
//
// Pdf4Qt is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Pdf4Qt is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with Pdf4Qt. If not, see <https://www.gnu.org/licenses/>.
#include "pdfviewermainwindow.h"
#include <QResource>
#include <QApplication>
#include <QCommandLineParser>
int main(int argc, char *argv[])
{
QApplication::setAttribute(Qt::AA_CompressHighFrequencyEvents, true);
QApplication::setAttribute(Qt::AA_DisableHighDpiScaling, true);
QApplication::setAttribute(Qt::AA_DontCheckOpenGLContextThreadAffinity, true);
QApplication application(argc, argv);
QCoreApplication::setOrganizationName("MelkaJ");
QCoreApplication::setApplicationName("PDF4QT Viewer Profi");
QCoreApplication::setApplicationVersion("1.0.0");
QApplication::setApplicationDisplayName(QApplication::translate("Application", "PDF4QT Viewer Profi"));
QCommandLineParser parser;
parser.setApplicationDescription(QCoreApplication::applicationName());
parser.addHelpOption();
parser.addVersionOption();
parser.addPositionalArgument("file", "The PDF file to open.");
parser.process(application);
pdfviewer::PDFViewerMainWindow mainWindow;
mainWindow.show();
QStringList arguments = application.arguments();
if (arguments.size() > 1)
{
mainWindow.getProgramController()->openDocument(arguments[1]);
}
return application.exec();
}

View File

@@ -0,0 +1,61 @@
<RCC>
<qresource prefix="/">
<file>resources/engine.svg</file>
<file>resources/rendering.svg</file>
<file>resources/shading.svg</file>
<file>resources/next.svg</file>
<file>resources/next-end.svg</file>
<file>resources/next-page.svg</file>
<file>resources/open.svg</file>
<file>resources/previous.svg</file>
<file>resources/previous-page.svg</file>
<file>resources/previous-start.svg</file>
<file>resources/options.svg</file>
<file>resources/quit.svg</file>
<file>resources/rendering-errors.svg</file>
<file>resources/settings.svg</file>
<file>resources/zoom-in.svg</file>
<file>resources/zoom-out.svg</file>
<file>resources/bookmark.svg</file>
<file>resources/security.svg</file>
<file>resources/zoom-fit.svg</file>
<file>resources/zoom-fit-horizontal.svg</file>
<file>resources/zoom-fit-vertical.svg</file>
<file>resources/synchronize.svg</file>
<file>resources/cache.svg</file>
<file>resources/shortcuts.svg</file>
<file>resources/info.svg</file>
<file>resources/send-mail.svg</file>
<file>resources/cms.svg</file>
<file>resources/find.svg</file>
<file>resources/find-advanced.svg</file>
<file>resources/find-next.svg</file>
<file>resources/find-previous.svg</file>
<file>resources/select-text.svg</file>
<file>resources/ui.svg</file>
<file>resources/rotate-left.svg</file>
<file>resources/rotate-right.svg</file>
<file>resources/print.svg</file>
<file>resources/speech.svg</file>
<file>resources/pause.svg</file>
<file>resources/play.svg</file>
<file>resources/stop.svg</file>
<file>resources/magnifier.svg</file>
<file>resources/screenshot-tool.svg</file>
<file>resources/extract-image.svg</file>
<file>resources/form-settings.svg</file>
<file>resources/undo.svg</file>
<file>resources/redo.svg</file>
<file>resources/result-error.svg</file>
<file>resources/result-information.svg</file>
<file>resources/result-ok.svg</file>
<file>resources/result-warning.svg</file>
<file>resources/signature.svg</file>
<file>resources/plugins.svg</file>
<file>resources/hyperlink.svg</file>
<file>resources/highlight.svg</file>
<file>resources/squiggly.svg</file>
<file>resources/strikeout.svg</file>
<file>resources/underline.svg</file>
</qresource>
</RCC>

View File

@@ -0,0 +1,63 @@
// Copyright (C) 2019-2020 Jakub Melka
//
// This file is part of Pdf4Qt.
//
// Pdf4Qt is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Pdf4Qt is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with Pdf4Qt. If not, see <https://www.gnu.org/licenses/>.
#include "pdfaboutdialog.h"
#include "ui_pdfaboutdialog.h"
#include "pdfutils.h"
#include "pdfwidgetutils.h"
namespace pdfviewer
{
PDFAboutDialog::PDFAboutDialog(QWidget* parent) :
QDialog(parent),
ui(new Ui::PDFAboutDialog)
{
ui->setupUi(this);
QString html = ui->copyrightLabel->text();
html.replace("PdfForQtViewer", QApplication::applicationDisplayName());
ui->copyrightLabel->setText(html);
std::vector<pdf::PDFDependentLibraryInfo> infos = pdf::PDFDependentLibraryInfo::getLibraryInfo();
ui->tableWidget->setColumnCount(4);
ui->tableWidget->setRowCount(static_cast<int>(infos.size()));
ui->tableWidget->setHorizontalHeaderLabels(QStringList() << tr("Library") << tr("Version") << tr("License") << tr("URL"));
ui->tableWidget->setEditTriggers(QTableWidget::NoEditTriggers);
ui->tableWidget->setSelectionMode(QTableView::SingleSelection);
ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
for (int i = 0; i < infos.size(); ++i)
{
const pdf::PDFDependentLibraryInfo& info = infos[i];
ui->tableWidget->setItem(i, 0, new QTableWidgetItem(info.library));
ui->tableWidget->setItem(i, 1, new QTableWidgetItem(info.version));
ui->tableWidget->setItem(i, 2, new QTableWidgetItem(info.license));
ui->tableWidget->setItem(i, 3, new QTableWidgetItem(info.url));
}
pdf::PDFWidgetUtils::scaleWidget(this, QSize(750, 600));
}
PDFAboutDialog::~PDFAboutDialog()
{
delete ui;
}
} // namespace viewer

View File

@@ -0,0 +1,45 @@
// Copyright (C) 2019-2020 Jakub Melka
//
// This file is part of Pdf4Qt.
//
// Pdf4Qt is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Pdf4Qt is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with Pdf4Qt. If not, see <https://www.gnu.org/licenses/>.
#ifndef PDFABOUTDIALOG_H
#define PDFABOUTDIALOG_H
#include <QDialog>
namespace Ui
{
class PDFAboutDialog;
}
namespace pdfviewer
{
class PDFAboutDialog : public QDialog
{
Q_OBJECT
public:
explicit PDFAboutDialog(QWidget* parent = nullptr);
virtual ~PDFAboutDialog() override;
private:
Ui::PDFAboutDialog* ui;
};
} // namespace pdfviewer
#endif // PDFABOUTDIALOG_H

View File

@@ -0,0 +1,269 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>PDFAboutDialog</class>
<widget class="QDialog" name="PDFAboutDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>900</width>
<height>600</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>900</width>
<height>600</height>
</size>
</property>
<property name="windowTitle">
<string>About</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="copyrightLabel">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;PdfForQtViewer&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Copyright 2018-2020 Jakub Melka. All rights reserved.&lt;/p&gt;&lt;p&gt;THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QTextEdit" name="textEdit">
<property name="readOnly">
<bool>true</bool>
</property>
<property name="html">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:7.875pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; GNU LESSER GENERAL PUBLIC LICENSE&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; Version 3, 29 June 2007&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; Copyright (C) 2007 Free Software Foundation, Inc. &amp;lt;https://fsf.org/&amp;gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; Everyone is permitted to copy and distribute verbatim copies&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; of this license document, but changing it is not allowed.&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; This version of the GNU Lesser General Public License incorporates&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;the terms and conditions of version 3 of the GNU General Public&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;License, supplemented by the additional permissions listed below.&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; 0. Additional Definitions.&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; As used herein, &amp;quot;this License&amp;quot; refers to version 3 of the GNU Lesser&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;General Public License, and the &amp;quot;GNU GPL&amp;quot; refers to version 3 of the GNU&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;General Public License.&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; &amp;quot;The Library&amp;quot; refers to a covered work governed by this License,&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;other than an Application or a Combined Work as defined below.&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; An &amp;quot;Application&amp;quot; is any work that makes use of an interface provided&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;by the Library, but which is not otherwise based on the Library.&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Defining a subclass of a class defined by the Library is deemed a mode&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;of using an interface provided by the Library.&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; A &amp;quot;Combined Work&amp;quot; is a work produced by combining or linking an&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Application with the Library. The particular version of the Library&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;with which the Combined Work was made is also called the &amp;quot;Linked&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Version&amp;quot;.&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; The &amp;quot;Minimal Corresponding Source&amp;quot; for a Combined Work means the&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Corresponding Source for the Combined Work, excluding any source code&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;for portions of the Combined Work that, considered in isolation, are&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;based on the Application, and not on the Linked Version.&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; The &amp;quot;Corresponding Application Code&amp;quot; for a Combined Work means the&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;object code and/or source code for the Application, including any data&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;and utility programs needed for reproducing the Combined Work from the&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Application, but excluding the System Libraries of the Combined Work.&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; 1. Exception to Section 3 of the GNU GPL.&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; You may convey a covered work under sections 3 and 4 of this License&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;without being bound by section 3 of the GNU GPL.&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; 2. Conveying Modified Versions.&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; If you modify a copy of the Library, and, in your modifications, a&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;facility refers to a function or data to be supplied by an Application&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;that uses the facility (other than as an argument passed when the&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;facility is invoked), then you may convey a copy of the modified&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;version:&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; a) under this License, provided that you make a good faith effort to&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; ensure that, in the event an Application does not supply the&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; function or data, the facility still operates, and performs&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; whatever part of its purpose remains meaningful, or&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; b) under the GNU GPL, with none of the additional permissions of&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; this License applicable to that copy.&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; 3. Object Code Incorporating Material from Library Header Files.&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; The object code form of an Application may incorporate material from&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;a header file that is part of the Library. You may convey such object&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;code under terms of your choice, provided that, if the incorporated&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;material is not limited to numerical parameters, data structure&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;layouts and accessors, or small macros, inline functions and templates&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;(ten or fewer lines in length), you do both of the following:&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; a) Give prominent notice with each copy of the object code that the&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; Library is used in it and that the Library and its use are&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; covered by this License.&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; b) Accompany the object code with a copy of the GNU GPL and this license&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; document.&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; 4. Combined Works.&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; You may convey a Combined Work under terms of your choice that,&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;taken together, effectively do not restrict modification of the&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;portions of the Library contained in the Combined Work and reverse&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;engineering for debugging such modifications, if you also do each of&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;the following:&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; a) Give prominent notice with each copy of the Combined Work that&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; the Library is used in it and that the Library and its use are&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; covered by this License.&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; b) Accompany the Combined Work with a copy of the GNU GPL and this license&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; document.&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; c) For a Combined Work that displays copyright notices during&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; execution, include the copyright notice for the Library among&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; these notices, as well as a reference directing the user to the&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; copies of the GNU GPL and this license document.&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; d) Do one of the following:&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; 0) Convey the Minimal Corresponding Source under the terms of this&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; License, and the Corresponding Application Code in a form&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; suitable for, and under terms that permit, the user to&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; recombine or relink the Application with a modified version of&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; the Linked Version to produce a modified Combined Work, in the&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; manner specified by section 6 of the GNU GPL for conveying&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; Corresponding Source.&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; 1) Use a suitable shared library mechanism for linking with the&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; Library. A suitable mechanism is one that (a) uses at run time&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; a copy of the Library already present on the user's computer&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; system, and (b) will operate properly with a modified version&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; of the Library that is interface-compatible with the Linked&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; Version.&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; e) Provide Installation Information, but only if you would otherwise&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; be required to provide such information under section 6 of the&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; GNU GPL, and only to the extent that such information is&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; necessary to install and execute a modified version of the&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; Combined Work produced by recombining or relinking the&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; Application with a modified version of the Linked Version. (If&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; you use option 4d0, the Installation Information must accompany&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; the Minimal Corresponding Source and Corresponding Application&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; Code. If you use option 4d1, you must provide the Installation&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; Information in the manner specified by section 6 of the GNU GPL&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; for conveying Corresponding Source.)&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; 5. Combined Libraries.&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; You may place library facilities that are a work based on the&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Library side by side in a single library together with other library&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;facilities that are not Applications and are not covered by this&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;License, and convey such a combined library under terms of your&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;choice, if you do both of the following:&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; a) Accompany the combined library with a copy of the same work based&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; on the Library, uncombined with any other library facilities,&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; conveyed under the terms of this License.&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; b) Give prominent notice with the combined library that part of it&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; is a work based on the Library, and explaining where to find the&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; accompanying uncombined form of the same work.&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; 6. Revised Versions of the GNU Lesser General Public License.&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; The Free Software Foundation may publish revised and/or new versions&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;of the GNU Lesser General Public License from time to time. Such new&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;versions will be similar in spirit to the present version, but may&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;differ in detail to address new problems or concerns.&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; Each version is given a distinguishing version number. If the&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Library as you received it specifies that a certain numbered version&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;of the GNU Lesser General Public License &amp;quot;or any later version&amp;quot;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;applies to it, you have the option of following the terms and&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;conditions either of that published version or of any later version&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;published by the Free Software Foundation. If the Library as you&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;received it does not specify a version number of the GNU Lesser&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;General Public License, you may choose any version of the GNU Lesser&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;General Public License ever published by the Free Software Foundation.&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; If the Library as you received it specifies that a proxy can decide&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;whether future versions of the GNU Lesser General Public License shall&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;apply, that proxy's public statement of acceptance of any version is&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;permanent authorization for you to choose that version for the&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Library.&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="usedLibrariesLabel">
<property name="text">
<string>Used libraries</string>
</property>
</widget>
</item>
<item>
<widget class="QTableWidget" name="tableWidget"/>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>PDFAboutDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>PDFAboutDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@@ -0,0 +1,298 @@
// Copyright (C) 2020 Jakub Melka
//
// This file is part of Pdf4Qt.
//
// Pdf4Qt is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Pdf4Qt is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with Pdf4Qt. If not, see <https://www.gnu.org/licenses/>.
#include "pdfadvancedfindwidget.h"
#include "ui_pdfadvancedfindwidget.h"
#include "pdfcompiler.h"
#include "pdfdocument.h"
#include "pdfdrawspacecontroller.h"
#include <QMessageBox>
namespace pdfviewer
{
PDFAdvancedFindWidget::PDFAdvancedFindWidget(pdf::PDFDrawWidgetProxy* proxy, QWidget* parent) :
QWidget(parent),
ui(new Ui::PDFAdvancedFindWidget),
m_proxy(proxy),
m_document(nullptr)
{
ui->setupUi(this);
ui->resultsTableWidget->setHorizontalHeaderLabels({ tr("Page No."), tr("Phrase"), tr("Context") });
connect(ui->regularExpressionsCheckbox, &QCheckBox::clicked, this, &PDFAdvancedFindWidget::updateUI);
connect(m_proxy, &pdf::PDFDrawWidgetProxy::textLayoutChanged, this, &PDFAdvancedFindWidget::performSearch);
connect(ui->resultsTableWidget, &QTableWidget::cellDoubleClicked, this, &PDFAdvancedFindWidget::onResultItemDoubleClicked);
connect(ui->resultsTableWidget, &QTableWidget::itemSelectionChanged, this, &PDFAdvancedFindWidget::onSelectionChanged);
updateUI();
}
PDFAdvancedFindWidget::~PDFAdvancedFindWidget()
{
delete ui;
}
void PDFAdvancedFindWidget::setDocument(const pdf::PDFModifiedDocument& document)
{
if (m_document != document)
{
m_document = document;
// If document is not being reset, then page text should remain the same,
// so, there is no need to clear the results.
if (document.hasReset())
{
m_findResults.clear();
updateUI();
updateResultsUI();
}
}
}
void PDFAdvancedFindWidget::on_searchButton_clicked()
{
m_parameters.phrase = ui->searchPhraseEdit->text();
m_parameters.isCaseSensitive = ui->caseSensitiveCheckBox->isChecked();
m_parameters.isWholeWordsOnly = ui->wholeWordsOnlyCheckBox->isChecked();
m_parameters.isRegularExpression = ui->regularExpressionsCheckbox->isChecked();
m_parameters.isDotMatchingEverything = ui->dotMatchesEverythingCheckBox->isChecked();
m_parameters.isMultiline = ui->multilineMatchingCheckBox->isChecked();
m_parameters.isSoftHyphenRemoved = ui->removeSoftHyphenCheckBox->isChecked();
m_parameters.isSearchFinished = m_parameters.phrase.isEmpty();
if (m_parameters.isSearchFinished)
{
// We have nothing to search for
return;
}
// Validate regular expression
if (m_parameters.isRegularExpression)
{
QRegularExpression expression(m_parameters.phrase);
if (!expression.isValid())
{
m_parameters.isSearchFinished = true;
const int patternErrorOffset = expression.patternErrorOffset();
QMessageBox::critical(this, tr("Search error"), tr("Search phrase regular expression has error '%1' near symbol %2.").arg(expression.errorString()).arg(patternErrorOffset));
ui->searchPhraseEdit->setFocus();
ui->searchPhraseEdit->setSelection(patternErrorOffset, 1);
return;
}
}
m_findResults.clear();
m_textSelection.dirty();
updateResultsUI();
pdf::PDFAsynchronousTextLayoutCompiler* compiler = m_proxy->getTextLayoutCompiler();
if (compiler->isTextLayoutReady())
{
performSearch();
}
else
{
compiler->makeTextLayout();
}
}
void PDFAdvancedFindWidget::on_clearButton_clicked()
{
m_parameters = SearchParameters();
m_findResults.clear();
updateResultsUI();
}
void PDFAdvancedFindWidget::onSelectionChanged()
{
m_textSelection.dirty();
m_proxy->repaintNeeded();
}
void PDFAdvancedFindWidget::onResultItemDoubleClicked(int row, int column)
{
Q_UNUSED(column);
if (row >= 0 && row < m_findResults.size())
{
const pdf::PDFFindResult& findResult = m_findResults[row];
const pdf::PDFInteger pageIndex = findResult.textSelectionItems.front().first.pageIndex;
m_proxy->goToPage(pageIndex);
}
}
void PDFAdvancedFindWidget::updateUI()
{
const bool enableUI = m_document && m_document->getCatalog()->getPageCount() > 0;
const bool enableRegularExpressionUI = enableUI && ui->regularExpressionsCheckbox->isChecked();
ui->searchForGroupBox->setEnabled(enableUI);
ui->regularExpressionSettingsGroupBox->setEnabled(enableRegularExpressionUI);
}
void PDFAdvancedFindWidget::updateResultsUI()
{
ui->tabWidget->setTabText(ui->tabWidget->indexOf(ui->resultsTab), !m_findResults.empty() ? tr("Results (%1)").arg(m_findResults.size()) : tr("Results"));
ui->resultsTableWidget->setRowCount(static_cast<int>(m_findResults.size()));
for (int i = 0, rowCount = int(m_findResults.size()); i < rowCount; ++i)
{
const pdf::PDFFindResult& findResult = m_findResults[i];
ui->resultsTableWidget->setItem(i, 0, new QTableWidgetItem(QString::number(findResult.textSelectionItems.front().first.pageIndex + 1)));
ui->resultsTableWidget->setItem(i, 1, new QTableWidgetItem(findResult.matched));
ui->resultsTableWidget->setItem(i, 2, new QTableWidgetItem(findResult.context));
}
if (!m_findResults.empty())
{
ui->tabWidget->setCurrentWidget(ui->resultsTab);
}
}
void PDFAdvancedFindWidget::drawPage(QPainter* painter,
pdf::PDFInteger pageIndex,
const pdf::PDFPrecompiledPage* compiledPage,
pdf::PDFTextLayoutGetter& layoutGetter,
const QMatrix& pagePointToDevicePointMatrix,
QList<pdf::PDFRenderError>& errors) const
{
Q_UNUSED(compiledPage);
Q_UNUSED(errors);
const pdf::PDFTextSelection& textSelection = getTextSelection();
pdf::PDFTextSelectionPainter textSelectionPainter(&textSelection);
textSelectionPainter.draw(painter, pageIndex, layoutGetter, pagePointToDevicePointMatrix);
}
void PDFAdvancedFindWidget::performSearch()
{
if (m_parameters.isSearchFinished || m_parameters.phrase.isEmpty())
{
return;
}
m_parameters.isSearchFinished = true;
pdf::PDFAsynchronousTextLayoutCompiler* compiler = m_proxy->getTextLayoutCompiler();
if (!compiler->isTextLayoutReady())
{
// Text layout is not ready yet
return;
}
// Prepare string to search
bool useRegularExpression = m_parameters.isRegularExpression;
QString expression = m_parameters.phrase;
if (m_parameters.isWholeWordsOnly)
{
if (useRegularExpression)
{
expression = QString("\\b%1\\b").arg(expression);
}
else
{
expression = QString("\\b%1\\b").arg(QRegularExpression::escape(expression));
}
useRegularExpression = true;
}
pdf::PDFTextFlow::FlowFlags flowFlags = pdf::PDFTextFlow::SeparateBlocks;
if (m_parameters.isSoftHyphenRemoved)
{
flowFlags |= pdf::PDFTextFlow::RemoveSoftHyphen;
}
if (m_parameters.isRegularExpression)
{
flowFlags |= pdf::PDFTextFlow::AddLineBreaks;
}
const pdf::PDFTextLayoutStorage* textLayoutStorage = compiler->getTextLayoutStorage();
if (!useRegularExpression)
{
// Use simple text search
Qt::CaseSensitivity caseSensitivity = m_parameters.isCaseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive;
m_findResults = textLayoutStorage->find(expression, caseSensitivity, flowFlags);
}
else
{
// Use regular expression search
QRegularExpression::PatternOptions patternOptions = QRegularExpression::UseUnicodePropertiesOption | QRegularExpression::OptimizeOnFirstUsageOption;
if (!m_parameters.isCaseSensitive)
{
patternOptions |= QRegularExpression::CaseInsensitiveOption;
}
if (m_parameters.isDotMatchingEverything)
{
patternOptions |= QRegularExpression::DotMatchesEverythingOption;
}
if (m_parameters.isMultiline)
{
patternOptions |= QRegularExpression::MultilineOption;
}
QRegularExpression regularExpression(expression, patternOptions);
m_findResults = textLayoutStorage->find(regularExpression, flowFlags);
}
m_textSelection.dirty();
m_proxy->repaintNeeded();
updateResultsUI();
}
pdf::PDFTextSelection PDFAdvancedFindWidget::getTextSelectionImpl() const
{
pdf::PDFTextSelection result;
std::vector<size_t> selectedRowIndices;
QModelIndexList selectedRows = ui->resultsTableWidget->selectionModel()->selectedRows();
std::transform(selectedRows.cbegin(), selectedRows.cend(), std::back_inserter(selectedRowIndices), [] (const QModelIndex& index) { return index.row(); });
std::sort(selectedRowIndices.begin(), selectedRowIndices.end());
for (size_t i = 0; i < m_findResults.size(); ++i)
{
const pdf::PDFFindResult& findResult = m_findResults[i];
QColor color(Qt::blue);
if (std::binary_search(selectedRowIndices.cbegin(), selectedRowIndices.cend(), i))
{
color = QColor(Qt::yellow);
}
result.addItems(findResult.textSelectionItems, color);
}
result.build();
return result;
}
void PDFAdvancedFindWidget::showEvent(QShowEvent* event)
{
BaseClass::showEvent(event);
m_proxy->registerDrawInterface(this);
}
void PDFAdvancedFindWidget::hideEvent(QHideEvent* event)
{
m_proxy->unregisterDrawInterface(this);
BaseClass::hideEvent(event);
}
} // namespace pdfviewer

View File

@@ -0,0 +1,103 @@
// Copyright (C) 2020 Jakub Melka
//
// This file is part of Pdf4Qt.
//
// Pdf4Qt is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Pdf4Qt is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with Pdf4Qt. If not, see <https://www.gnu.org/licenses/>.
#ifndef PDFADVANCEDFINDWIDGET_H
#define PDFADVANCEDFINDWIDGET_H
#include "pdfglobal.h"
#include "pdfdrawspacecontroller.h"
#include "pdftextlayout.h"
#include <QWidget>
namespace Ui
{
class PDFAdvancedFindWidget;
}
namespace pdf
{
class PDFDocument;
class PDFDrawWidgetProxy;
}
namespace pdfviewer
{
class PDFAdvancedFindWidget : public QWidget, public pdf::IDocumentDrawInterface
{
Q_OBJECT
private:
using BaseClass = QWidget;
public:
explicit PDFAdvancedFindWidget(pdf::PDFDrawWidgetProxy* proxy, QWidget* parent = nullptr);
virtual ~PDFAdvancedFindWidget() override;
virtual void drawPage(QPainter* painter,
pdf::PDFInteger pageIndex,
const pdf::PDFPrecompiledPage* compiledPage,
pdf::PDFTextLayoutGetter& layoutGetter,
const QMatrix& pagePointToDevicePointMatrix,
QList<pdf::PDFRenderError>& errors) const override;
void setDocument(const pdf::PDFModifiedDocument& document);
protected:
virtual void showEvent(QShowEvent* event) override;
virtual void hideEvent(QHideEvent* event) override;
private slots:
void on_searchButton_clicked();
void onSelectionChanged();
void onResultItemDoubleClicked(int row, int column);
void on_clearButton_clicked();
private:
void updateUI();
void updateResultsUI();
void performSearch();
pdf::PDFTextSelection getTextSelection() const { return m_textSelection.get(this, &PDFAdvancedFindWidget::getTextSelectionImpl); }
pdf::PDFTextSelection getTextSelectionImpl() const;
struct SearchParameters
{
QString phrase;
bool isCaseSensitive = false;
bool isWholeWordsOnly = false;
bool isRegularExpression = false;
bool isDotMatchingEverything = false;
bool isMultiline = false;
bool isSearchFinished = false;
bool isSoftHyphenRemoved = false;
};
Ui::PDFAdvancedFindWidget* ui;
pdf::PDFDrawWidgetProxy* m_proxy;
const pdf::PDFDocument* m_document;
SearchParameters m_parameters;
pdf::PDFFindResults m_findResults;
mutable pdf::PDFCachedItem<pdf::PDFTextSelection> m_textSelection;
};
} // namespace pdfviewer
#endif // PDFADVANCEDFINDWIDGET_H

View File

@@ -0,0 +1,164 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>PDFAdvancedFindWidget</class>
<widget class="QWidget" name="PDFAdvancedFindWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>881</width>
<height>457</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="searchTab">
<attribute name="title">
<string>Search for</string>
</attribute>
<layout class="QVBoxLayout" name="searchTabLayout">
<item>
<widget class="QGroupBox" name="searchForGroupBox">
<property name="title">
<string>Search Settings</string>
</property>
<layout class="QGridLayout" name="searchSettingsGroupBoxLayout" columnstretch="0,1,0,0">
<item row="5" column="3">
<widget class="QPushButton" name="searchButton">
<property name="text">
<string>Search</string>
</property>
</widget>
</item>
<item row="2" column="1" colspan="3">
<widget class="QCheckBox" name="wholeWordsOnlyCheckBox">
<property name="text">
<string>Whole words only</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QCheckBox" name="removeSoftHyphenCheckBox">
<property name="text">
<string>Remove soft hyphen at end of line</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="searchLabel">
<property name="text">
<string>Search for:</string>
</property>
</widget>
</item>
<item row="1" column="1" colspan="3">
<widget class="QCheckBox" name="caseSensitiveCheckBox">
<property name="text">
<string>Case sensitive</string>
</property>
</widget>
</item>
<item row="0" column="1" colspan="3">
<widget class="QLineEdit" name="searchPhraseEdit"/>
</item>
<item row="3" column="1" colspan="3">
<widget class="QCheckBox" name="regularExpressionsCheckbox">
<property name="text">
<string>Use regular expressions</string>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QPushButton" name="clearButton">
<property name="text">
<string>Clear</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="regularExpressionSettingsGroupBox">
<property name="title">
<string>Regular Expression Settings</string>
</property>
<layout class="QVBoxLayout" name="regularExpressionSettingsGroupBoxLayout">
<item>
<widget class="QCheckBox" name="dotMatchesEverythingCheckBox">
<property name="text">
<string>Dot matches everything (including newline characters)</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="multilineMatchingCheckBox">
<property name="text">
<string>Multiline matching (enables search using '^' and '$' to mark line beginnings/endings)</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="resultsTab">
<attribute name="title">
<string>Results</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QTableWidget" name="resultsTableWidget">
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<property name="columnCount">
<number>3</number>
</property>
<attribute name="horizontalHeaderStretchLastSection">
<bool>true</bool>
</attribute>
<column/>
<column/>
<column/>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@@ -0,0 +1,560 @@
// Copyright (C) 2019-2020 Jakub Melka
//
// This file is part of Pdf4Qt.
//
// Pdf4Qt is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Pdf4Qt is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with Pdf4Qt. If not, see <https://www.gnu.org/licenses/>.
#include "pdfdocumentpropertiesdialog.h"
#include "ui_pdfdocumentpropertiesdialog.h"
#include "pdfdocument.h"
#include "pdfwidgetutils.h"
#include "pdffont.h"
#include "pdfutils.h"
#include "pdfexception.h"
#include "pdfexecutionpolicy.h"
#include <QLocale>
#include <QPageSize>
#include <QtConcurrent/QtConcurrent>
#include <execution>
namespace pdfviewer
{
PDFDocumentPropertiesDialog::PDFDocumentPropertiesDialog(const pdf::PDFDocument* document,
const PDFFileInfo* fileInfo,
QWidget* parent) :
QDialog(parent),
ui(new Ui::PDFDocumentPropertiesDialog)
{
ui->setupUi(this);
initializeProperties(document);
initializeFileInfoProperties(fileInfo);
initializeSecurity(document);
initializeFonts(document);
initializeDisplayAndPrintSettings(document);
const int minimumSectionSize = pdf::PDFWidgetUtils::scaleDPI_x(this, 300);
for (QTreeWidget* widget : findChildren<QTreeWidget*>(QString(), Qt::FindChildrenRecursively))
{
widget->header()->setMinimumSectionSize(minimumSectionSize);
}
pdf::PDFWidgetUtils::scaleWidget(this, QSize(750, 600));
}
PDFDocumentPropertiesDialog::~PDFDocumentPropertiesDialog()
{
Q_ASSERT(m_fontTreeWidgetItems.empty());
delete ui;
}
void PDFDocumentPropertiesDialog::initializeProperties(const pdf::PDFDocument* document)
{
QLocale locale;
// Initialize document properties
QTreeWidgetItem* propertiesRoot = new QTreeWidgetItem({ tr("Properties") });
const pdf::PDFDocumentInfo* info = document->getInfo();
const pdf::PDFCatalog* catalog = document->getCatalog();
new QTreeWidgetItem(propertiesRoot, { tr("PDF version"), QString::fromLatin1(document->getVersion()) });
new QTreeWidgetItem(propertiesRoot, { tr("Title"), info->title });
new QTreeWidgetItem(propertiesRoot, { tr("Subject"), info->subject });
new QTreeWidgetItem(propertiesRoot, { tr("Author"), info->author });
new QTreeWidgetItem(propertiesRoot, { tr("Keywords"), info->keywords });
new QTreeWidgetItem(propertiesRoot, { tr("Creator"), info->creator });
new QTreeWidgetItem(propertiesRoot, { tr("Producer"), info->producer });
new QTreeWidgetItem(propertiesRoot, { tr("Creation date"), locale.toString(info->creationDate) });
new QTreeWidgetItem(propertiesRoot, { tr("Modified date"), locale.toString(info->modifiedDate) });
QString trapped;
switch (info->trapped)
{
case pdf::PDFDocumentInfo::Trapped::True:
trapped = tr("Yes");
break;
case pdf::PDFDocumentInfo::Trapped::False:
trapped = tr("No");
break;
case pdf::PDFDocumentInfo::Trapped::Unknown:
trapped = tr("Unknown");
break;
default:
Q_ASSERT(false);
break;
}
QTreeWidgetItem* contentRoot = new QTreeWidgetItem({ tr("Content") });
const pdf::PDFInteger pageCount = catalog->getPageCount();
new QTreeWidgetItem(contentRoot, { tr("Page count"), locale.toString(pageCount) });
if (pageCount > 0)
{
const pdf::PDFPage* firstPage = catalog->getPage(0);
QSizeF pageSizeMM = firstPage->getRectMM(firstPage->getRotatedMediaBox()).size();
QPageSize pageSize(pageSizeMM, QPageSize::Millimeter, QString(), QPageSize::FuzzyOrientationMatch);
QString paperSizeString = QString("%1 x %2 mm").arg(locale.toString(pageSizeMM.width()), locale.toString(pageSizeMM.height()));
new QTreeWidgetItem(contentRoot, { tr("Paper format"), pageSize.name() });
new QTreeWidgetItem(contentRoot, { tr("Paper size"), paperSizeString });
}
new QTreeWidgetItem(contentRoot, { tr("Trapped"), trapped });
ui->propertiesTreeWidget->addTopLevelItem(propertiesRoot);
ui->propertiesTreeWidget->addTopLevelItem(contentRoot);
if (!info->extra.empty())
{
QTreeWidgetItem* customRoot = new QTreeWidgetItem({ tr("Custom properties") });
for (const auto& item : info->extra)
{
QString key = QString::fromLatin1(item.first);
QVariant valueVariant = item.second;
QString value = (valueVariant.type() == QVariant::DateTime) ? locale.toString(valueVariant.toDateTime()) : valueVariant.toString();
new QTreeWidgetItem(customRoot, { key, value });
}
ui->propertiesTreeWidget->addTopLevelItem(customRoot);
}
ui->propertiesTreeWidget->expandAll();
ui->propertiesTreeWidget->resizeColumnToContents(0);
}
void PDFDocumentPropertiesDialog::initializeFileInfoProperties(const PDFFileInfo* fileInfo)
{
QLocale locale;
// Initialize document file info
QTreeWidgetItem* fileInfoRoot = new QTreeWidgetItem({ tr("File information") });
new QTreeWidgetItem(fileInfoRoot, { tr("Name"), fileInfo->fileName });
new QTreeWidgetItem(fileInfoRoot, { tr("Directory"), fileInfo->path });
new QTreeWidgetItem(fileInfoRoot, { tr("Writable"), fileInfo->writable ? tr("Yes") : tr("No") });
QString fileSize;
if (fileInfo->fileSize > 1024 * 1024)
{
fileSize = QString("%1 MB (%2 bytes)").arg(locale.toString(fileInfo->fileSize / (1024.0 * 1024.0)), locale.toString(fileInfo->fileSize));
}
else
{
fileSize = QString("%1 kB (%2 bytes)").arg(locale.toString(fileInfo->fileSize / 1024.0), locale.toString(fileInfo->fileSize));
}
new QTreeWidgetItem(fileInfoRoot, { tr("Size"), fileSize });
new QTreeWidgetItem(fileInfoRoot, { tr("Created date"), locale.toString(fileInfo->creationTime) });
new QTreeWidgetItem(fileInfoRoot, { tr("Modified date"), locale.toString(fileInfo->lastModifiedTime) });
new QTreeWidgetItem(fileInfoRoot, { tr("Last read date"), locale.toString(fileInfo->lastReadTime) });
ui->fileInfoTreeWidget->addTopLevelItem(fileInfoRoot);
ui->fileInfoTreeWidget->expandAll();
ui->fileInfoTreeWidget->resizeColumnToContents(0);
}
void PDFDocumentPropertiesDialog::initializeSecurity(const pdf::PDFDocument* document)
{
QLocale locale;
QTreeWidgetItem* securityRoot = new QTreeWidgetItem({ tr("Security") });
const pdf::PDFSecurityHandler* securityHandler = document->getStorage().getSecurityHandler();
const pdf::EncryptionMode mode = securityHandler->getMode();
QString modeString;
switch (mode)
{
case pdf::EncryptionMode::None:
modeString = tr("None");
break;
case pdf::EncryptionMode::Standard:
modeString = tr("Standard");
break;
case pdf::EncryptionMode::Custom:
modeString = tr("Custom");
break;
default:
Q_ASSERT(false);
break;
}
QString authorizationMode;
switch (securityHandler->getAuthorizationResult())
{
case pdf::PDFSecurityHandler::AuthorizationResult::NoAuthorizationRequired:
authorizationMode = tr("No authorization required");
break;
case pdf::PDFSecurityHandler::AuthorizationResult::OwnerAuthorized:
authorizationMode = tr("Authorized as owner");
break;
case pdf::PDFSecurityHandler::AuthorizationResult::UserAuthorized:
authorizationMode = tr("Authorized as user");
break;
default:
Q_ASSERT(false);
break;
}
new QTreeWidgetItem(securityRoot, { tr("Document encryption"), modeString });
new QTreeWidgetItem(securityRoot, { tr("Authorized as"), authorizationMode });
if (securityHandler->getAuthorizationResult() != pdf::PDFSecurityHandler::AuthorizationResult::NoAuthorizationRequired)
{
new QTreeWidgetItem(securityRoot, { tr("Metadata encrypted"), securityHandler->isMetadataEncrypted() ? tr("Yes") : tr("No") });
new QTreeWidgetItem(securityRoot, { tr("Version"), locale.toString(securityHandler->getVersion()) });
}
QTreeWidgetItem* permissionsRoot = new QTreeWidgetItem({ tr("Permissions") });
auto addPermissionInfo = [securityHandler, permissionsRoot](QString caption, pdf::PDFSecurityHandler::Permission permission)
{
new QTreeWidgetItem(permissionsRoot, { caption, securityHandler->isAllowed(permission) ? tr("Yes") : tr("No")});
};
addPermissionInfo(tr("Print (low resolution)"), pdf::PDFSecurityHandler::Permission::PrintLowResolution);
addPermissionInfo(tr("Print (high resolution)"), pdf::PDFSecurityHandler::Permission::PrintHighResolution);
addPermissionInfo(tr("Content extraction"), pdf::PDFSecurityHandler::Permission::CopyContent);
addPermissionInfo(tr("Content extraction (accessibility)"), pdf::PDFSecurityHandler::Permission::Accessibility);
addPermissionInfo(tr("Page assembling"), pdf::PDFSecurityHandler::Permission::Assemble);
addPermissionInfo(tr("Modify content"), pdf::PDFSecurityHandler::Permission::Modify);
addPermissionInfo(tr("Modify interactive items"), pdf::PDFSecurityHandler::Permission::ModifyInteractiveItems);
addPermissionInfo(tr("Fill form fields"), pdf::PDFSecurityHandler::Permission::ModifyFormFields);
ui->securityTreeWidget->addTopLevelItem(securityRoot);
ui->securityTreeWidget->addTopLevelItem(permissionsRoot);
ui->securityTreeWidget->expandAll();
ui->securityTreeWidget->resizeColumnToContents(0);
}
void PDFDocumentPropertiesDialog::initializeFonts(const pdf::PDFDocument* document)
{
auto createFontInfo = [this, document]()
{
pdf::PDFInteger pageCount = document->getCatalog()->getPageCount();
QMutex fontTreeItemMutex;
QMutex usedFontReferencesMutex;
std::set<pdf::PDFObjectReference> usedFontReferences;
auto processPage = [&](pdf::PDFInteger pageIndex)
{
try
{
const pdf::PDFPage* page = document->getCatalog()->getPage(pageIndex);
if (const pdf::PDFDictionary* resourcesDictionary = document->getDictionaryFromObject(page->getResources()))
{
if (const pdf::PDFDictionary* fontsDictionary = document->getDictionaryFromObject(resourcesDictionary->get("Font")))
{
// Iterate trough each font
const size_t fontsCount = fontsDictionary->getCount();
for (size_t i = 0; i < fontsCount; ++i)
{
pdf::PDFObject object = fontsDictionary->getValue(i);
if (object.isReference())
{
// Check, if we have not processed the object. If we have it processed,
// then do nothing, otherwise insert it into the processed objects.
// We must also use mutex, because we use multithreading.
QMutexLocker lock(&usedFontReferencesMutex);
if (usedFontReferences.count(object.getReference()))
{
continue;
}
else
{
usedFontReferences.insert(object.getReference());
}
}
try
{
if (pdf::PDFFontPointer font = pdf::PDFFont::createFont(object, document))
{
pdf::PDFRenderErrorReporterDummy dummyReporter;
pdf::PDFRealizedFontPointer realizedFont = pdf::PDFRealizedFont::createRealizedFont(font, 8.0, &dummyReporter);
if (realizedFont)
{
const pdf::FontType fontType = font->getFontType();
const pdf::FontDescriptor* fontDescriptor = font->getFontDescriptor();
QString fontName = fontDescriptor->fontName;
// Try to remove characters from +, if we have font name 'SDFDSF+ValidFontName'
int plusPos = fontName.lastIndexOf('+');
if (plusPos != -1 && plusPos < fontName.size() - 1)
{
fontName = fontName.mid(plusPos + 1);
}
if (fontName.isEmpty())
{
fontName = QString::fromLatin1(fontsDictionary->getKey(i).getString());
}
std::unique_ptr<QTreeWidgetItem> fontRootItemPtr = std::make_unique<QTreeWidgetItem>(QStringList({ fontName }));
QTreeWidgetItem* fontRootItem = fontRootItemPtr.get();
QString fontTypeString;
switch (fontType)
{
case pdf::FontType::TrueType:
fontTypeString = tr("TrueType");
break;
case pdf::FontType::Type0:
fontTypeString = tr("Type0 (CID keyed)");
break;
case pdf::FontType::Type1:
fontTypeString = tr("Type1 (8 bit keyed)");
break;
case pdf::FontType::MMType1:
fontTypeString = tr("MMType1 (8 bit keyed)");
break;
case pdf::FontType::Type3:
fontTypeString = tr("Type3 (content streams for font glyphs)");
break;
default:
Q_ASSERT(false);
break;
}
new QTreeWidgetItem(fontRootItem, { tr("Type"), fontTypeString });
if (!fontDescriptor->fontFamily.isEmpty())
{
new QTreeWidgetItem(fontRootItem, { tr("Font family"), fontDescriptor->fontFamily });
}
new QTreeWidgetItem(fontRootItem, { tr("Embedded subset"), fontDescriptor->getEmbeddedFontData() ? tr("Yes") : tr("No") });
font->dumpFontToTreeItem(fontRootItem);
realizedFont->dumpFontToTreeItem(fontRootItem);
// Separator item
new QTreeWidgetItem(fontRootItem, QStringList());
// Finally add the tree item
QMutexLocker lock(&fontTreeItemMutex);
m_fontTreeWidgetItems.push_back(fontRootItemPtr.release());
}
}
}
catch (pdf::PDFException)
{
// Do nothing, some error occured, continue with next font
continue;
}
}
}
}
}
catch (pdf::PDFException)
{
// Do nothing, some error occured
}
};
pdf::PDFIntegerRange<pdf::PDFInteger> indices(pdf::PDFInteger(0), pageCount);
pdf::PDFExecutionPolicy::execute(pdf::PDFExecutionPolicy::Scope::Page, indices.begin(), indices.end(), processPage);
};
m_future = QtConcurrent::run(createFontInfo);
connect(&m_futureWatcher, &QFutureWatcher<void>::finished, this, &PDFDocumentPropertiesDialog::onFontsFinished);
m_futureWatcher.setFuture(m_future);
}
void PDFDocumentPropertiesDialog::initializeDisplayAndPrintSettings(const pdf::PDFDocument* document)
{
const pdf::PDFCatalog* catalog = document->getCatalog();
pdf::PageLayout pageLayout = catalog->getPageLayout();
pdf::PageMode pageMode = catalog->getPageMode();
const pdf::PDFViewerPreferences* viewerPreferences = catalog->getViewerPreferences();
QTreeWidgetItem* viewerSettingsRoot = new QTreeWidgetItem({ tr("Viewer settings") });
QTreeWidgetItem* printerSettingsRoot = new QTreeWidgetItem({ tr("Default printer settings") });
QString pageLayoutString;
switch (pageLayout)
{
case pdf::PageLayout::SinglePage:
pageLayoutString = tr("Single page");
break;
case pdf::PageLayout::OneColumn:
pageLayoutString = tr("Continuous column");
break;
case pdf::PageLayout::TwoColumnLeft:
case pdf::PageLayout::TwoColumnRight:
pageLayoutString = tr("Two continuous columns");
break;
case pdf::PageLayout::TwoPagesLeft:
case pdf::PageLayout::TwoPagesRight:
pageLayoutString = tr("Two pages");
break;
default:
Q_ASSERT(false);
break;
}
QString pageModeString;
switch (pageMode)
{
case pdf::PageMode::UseNone:
pageModeString = tr("Default");
break;
case pdf::PageMode::UseOutlines:
pageModeString = tr("Show outlines");
break;
case pdf::PageMode::UseThumbnails:
pageModeString = tr("Show thumbnails");
break;
case pdf::PageMode::Fullscreen:
pageModeString = tr("Fullscreen");
break;
case pdf::PageMode::UseOptionalContent:
pageModeString = tr("Show optional content");
break;
case pdf::PageMode::UseAttachments:
pageModeString = tr("Show attachments");
break;
default:
Q_ASSERT(false);
break;
}
QString directionString;
switch (viewerPreferences->getDirection())
{
case pdf::PDFViewerPreferences::Direction::LeftToRight:
directionString = tr("Left to right");
break;
case pdf::PDFViewerPreferences::Direction::RightToLeft:
directionString = tr("Right to left");
break;
default:
Q_ASSERT(false);
break;
}
new QTreeWidgetItem(viewerSettingsRoot, { tr("Page layout"), pageLayoutString });
new QTreeWidgetItem(viewerSettingsRoot, { tr("View mode"), pageModeString });
new QTreeWidgetItem(viewerSettingsRoot, { tr("Writing direction"), directionString });
QString printScalingString;
switch (viewerPreferences->getPrintScaling())
{
case pdf::PDFViewerPreferences::PrintScaling::None:
printScalingString = tr("None");
break;
case pdf::PDFViewerPreferences::PrintScaling::AppDefault:
printScalingString = tr("Application default");
break;
default:
Q_ASSERT(false);
break;
}
new QTreeWidgetItem(printerSettingsRoot, { tr("Scale"), printScalingString });
QString duplexString;
switch (viewerPreferences->getDuplex())
{
case pdf::PDFViewerPreferences::Duplex::None:
duplexString = tr("None");
break;
case pdf::PDFViewerPreferences::Duplex::Simplex:
duplexString = tr("Simplex");
break;
case pdf::PDFViewerPreferences::Duplex::DuplexFlipLongEdge:
duplexString = tr("Duplex (flip long edge)");
break;
case pdf::PDFViewerPreferences::Duplex::DuplexFlipShortEdge:
duplexString = tr("Duplex (flip long edge)");
break;
default:
Q_ASSERT(false);
break;
}
new QTreeWidgetItem(printerSettingsRoot, { tr("Duplex mode"), duplexString });
new QTreeWidgetItem(printerSettingsRoot, { tr("Pick tray by page size"), viewerPreferences->getOptions().testFlag(pdf::PDFViewerPreferences::PickTrayByPDFSize) ? tr("Yes") : tr("No") });
QStringList pageRanges;
for (const std::pair<pdf::PDFInteger, pdf::PDFInteger>& pageRange : viewerPreferences->getPrintPageRanges())
{
pageRanges << QString("%1-%2").arg(pageRange.first).arg(pageRange.second);
}
QString pageRangesString = pageRanges.join(",");
new QTreeWidgetItem(printerSettingsRoot, { tr("Default print page ranges"), pageRangesString });
new QTreeWidgetItem(printerSettingsRoot, { tr("Number of copies"), QString::number(viewerPreferences->getNumberOfCopies()) });
ui->displayAndPrintTreeWidget->addTopLevelItem(viewerSettingsRoot);
ui->displayAndPrintTreeWidget->addTopLevelItem(printerSettingsRoot);
ui->displayAndPrintTreeWidget->expandAll();
ui->displayAndPrintTreeWidget->resizeColumnToContents(0);
}
void PDFDocumentPropertiesDialog::onFontsFinished()
{
if (!m_fontTreeWidgetItems.empty())
{
std::sort(m_fontTreeWidgetItems.begin(), m_fontTreeWidgetItems.end(), [](QTreeWidgetItem* left, QTreeWidgetItem* right) { return left->data(0, Qt::DisplayRole) < right->data(0, Qt::DisplayRole); });
for (QTreeWidgetItem* item : m_fontTreeWidgetItems)
{
ui->fontsTreeWidget->addTopLevelItem(item);
}
m_fontTreeWidgetItems.clear();
ui->fontsTreeWidget->collapseAll();
ui->fontsTreeWidget->expandToDepth(0);
ui->fontsTreeWidget->resizeColumnToContents(0);
}
}
void PDFDocumentPropertiesDialog::closeEvent(QCloseEvent* event)
{
// We must wait for finishing of font loading;
m_futureWatcher.waitForFinished();
// We must delete all font tree items, because of asynchronous signal sent
qDeleteAll(m_fontTreeWidgetItems);
m_fontTreeWidgetItems.clear();
BaseClass::closeEvent(event);
}
} // namespace pdfviewer

View File

@@ -0,0 +1,88 @@
// Copyright (C) 2019-2020 Jakub Melka
//
// This file is part of Pdf4Qt.
//
// Pdf4Qt is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Pdf4Qt is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with Pdf4Qt. If not, see <https://www.gnu.org/licenses/>.
#ifndef PDFDOCUMENTPROPERTIESDIALOG_H
#define PDFDOCUMENTPROPERTIESDIALOG_H
#include "pdfglobal.h"
#include <QDialog>
#include <QFuture>
#include <QFutureWatcher>
class QTreeWidgetItem;
namespace Ui
{
class PDFDocumentPropertiesDialog;
}
namespace pdf
{
class PDFDocument;
}
namespace pdfviewer
{
struct PDFFileInfo
{
QString originalFileName;
QString fileName;
QString path;
pdf::PDFInteger fileSize = 0;
bool writable = false;
QDateTime creationTime;
QDateTime lastModifiedTime;
QDateTime lastReadTime;
};
class PDFDocumentPropertiesDialog : public QDialog
{
Q_OBJECT
private:
using BaseClass = QDialog;
public:
explicit PDFDocumentPropertiesDialog(const pdf::PDFDocument* document,
const PDFFileInfo* fileInfo,
QWidget* parent);
virtual ~PDFDocumentPropertiesDialog() override;
protected:
virtual void closeEvent(QCloseEvent* event) override;
private:
Ui::PDFDocumentPropertiesDialog* ui;
void initializeProperties(const pdf::PDFDocument* document);
void initializeFileInfoProperties(const PDFFileInfo* fileInfo);
void initializeSecurity(const pdf::PDFDocument* document);
void initializeFonts(const pdf::PDFDocument* document);
void initializeDisplayAndPrintSettings(const pdf::PDFDocument* document);
void onFontsFinished();
std::vector<QTreeWidgetItem*> m_fontTreeWidgetItems;
QFuture<void> m_future;
QFutureWatcher<void> m_futureWatcher;
};
} // namespace pdfviewer
#endif // PDFDOCUMENTPROPERTIESDIALOG_H

View File

@@ -0,0 +1,244 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>PDFDocumentPropertiesDialog</class>
<widget class="QDialog" name="PDFDocumentPropertiesDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>807</width>
<height>609</height>
</rect>
</property>
<property name="windowTitle">
<string>Document Properties</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="propertiesTab">
<attribute name="title">
<string>Properties</string>
</attribute>
<layout class="QVBoxLayout" name="propertiesLayout" stretch="3,2">
<item>
<widget class="QGroupBox" name="propertiesGroupBox">
<property name="title">
<string>Properties</string>
</property>
<layout class="QVBoxLayout" name="propertiesGroupBoxLayout">
<item>
<widget class="QTreeWidget" name="propertiesTreeWidget">
<property name="columnCount">
<number>2</number>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
<column>
<property name="text">
<string notr="true">1</string>
</property>
</column>
<column>
<property name="text">
<string notr="true">2</string>
</property>
</column>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="fileInfoGroupBox">
<property name="title">
<string>File Information</string>
</property>
<layout class="QVBoxLayout" name="fileInfoGroupBoxLayout">
<item>
<widget class="QTreeWidget" name="fileInfoTreeWidget">
<property name="columnCount">
<number>2</number>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
<column>
<property name="text">
<string notr="true">1</string>
</property>
</column>
<column>
<property name="text">
<string notr="true">2</string>
</property>
</column>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="securityTab">
<attribute name="title">
<string>Security</string>
</attribute>
<layout class="QVBoxLayout" name="securityTabLayout">
<item>
<widget class="QGroupBox" name="securityGroupBox">
<property name="title">
<string>Security</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
<widget class="QTreeWidget" name="securityTreeWidget">
<property name="columnCount">
<number>2</number>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
<column>
<property name="text">
<string notr="true">1</string>
</property>
</column>
<column>
<property name="text">
<string notr="true">2</string>
</property>
</column>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="fontsTab">
<attribute name="title">
<string>Fonts</string>
</attribute>
<layout class="QVBoxLayout" name="fontsTabLayout">
<item>
<widget class="QGroupBox" name="fontsGroupBox">
<property name="title">
<string>Fonts</string>
</property>
<layout class="QVBoxLayout" name="fontsGroupBoxLayout">
<item>
<widget class="QTreeWidget" name="fontsTreeWidget">
<property name="columnCount">
<number>2</number>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
<column>
<property name="text">
<string notr="true">1</string>
</property>
</column>
<column>
<property name="text">
<string notr="true">2</string>
</property>
</column>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="displayAndPrintTab">
<attribute name="title">
<string>Display &amp;&amp; Print</string>
</attribute>
<layout class="QVBoxLayout" name="displayAndPrintPageLayout">
<item>
<widget class="QGroupBox" name="displayAndPrintGroupBox">
<property name="title">
<string>Display &amp;&amp; Print Settings</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QTreeWidget" name="displayAndPrintTreeWidget">
<property name="columnCount">
<number>2</number>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
<column>
<property name="text">
<string notr="true">1</string>
</property>
</column>
<column>
<property name="text">
<string notr="true">2</string>
</property>
</column>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>PDFDocumentPropertiesDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>PDFDocumentPropertiesDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@@ -0,0 +1,144 @@
#include "pdfoptimizedocumentdialog.h"
#include "ui_pdfoptimizedocumentdialog.h"
#include "pdfwidgetutils.h"
#include "pdfdocumentwriter.h"
#include <QCheckBox>
#include <QPushButton>
#include <QElapsedTimer>
#include <QtConcurrent/QtConcurrent>
namespace pdfviewer
{
PDFOptimizeDocumentDialog::PDFOptimizeDocumentDialog(const pdf::PDFDocument* document, QWidget* parent) :
QDialog(parent),
ui(new Ui::PDFOptimizeDocumentDialog),
m_document(document),
m_optimizer(pdf::PDFOptimizer::All, nullptr),
m_optimizeButton(nullptr),
m_optimizationInProgress(false),
m_wasOptimized(false)
{
ui->setupUi(this);
auto addCheckBox = [this](QString text, pdf::PDFOptimizer::OptimizationFlag flag)
{
QCheckBox* checkBox = new QCheckBox(text, this);
checkBox->setChecked(m_optimizer.getFlags().testFlag(flag));
connect(checkBox, &QCheckBox::clicked, this, [this, flag](bool checked) { m_optimizer.setFlags(m_optimizer.getFlags().setFlag(flag, checked)); });
ui->groupBoxLayout->addWidget(checkBox);
};
addCheckBox(tr("Embed (dereference) simple objects, such as int, bool, real"), pdf::PDFOptimizer::DereferenceSimpleObjects);
addCheckBox(tr("Remove null objects from dictionary entries"), pdf::PDFOptimizer::RemoveNullObjects);
addCheckBox(tr("Remove unused objects (objects unreachable from document root object)"), pdf::PDFOptimizer::RemoveUnusedObjects);
addCheckBox(tr("Merge identical objects"), pdf::PDFOptimizer::MergeIdenticalObjects);
addCheckBox(tr("Shrink object storage (squeeze free entries)"), pdf::PDFOptimizer::ShrinkObjectStorage);
addCheckBox(tr("Recompress flate streams by maximal compression"), pdf::PDFOptimizer::RecompressFlateStreams);
m_optimizeButton = ui->buttonBox->addButton(tr("Optimize"), QDialogButtonBox::ActionRole);
connect(m_optimizeButton, &QPushButton::clicked, this, &PDFOptimizeDocumentDialog::onOptimizeButtonClicked);
connect(&m_optimizer, &pdf::PDFOptimizer::optimizationStarted, this, &PDFOptimizeDocumentDialog::onOptimizationStarted);
connect(&m_optimizer, &pdf::PDFOptimizer::optimizationProgress, this, &PDFOptimizeDocumentDialog::onOptimizationProgress);
connect(&m_optimizer, &pdf::PDFOptimizer::optimizationFinished, this, &PDFOptimizeDocumentDialog::onOptimizationFinished);
connect(this, &PDFOptimizeDocumentDialog::displayOptimizationInfo, this, &PDFOptimizeDocumentDialog::onDisplayOptimizationInfo);
pdf::PDFWidgetUtils::scaleWidget(this, QSize(640, 380));
updateUi();
}
PDFOptimizeDocumentDialog::~PDFOptimizeDocumentDialog()
{
Q_ASSERT(!m_optimizationInProgress);
Q_ASSERT(!m_future.isRunning());
delete ui;
}
void PDFOptimizeDocumentDialog::optimize()
{
QElapsedTimer timer;
timer.start();
m_optimizer.setDocument(m_document);
m_optimizer.optimize();
m_optimizedDocument = m_optimizer.takeOptimizedDocument();
qreal msecsElapsed = timer.nsecsElapsed() / 1000000.0;
timer.invalidate();
m_optimizationInfo.msecsElapsed = msecsElapsed;
m_optimizationInfo.bytesBeforeOptimization = pdf::PDFDocumentWriter::getDocumentFileSize(m_document);
m_optimizationInfo.bytesAfterOptimization = pdf::PDFDocumentWriter::getDocumentFileSize(&m_optimizedDocument);
emit displayOptimizationInfo();
}
void PDFOptimizeDocumentDialog::onOptimizeButtonClicked()
{
Q_ASSERT(!m_optimizationInProgress);
Q_ASSERT(!m_future.isRunning());
m_optimizationInProgress = true;
m_future = QtConcurrent::run([this]() { optimize(); });
updateUi();
}
void PDFOptimizeDocumentDialog::onOptimizationStarted()
{
Q_ASSERT(m_optimizationInProgress);
ui->logTextEdit->setPlainText(tr("Optimization started!"));
}
void PDFOptimizeDocumentDialog::onOptimizationProgress(QString progressText)
{
Q_ASSERT(m_optimizationInProgress);
ui->logTextEdit->setPlainText(QString("%1\n%2").arg(ui->logTextEdit->toPlainText()).arg(progressText));
}
void PDFOptimizeDocumentDialog::onOptimizationFinished()
{
ui->logTextEdit->setPlainText(QString("%1\n%2").arg(ui->logTextEdit->toPlainText()).arg(tr("Optimization finished!")));
m_future.waitForFinished();
m_optimizationInProgress = false;
m_wasOptimized = true;
updateUi();
}
void PDFOptimizeDocumentDialog::onDisplayOptimizationInfo()
{
QStringList texts;
texts << tr("Optimized in %1 msecs").arg(m_optimizationInfo.msecsElapsed);
if (m_optimizationInfo.bytesBeforeOptimization != -1 &&
m_optimizationInfo.bytesAfterOptimization != -1)
{
texts << tr("Bytes before optimization: %1").arg(m_optimizationInfo.bytesBeforeOptimization);
texts << tr("Bytes after optimization: %1").arg(m_optimizationInfo.bytesAfterOptimization);
texts << tr("Bytes saved by optimization: %1").arg(m_optimizationInfo.bytesBeforeOptimization - m_optimizationInfo.bytesAfterOptimization);
qreal ratio = 100.0;
if (m_optimizationInfo.bytesBeforeOptimization > 0)
{
ratio = 100.0 * qreal(m_optimizationInfo.bytesAfterOptimization) / qreal(m_optimizationInfo.bytesBeforeOptimization);
}
texts << tr("Compression ratio: %1 %").arg(ratio);
}
ui->logTextEdit->setPlainText(QString("%1\n%2").arg(ui->logTextEdit->toPlainText(), texts.join("\n")));
}
void PDFOptimizeDocumentDialog::updateUi()
{
for (QCheckBox* checkBox : findChildren<QCheckBox*>(QString(), Qt::FindChildrenRecursively))
{
checkBox->setEnabled(!m_optimizationInProgress);
}
ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(m_wasOptimized && !m_optimizationInProgress);
ui->buttonBox->button(QDialogButtonBox::Cancel)->setEnabled(!m_optimizationInProgress);
m_optimizeButton->setEnabled(!m_optimizationInProgress);
}
} // namespace pdfviewer

View File

@@ -0,0 +1,60 @@
#ifndef PDFOPTIMIZEDOCUMENTDIALOG_H
#define PDFOPTIMIZEDOCUMENTDIALOG_H
#include "pdfoptimizer.h"
#include <QDialog>
#include <QFuture>
namespace Ui
{
class PDFOptimizeDocumentDialog;
}
namespace pdfviewer
{
class PDFOptimizeDocumentDialog : public QDialog
{
Q_OBJECT
public:
explicit PDFOptimizeDocumentDialog(const pdf::PDFDocument* document, QWidget* parent);
virtual ~PDFOptimizeDocumentDialog() override;
pdf::PDFDocument takeOptimizedDocument() { return qMove(m_optimizedDocument); }
signals:
void displayOptimizationInfo();
private:
void optimize();
void onOptimizeButtonClicked();
void onOptimizationStarted();
void onOptimizationProgress(QString progressText);
void onOptimizationFinished();
void onDisplayOptimizationInfo();
void updateUi();
struct OptimizationInfo
{
qreal msecsElapsed = 0.0;
qint64 bytesBeforeOptimization = -1;
qint64 bytesAfterOptimization = -1;
};
Ui::PDFOptimizeDocumentDialog* ui;
const pdf::PDFDocument* m_document;
pdf::PDFOptimizer m_optimizer;
QPushButton* m_optimizeButton;
bool m_optimizationInProgress;
bool m_wasOptimized;
QFuture<void> m_future;
pdf::PDFDocument m_optimizedDocument;
OptimizationInfo m_optimizationInfo;
};
} // namespace pdfviewer
#endif // PDFOPTIMIZEDOCUMENTDIALOG_H

View File

@@ -0,0 +1,82 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>PDFOptimizeDocumentDialog</class>
<widget class="QDialog" name="PDFOptimizeDocumentDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>741</width>
<height>530</height>
</rect>
</property>
<property name="windowTitle">
<string>Document optimization</string>
</property>
<layout class="QVBoxLayout" name="dialogLayout">
<item>
<widget class="QGroupBox" name="optimizationSettingsGroupBox">
<property name="title">
<string>Optimization Settings</string>
</property>
<layout class="QVBoxLayout" name="groupBoxLayout"/>
</widget>
</item>
<item>
<widget class="QPlainTextEdit" name="logTextEdit">
<property name="undoRedoEnabled">
<bool>false</bool>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>PDFOptimizeDocumentDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>PDFOptimizeDocumentDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,398 @@
// Copyright (C) 2020 Jakub Melka
//
// This file is part of Pdf4Qt.
//
// Pdf4Qt is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Pdf4Qt is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with Pdf4Qt. If not, see <https://www.gnu.org/licenses/>.
#ifndef PDFPROGRAMCONTROLLER_H
#define PDFPROGRAMCONTROLLER_H
#include "pdfviewerglobal.h"
#include "pdfdocument.h"
#include "pdfsignaturehandler.h"
#include "pdfdocumentreader.h"
#include "pdfdocumentpropertiesdialog.h"
#include "pdfplugin.h"
#include <QObject>
#include <QAction>
#include <QToolButton>
#include <QActionGroup>
#include <array>
class QMainWindow;
class QToolBar;
namespace pdf
{
class PDFAction;
class PDFWidget;
class PDFCMSManager;
class PDFToolManager;
class PDFFormManager;
class PDFWidgetAnnotationManager;
}
namespace pdfviewer
{
class PDFViewerSettings;
class PDFUndoRedoManager;
class PDFRecentFileManager;
class PDFTextToSpeech;
class IMainWindow
{
public:
explicit IMainWindow() = default;
virtual ~IMainWindow() = default;
virtual void updateUI(bool fullUpdate) = 0;
virtual QMenu* addToolMenu(QString name) = 0;
virtual void setStatusBarMessage(QString message, int time) = 0;
virtual void setDocument(const pdf::PDFModifiedDocument& document) = 0;
virtual void adjustToolbar(QToolBar* toolbar) = 0;
};
class Pdf4QtVIEWERLIBSHARED_EXPORT PDFActionManager : public QObject
{
Q_OBJECT
private:
using BaseClass = QObject;
public:
explicit PDFActionManager(QObject* parent);
enum Action
{
Open,
Close,
Quit,
ZoomIn,
ZoomOut,
Find,
FindPrevious,
FindNext,
SelectTextAll,
DeselectText,
CopyText,
RotateRight,
RotateLeft,
Print,
Undo,
Redo,
Save,
SaveAs,
Properties,
Options,
About,
SendByMail,
RenderToImages,
Optimize,
FitPage,
FitWidth,
FitHeight,
ShowRenderingErrors,
GoToDocumentStart,
GoToDocumentEnd,
GoToNextPage,
GoToPreviousPage,
GoToNextLine,
GoToPreviousLine,
CreateStickyNoteComment,
CreateStickyNoteHelp,
CreateStickyNoteInsert,
CreateStickyNoteKey,
CreateStickyNoteNewParagraph,
CreateStickyNoteNote,
CreateStickyNoteParagraph,
CreateTextHighlight,
CreateTextUnderline,
CreateTextStrikeout,
CreateTextSquiggly,
CreateHyperlink,
CreateInlineText,
CreateStraightLine,
CreatePolyline,
CreatePolygon,
CreateEllipse,
CreateFreehandCurve,
CreateStampApproved,
CreateStampAsIs,
CreateStampConfidential,
CreateStampDepartmental,
CreateStampDraft,
CreateStampExperimental,
CreateStampExpired,
CreateStampFinal,
CreateStampForComment,
CreateStampForPublicRelease,
CreateStampNotApproved,
CreateStampNotForPublicRelease,
CreateStampSold,
CreateStampTopSecret,
RenderOptionAntialiasing,
RenderOptionTextAntialiasing,
RenderOptionSmoothPictures,
RenderOptionIgnoreOptionalContentSettings,
RenderOptionDisplayAnnotations,
RenderOptionInvertColors,
RenderOptionShowTextBlocks,
RenderOptionShowTextLines,
PageLayoutSinglePage,
PageLayoutContinuous,
PageLayoutTwoPages,
PageLayoutTwoColumns,
PageLayoutFirstPageOnRightSide,
ToolSelectText,
ToolMagnifier,
ToolScreenshot,
ToolExtractImage,
LastAction
};
enum ActionGroup
{
CreateStickyNoteGroup,
CreateTextHighlightGroup,
CreateStampGroup,
LastActionGroup
};
inline void setAction(Action type, QAction* action) { m_actions[type] = action; }
inline QAction* getAction(Action type) const { return m_actions[type]; }
inline QActionGroup* getActionGroup(ActionGroup group) const { return m_actionGroups[group]; }
/// Creates a tool button with menu for action group. If action group
/// doesn't exist, then nullptr is returned.
/// \param group Action group
/// \param parent Tool button's parent
QToolButton* createToolButtonForActionGroup(ActionGroup group, QWidget* parent) const;
/// Sets shortcut for given action. If action is nullptr,
/// then nothing happens.
/// \param type Action type
/// \param sequence Key sequence
void setShortcut(Action type, QKeySequence sequence);
/// Sets action data. If action is nullptr, then nothing happens.
/// \param type Action type
/// \param userData User data
void setUserData(Action type, QVariant userData);
/// Sets enabled state of the action. If action is nullptr, the nothing happens.
/// \param type Action type
/// \param enabled Enabled
void setEnabled(Action type, bool enabled);
/// Sets check state of the action. If action is nullptr, the nothing happens.
/// \param type Action type
/// \param enabled Enabled
void setChecked(Action type, bool checked);
/// Returns a list of rendering option actions
std::vector<QAction*> getRenderingOptionActions() const;
/// Returns a list of all actions
std::vector<QAction*> getActions() const;
/// Adds additional action to action manager
void addAdditionalAction(QAction* action);
void initActions(QSize iconSize, bool initializeStampActions);
private:
bool hasActions(const std::initializer_list<Action>& actionTypes) const;
std::vector<QAction*> getActionList(const std::initializer_list<Action>& actionTypes) const;
std::array<QAction*, LastAction> m_actions;
std::array<QActionGroup*, LastActionGroup> m_actionGroups;
std::vector<QAction*> m_additionalActions;
};
class Pdf4QtVIEWERLIBSHARED_EXPORT PDFProgramController : public QObject
{
Q_OBJECT
private:
using BaseClass = QObject;
public:
explicit PDFProgramController(QObject* parent);
virtual ~PDFProgramController() override;
enum Feature
{
None = 0x0000, ///< No feature
Tools = 0x0001, ///< Tools
Forms = 0x0002, ///< Forms
UndoRedo = 0x0004, ///< Undo/redo
Plugins = 0x0008, ///< Plugins
TextToSpeech = 0x0010, ///< Text to speech
AllFeatures = 0xFFFF, ///< All features enabled
};
Q_DECLARE_FLAGS(Features, Feature)
void openDocument(const QString& fileName);
void setDocument(pdf::PDFModifiedDocument document);
void closeDocument();
pdf::PDFWidget* getPdfWidget() const { return m_pdfWidget; }
pdf::PDFToolManager* getToolManager() const { return m_toolManager; }
PDFRecentFileManager* getRecentFileManager() const { return m_recentFileManager; }
PDFViewerSettings* getSettings() const { return m_settings; }
pdf::PDFDocument* getDocument() const { return m_pdfDocument.data(); }
pdf::PDFCertificateStore* getCertificateStore() const { return const_cast<pdf::PDFCertificateStore*>(&m_certificateStore); }
PDFTextToSpeech* getTextToSpeech() const { return m_textToSpeech; }
const std::vector<pdf::PDFSignatureVerificationResult>* getSignatures() const { return &m_signatures; }
void initialize(Features features,
QMainWindow* mainWindow,
IMainWindow* mainWindowInterface,
PDFActionManager* actionManager,
pdf::PDFProgress* progress);
void finishInitialization();
void writeSettings();
void performPrint();
void performSave();
void performSaveAs();
void onActionTriggered(const pdf::PDFAction* action);
void updateActionsAvailability();
bool getIsBusy() const;
void setIsBusy(bool isBusy);
bool canClose() const;
signals:
void queryPasswordRequest(QString* password, bool* ok);
private:
struct AsyncReadingResult
{
pdf::PDFDocumentPointer document;
QString errorMessage;
pdf::PDFDocumentReader::Result result = pdf::PDFDocumentReader::Result::Cancelled;
std::vector<pdf::PDFSignatureVerificationResult> signatures;
};
void initializeToolManager();
void initializeAnnotationManager();
void initializeFormManager();
void onActionGoToDocumentStartTriggered();
void onActionGoToDocumentEndTriggered();
void onActionGoToNextPageTriggered();
void onActionGoToPreviousPageTriggered();
void onActionGoToNextLineTriggered();
void onActionGoToPreviousLineTriggered();
void onActionZoomIn();
void onActionZoomOut();
void onActionRotateRightTriggered();
void onActionRotateLeftTriggered();
void onActionRenderingOptionTriggered(bool checked);
void onActionPropertiesTriggered();
void onActionAboutTriggered();
void onActionSendByEMailTriggered();
void onActionRenderToImagesTriggered();
void onActionOptimizeTriggered();
void onActionFitPageTriggered();
void onActionFitWidthTriggered();
void onActionFitHeightTriggered();
void onActionRenderingErrorsTriggered();
void onActionPageLayoutSinglePageTriggered();
void onActionPageLayoutContinuousTriggered();
void onActionPageLayoutTwoPagesTriggered();
void onActionPageLayoutTwoColumnsTriggered();
void onActionFirstPageOnRightSideTriggered();
void onActionFindTriggered();
void onActionOptionsTriggered();
void onActionOpenTriggered();
void onActionCloseTriggered();
void onDrawSpaceChanged();
void onPageLayoutChanged();
void onDocumentReadingFinished();
void onDocumentModified(pdf::PDFModifiedDocument document);
void onDocumentUndoRedo(pdf::PDFModifiedDocument document);
void onQueryPasswordRequest(QString* password, bool* ok);
void onPageRenderingErrorsChanged(pdf::PDFInteger pageIndex, int errorsCount);
void onViewerSettingsChanged();
void updateMagnifierToolSettings();
void updateUndoRedoSettings();
void updateUndoRedoActions();
void updateTitle();
void updatePageLayoutActions();
void updateRenderingOptionActions();
void setPageLayout(pdf::PageLayout pageLayout);
void updateFileInfo(const QString& fileName);
enum SettingFlag
{
NoSettings = 0x0000, ///< No feature
WindowSettings = 0x0001, ///< Window settings
GeneralSettings = 0x0002, ///< General settings
PluginsSettings = 0x0004, ///< Enabled plugin settings
ActionSettings = 0x0008, ///< Action settings
RecentFileSettings = 0x0010, ///< Recent files settings
CertificateSettings = 0x0020, ///< Certificate settings
};
Q_DECLARE_FLAGS(Settings, SettingFlag)
void loadPlugins();
void readSettings(Settings settings);
void saveDocument(const QString& fileName);
PDFActionManager* m_actionManager;
QMainWindow* m_mainWindow;
IMainWindow* m_mainWindowInterface;
pdf::PDFWidget* m_pdfWidget;
PDFViewerSettings* m_settings;
PDFUndoRedoManager* m_undoRedoManager;
PDFRecentFileManager* m_recentFileManager;
pdf::PDFOptionalContentActivity* m_optionalContentActivity;
pdf::PDFDocumentPointer m_pdfDocument;
PDFTextToSpeech* m_textToSpeech;
QFuture<AsyncReadingResult> m_future;
QFutureWatcher<AsyncReadingResult>* m_futureWatcher;
pdf::PDFCMSManager* m_CMSManager;
pdf::PDFToolManager* m_toolManager;
pdf::PDFWidgetAnnotationManager* m_annotationManager;
pdf::PDFFormManager* m_formManager;
PDFFileInfo m_fileInfo;
pdf::PDFCertificateStore m_certificateStore;
std::vector<pdf::PDFSignatureVerificationResult> m_signatures;
bool m_isBusy;
pdf::PDFProgress* m_progress;
QStringList m_enabledPlugins;
pdf::PDFPluginInfos m_plugins;
std::vector<std::pair<pdf::PDFPluginInfo, pdf::PDFPlugin*>> m_loadedPlugins;
};
} // namespace pdfviewer
#endif // PDFPROGRAMCONTROLLER_H

View File

@@ -0,0 +1,105 @@
// Copyright (C) 2020 Jakub Melka
//
// This file is part of Pdf4Qt.
//
// Pdf4Qt is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Pdf4Qt is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with Pdf4Qt. If not, see <https://www.gnu.org/licenses/>.
#include "pdfrecentfilemanager.h"
namespace pdfviewer
{
PDFRecentFileManager::PDFRecentFileManager(QObject* parent) :
BaseClass(parent),
m_recentFilesLimit(DEFAULT_RECENT_FILES),
m_actions()
{
// Initialize actions
int index = 0;
for (auto it = m_actions.begin(); it != m_actions.end(); ++it)
{
QAction* recentFileAction = new QAction(this);
recentFileAction->setObjectName(QString("actionRecentFile%1").arg(++index));
recentFileAction->setVisible(false);
connect(recentFileAction, &QAction::triggered, this, &PDFRecentFileManager::onRecentFileActionTriggered);
*it = recentFileAction;
}
}
void PDFRecentFileManager::addRecentFile(QString fileName)
{
m_recentFiles.removeAll(fileName);
m_recentFiles.push_front(fileName);
update();
}
void PDFRecentFileManager::setRecentFiles(QStringList recentFiles)
{
if (m_recentFiles != recentFiles)
{
m_recentFiles = qMove(recentFiles);
update();
}
}
void PDFRecentFileManager::setRecentFilesLimit(int recentFilesLimit)
{
recentFilesLimit = qBound(getMinimumRecentFiles(), recentFilesLimit, getMaximumRecentFiles());
if (m_recentFilesLimit != recentFilesLimit)
{
m_recentFilesLimit = recentFilesLimit;
update();
}
}
void PDFRecentFileManager::update()
{
while (m_recentFiles.size() > m_recentFilesLimit)
{
m_recentFiles.pop_back();
}
for (int i = 0; i < m_actions.size(); ++i)
{
QAction* recentFileAction = m_actions[i];
if (i < m_recentFiles.size())
{
recentFileAction->setData(m_recentFiles[i]);
recentFileAction->setText(m_recentFiles[i]);
recentFileAction->setVisible(true);
}
else
{
recentFileAction->setData(QVariant());
recentFileAction->setText(tr("Recent file dummy %1").arg(i + 1));
recentFileAction->setVisible(false);
}
}
}
void PDFRecentFileManager::onRecentFileActionTriggered()
{
QAction* action = qobject_cast<QAction*>(sender());
Q_ASSERT(action);
QVariant data = action->data();
if (data.type() == QVariant::String)
{
emit fileOpenRequest(data.toString());
}
}
} // namespace pdfviewer

View File

@@ -0,0 +1,84 @@
// Copyright (C) 2020 Jakub Melka
//
// This file is part of Pdf4Qt.
//
// Pdf4Qt is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Pdf4Qt is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with Pdf4Qt. If not, see <https://www.gnu.org/licenses/>.
#ifndef PDFRECENTFILEMANAGER_H
#define PDFRECENTFILEMANAGER_H
#include <QObject>
#include <QAction>
#include <array>
namespace pdfviewer
{
/// Recent file manager, manages list of recent files.
class PDFRecentFileManager : public QObject
{
Q_OBJECT
private:
using BaseClass = QObject;
static constexpr const int MAXIMUM_RECENT_FILES = 9;
static constexpr const int DEFAULT_RECENT_FILES = 5;
public:
explicit PDFRecentFileManager(QObject* parent);
/// Adds recent file to recent file list and updates the actions.
/// New recent file is added as first file.
/// \param fileName New recent file
void addRecentFile(QString fileName);
/// Returns a list of recent files
const QStringList& getRecentFiles() const { return m_recentFiles; }
/// Sets a list of recent files, and udpates manager
void setRecentFiles(QStringList recentFiles);
/// Returns a limit of recent files count
int getRecentFilesLimit() const { return m_recentFilesLimit; }
/// Sets a new limit of recent files count
void setRecentFilesLimit(int recentFilesLimit);
/// Returns list of recent files actions
const std::array<QAction*, MAXIMUM_RECENT_FILES>& getActions() const { return m_actions; }
static constexpr int getMinimumRecentFiles() { return 1; }
static constexpr int getDefaultRecentFiles() { return DEFAULT_RECENT_FILES; }
static constexpr int getMaximumRecentFiles() { return MAXIMUM_RECENT_FILES; }
signals:
void fileOpenRequest(QString fileName);
private:
/// Updates recent files actions / recent file list
void update();
/// Reaction on recent file action triggered
void onRecentFileActionTriggered();
int m_recentFilesLimit;
std::array<QAction*, MAXIMUM_RECENT_FILES> m_actions;
QStringList m_recentFiles;
};
} // namespace pdfviewer
#endif // PDFRECENTFILEMANAGER_H

View File

@@ -0,0 +1,351 @@
// Copyright (C) 2020 Jakub Melka
//
// This file is part of Pdf4Qt.
//
// Pdf4Qt is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Pdf4Qt is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with Pdf4Qt. If not, see <https://www.gnu.org/licenses/>.
#include "pdfrendertoimagesdialog.h"
#include "ui_pdfrendertoimagesdialog.h"
#include "pdfutils.h"
#include "pdfwidgetutils.h"
#include "pdfoptionalcontent.h"
#include "pdfdrawspacecontroller.h"
#include <QFileDialog>
#include <QMessageBox>
#include <QPushButton>
#include <QtConcurrent/QtConcurrent>
#include <QImageWriter>
namespace pdfviewer
{
PDFRenderToImagesDialog::PDFRenderToImagesDialog(const pdf::PDFDocument* document,
pdf::PDFDrawWidgetProxy* proxy,
pdf::PDFProgress* progress,
QWidget* parent) :
QDialog(parent),
ui(new Ui::PDFRenderToImagesDialog),
m_document(document),
m_proxy(proxy),
m_progress(progress),
m_imageExportSettings(document),
m_isLoadingData(false),
m_optionalContentActivity(nullptr),
m_rasterizerPool(nullptr)
{
ui->setupUi(this);
qRegisterMetaType<pdf::PDFRenderError>("PDFRenderError");
// Load image formats
for (const QByteArray& format : m_imageWriterSettings.getFormats())
{
ui->formatComboBox->addItem(QString::fromLatin1(format), format);
}
connect(ui->pagesAllButton, &QRadioButton::clicked, this, &PDFRenderToImagesDialog::onPagesButtonClicked);
connect(ui->pagesSelectButton, &QRadioButton::clicked, this, &PDFRenderToImagesDialog::onPagesButtonClicked);
connect(ui->selectedPagesEdit, &QLineEdit::textChanged, this, &PDFRenderToImagesDialog::onSelectedPagesChanged);
connect(ui->directoryEdit, &QLineEdit::textChanged, this, &PDFRenderToImagesDialog::onDirectoryChanged);
connect(ui->fileTemplateEdit, &QLineEdit::textChanged, this, &PDFRenderToImagesDialog::onFileTemplateChanged);
connect(ui->resolutionDPIButton, &QRadioButton::clicked, this, &PDFRenderToImagesDialog::onResolutionButtonClicked);
connect(ui->resolutionPixelsButton, &QRadioButton::clicked, this, &PDFRenderToImagesDialog::onResolutionButtonClicked);
connect(ui->resolutionDPIEdit, QOverload<int>::of(&QSpinBox::valueChanged), this, &PDFRenderToImagesDialog::onResolutionDPIChanged);
connect(ui->resolutionPixelsEdit, QOverload<int>::of(&QSpinBox::valueChanged), this, &PDFRenderToImagesDialog::onResolutionPixelsChanged);
connect(ui->formatComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &PDFRenderToImagesDialog::onFormatChanged);
connect(ui->subtypeComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &PDFRenderToImagesDialog::onSubtypeChanged);
connect(ui->compressionEdit, QOverload<int>::of(&QSpinBox::valueChanged), this, &PDFRenderToImagesDialog::onCompressionChanged);
connect(ui->qualityEdit, QOverload<int>::of(&QSpinBox::valueChanged), this, &PDFRenderToImagesDialog::onQualityChanged);
connect(ui->gammaEdit, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &PDFRenderToImagesDialog::onGammaChanged);
connect(ui->optimizedWriteCheckBox, &QCheckBox::clicked, this, &PDFRenderToImagesDialog::onOptimizedWriteChanged);
connect(ui->progressiveScanWriteCheckBox, &QCheckBox::clicked, this, &PDFRenderToImagesDialog::onProgressiveScanWriteChanged);
connect(&m_watcher, &QFutureWatcher<void>::finished, this, &PDFRenderToImagesDialog::onRenderingFinished);
ui->resolutionDPIEdit->setRange(pdf::PDFPageImageExportSettings::getMinDPIResolution(), pdf::PDFPageImageExportSettings::getMaxDPIResolution());
ui->resolutionPixelsEdit->setRange(pdf::PDFPageImageExportSettings::getMinPixelResolution(), pdf::PDFPageImageExportSettings::getMaxPixelResolution());
loadImageWriterSettings();
loadImageExportSettings();
pdf::PDFWidgetUtils::scaleWidget(this, QSize(1000, 600));
}
PDFRenderToImagesDialog::~PDFRenderToImagesDialog()
{
delete ui;
Q_ASSERT(!m_optionalContentActivity);
Q_ASSERT(!m_rasterizerPool);
}
void PDFRenderToImagesDialog::loadImageWriterSettings()
{
if (m_isLoadingData)
{
return;
}
pdf::PDFTemporaryValueChange guard(&m_isLoadingData, true);
ui->formatComboBox->setCurrentIndex(ui->formatComboBox->findData(m_imageWriterSettings.getCurrentFormat()));
ui->subtypeComboBox->setUpdatesEnabled(false);
ui->subtypeComboBox->clear();
for (const QByteArray& subtype : m_imageWriterSettings.getSubtypes())
{
ui->subtypeComboBox->addItem(QString::fromLatin1(subtype), subtype);
}
ui->subtypeComboBox->setCurrentIndex(ui->subtypeComboBox->findData(m_imageWriterSettings.getCurrentSubtype()));
ui->subtypeComboBox->setUpdatesEnabled(true);
ui->compressionEdit->setValue(m_imageWriterSettings.getCompression());
ui->qualityEdit->setValue(m_imageWriterSettings.getQuality());
ui->gammaEdit->setValue(m_imageWriterSettings.getGamma());
ui->optimizedWriteCheckBox->setChecked(m_imageWriterSettings.hasOptimizedWrite());
ui->progressiveScanWriteCheckBox->setChecked(m_imageWriterSettings.hasProgressiveScanWrite());
ui->subtypeComboBox->setEnabled(m_imageWriterSettings.isOptionSupported(QImageIOHandler::SupportedSubTypes));
ui->compressionEdit->setEnabled(m_imageWriterSettings.isOptionSupported(QImageIOHandler::CompressionRatio));
ui->qualityEdit->setEnabled(m_imageWriterSettings.isOptionSupported(QImageIOHandler::Quality));
ui->gammaEdit->setEnabled(m_imageWriterSettings.isOptionSupported(QImageIOHandler::Gamma));
ui->optimizedWriteCheckBox->setEnabled(m_imageWriterSettings.isOptionSupported(QImageIOHandler::OptimizedWrite));
ui->progressiveScanWriteCheckBox->setEnabled(m_imageWriterSettings.isOptionSupported(QImageIOHandler::ProgressiveScanWrite));
}
void PDFRenderToImagesDialog::loadImageExportSettings()
{
if (m_isLoadingData)
{
return;
}
pdf::PDFTemporaryValueChange guard(&m_isLoadingData, true);
const pdf::PDFPageImageExportSettings::PageSelectionMode pageSelectionMode = m_imageExportSettings.getPageSelectionMode();
ui->pagesAllButton->setChecked(pageSelectionMode == pdf::PDFPageImageExportSettings::PageSelectionMode::All);
ui->pagesSelectButton->setChecked(pageSelectionMode == pdf::PDFPageImageExportSettings::PageSelectionMode::Selection);
if (pageSelectionMode == pdf::PDFPageImageExportSettings::PageSelectionMode::Selection)
{
ui->selectedPagesEdit->setEnabled(true);
ui->selectedPagesEdit->setText(m_imageExportSettings.getPageSelection());
}
else
{
ui->selectedPagesEdit->setEnabled(false);
ui->selectedPagesEdit->setText(QString());
}
ui->directoryEdit->setText(m_imageExportSettings.getDirectory());
ui->fileTemplateEdit->setText(m_imageExportSettings.getFileTemplate());
const pdf::PDFPageImageExportSettings::ResolutionMode resolutionMode = m_imageExportSettings.getResolutionMode();
ui->resolutionDPIButton->setChecked(resolutionMode == pdf::PDFPageImageExportSettings::ResolutionMode::DPI);
ui->resolutionPixelsButton->setChecked(resolutionMode == pdf::PDFPageImageExportSettings::ResolutionMode::Pixels);
ui->resolutionDPIEdit->setValue(m_imageExportSettings.getDpiResolution());
ui->resolutionPixelsEdit->setValue(m_imageExportSettings.getPixelResolution());
ui->resolutionDPIEdit->setEnabled(resolutionMode == pdf::PDFPageImageExportSettings::ResolutionMode::DPI);
ui->resolutionPixelsEdit->setEnabled(resolutionMode == pdf::PDFPageImageExportSettings::ResolutionMode::Pixels);
}
void PDFRenderToImagesDialog::onFormatChanged()
{
m_imageWriterSettings.selectFormat(ui->formatComboBox->currentData().toByteArray());
loadImageWriterSettings();
}
void PDFRenderToImagesDialog::onSubtypeChanged()
{
m_imageWriterSettings.setCurrentSubtype(ui->subtypeComboBox->currentData().toByteArray());
}
void PDFRenderToImagesDialog::onPagesButtonClicked(bool checked)
{
if (checked)
{
const pdf::PDFPageImageExportSettings::PageSelectionMode pageSelectionMode = (sender() == ui->pagesAllButton) ? pdf::PDFPageImageExportSettings::PageSelectionMode::All
: pdf::PDFPageImageExportSettings::PageSelectionMode::Selection;
m_imageExportSettings.setPageSelectionMode(pageSelectionMode);
loadImageExportSettings();
}
}
void PDFRenderToImagesDialog::onSelectedPagesChanged(const QString& text)
{
m_imageExportSettings.setPageSelection(text);
}
void PDFRenderToImagesDialog::onDirectoryChanged(const QString& text)
{
m_imageExportSettings.setDirectory(text);
}
void PDFRenderToImagesDialog::onFileTemplateChanged(const QString& text)
{
m_imageExportSettings.setFileTemplate(text);
}
void PDFRenderToImagesDialog::onResolutionButtonClicked(bool checked)
{
if (checked)
{
const pdf::PDFPageImageExportSettings::ResolutionMode resolutionMode = (sender() == ui->resolutionDPIButton) ? pdf::PDFPageImageExportSettings::ResolutionMode::DPI
: pdf::PDFPageImageExportSettings::ResolutionMode::Pixels;
m_imageExportSettings.setResolutionMode(resolutionMode);
loadImageExportSettings();
}
}
void PDFRenderToImagesDialog::onResolutionDPIChanged(int value)
{
m_imageExportSettings.setDpiResolution(value);
}
void PDFRenderToImagesDialog::onResolutionPixelsChanged(int value)
{
m_imageExportSettings.setPixelResolution(value);
}
void PDFRenderToImagesDialog::onCompressionChanged(int value)
{
m_imageWriterSettings.setCompression(value);
}
void PDFRenderToImagesDialog::onQualityChanged(int value)
{
m_imageWriterSettings.setQuality(value);
}
void PDFRenderToImagesDialog::onGammaChanged(double value)
{
m_imageWriterSettings.setGamma(value);
}
void PDFRenderToImagesDialog::onOptimizedWriteChanged(bool value)
{
m_imageWriterSettings.setOptimizedWrite(value);
}
void PDFRenderToImagesDialog::onProgressiveScanWriteChanged(bool value)
{
m_imageWriterSettings.setProgressiveScanWrite(value);
}
void PDFRenderToImagesDialog::onRenderError(pdf::PDFInteger pageIndex, pdf::PDFRenderError error)
{
ui->progressMessagesEdit->setPlainText(QString("%1\n%2").arg(ui->progressMessagesEdit->toPlainText()).arg(tr("Page %1: %2").arg(pageIndex + 1).arg(error.message)));
}
void PDFRenderToImagesDialog::onRenderingFinished()
{
setEnabled(true);
delete m_rasterizerPool;
m_rasterizerPool = nullptr;
delete m_optionalContentActivity;
m_optionalContentActivity = nullptr;
m_cms.reset();
}
void PDFRenderToImagesDialog::on_selectDirectoryButton_clicked()
{
QString directory = QFileDialog::getExistingDirectory(this, tr("Select output directory"), ui->directoryEdit->text());
if (!directory.isEmpty())
{
ui->directoryEdit->setText(directory);
}
}
void PDFRenderToImagesDialog::on_buttonBox_clicked(QAbstractButton* button)
{
if (button == ui->buttonBox->button(QDialogButtonBox::Apply))
{
QString message;
if (m_imageExportSettings.validate(&message))
{
setEnabled(false);
// We are ready to render the document
m_pageIndices = m_imageExportSettings.getPages();
m_optionalContentActivity = new pdf::PDFOptionalContentActivity(m_document, pdf::OCUsage::Export, this);
m_cms = m_proxy->getCMSManager()->getCurrentCMS();
m_rasterizerPool = new pdf::PDFRasterizerPool(m_document, m_proxy->getFontCache(), m_proxy->getCMSManager(),
m_optionalContentActivity, m_proxy->getFeatures(), m_proxy->getMeshQualitySettings(),
pdf::PDFRasterizerPool::getDefaultRasterizerCount(), m_proxy->isUsingOpenGL(), m_proxy->getSurfaceFormat(), this);
connect(m_rasterizerPool, &pdf::PDFRasterizerPool::renderError, this, &PDFRenderToImagesDialog::onRenderError);
auto process = [this]()
{
auto imageSizeGetter = [this](const pdf::PDFPage* page) -> QSize
{
Q_ASSERT(page);
switch (m_imageExportSettings.getResolutionMode())
{
case pdf::PDFPageImageExportSettings::ResolutionMode::DPI:
{
QSizeF size = page->getRotatedMediaBox().size() * pdf::PDF_POINT_TO_INCH * m_imageExportSettings.getDpiResolution();
return size.toSize();
}
case pdf::PDFPageImageExportSettings::ResolutionMode::Pixels:
{
int pixelResolution = m_imageExportSettings.getPixelResolution();
QSizeF size = page->getRotatedMediaBox().size().scaled(pixelResolution, pixelResolution, Qt::KeepAspectRatio);
return size.toSize();
}
default:
{
Q_ASSERT(false);
break;
}
}
return QSize();
};
auto processImage = [this](pdf::PDFRenderedPageImage& renderedPageImage)
{
QString fileName = m_imageExportSettings.getOutputFileName(renderedPageImage.pageIndex, m_imageWriterSettings.getCurrentFormat());
QImageWriter imageWriter(fileName, m_imageWriterSettings.getCurrentFormat());
imageWriter.setSubType(m_imageWriterSettings.getCurrentSubtype());
imageWriter.setCompression(m_imageWriterSettings.getCompression());
imageWriter.setQuality(m_imageWriterSettings.getQuality());
imageWriter.setGamma(m_imageWriterSettings.getGamma());
imageWriter.setOptimizedWrite(m_imageWriterSettings.hasOptimizedWrite());
imageWriter.setProgressiveScanWrite(m_imageWriterSettings.hasProgressiveScanWrite());
if (!imageWriter.write(renderedPageImage.pageImage))
{
emit m_rasterizerPool->renderError(renderedPageImage.pageIndex, pdf::PDFRenderError(pdf::RenderErrorType::Error, tr("Cannot write page image to file '%1', because: %2.").arg(fileName).arg(imageWriter.errorString())));
}
};
m_rasterizerPool->render(m_pageIndices, imageSizeGetter, processImage, m_progress);
};
m_watcher.setFuture(QtConcurrent::run(process));
}
else
{
QMessageBox::critical(this, tr("Error"), message);
}
}
}
} // namespace pdfviewer

View File

@@ -0,0 +1,101 @@
// Copyright (C) 2020 Jakub Melka
//
// This file is part of Pdf4Qt.
//
// Pdf4Qt is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Pdf4Qt is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with Pdf4Qt. If not, see <https://www.gnu.org/licenses/>.
#ifndef PDFRENDERTOIMAGESDIALOG_H
#define PDFRENDERTOIMAGESDIALOG_H
#include "pdfcms.h"
#include "pdfrenderer.h"
#include <QDialog>
#include <QFutureWatcher>
class QAbstractButton;
namespace Ui
{
class PDFRenderToImagesDialog;
}
namespace pdf
{
class PDFProgress;
class PDFDrawWidgetProxy;
}
namespace pdfviewer
{
class PDFRenderToImagesDialog : public QDialog
{
Q_OBJECT
public:
explicit PDFRenderToImagesDialog(const pdf::PDFDocument* document,
pdf::PDFDrawWidgetProxy* proxy,
pdf::PDFProgress* progress,
QWidget* parent);
virtual ~PDFRenderToImagesDialog() override;
private slots:
void on_selectDirectoryButton_clicked();
void on_buttonBox_clicked(QAbstractButton* button);
private:
/// Loads image writer settings to the ui
void loadImageWriterSettings();
/// Load image export settigns to the ui
void loadImageExportSettings();
void onFormatChanged();
void onSubtypeChanged();
void onPagesButtonClicked(bool checked);
void onSelectedPagesChanged(const QString& text);
void onDirectoryChanged(const QString& text);
void onFileTemplateChanged(const QString& text);
void onResolutionButtonClicked(bool checked);
void onResolutionDPIChanged(int value);
void onResolutionPixelsChanged(int value);
void onCompressionChanged(int value);
void onQualityChanged(int value);
void onGammaChanged(double value);
void onOptimizedWriteChanged(bool value);
void onProgressiveScanWriteChanged(bool value);
void onRenderError(pdf::PDFInteger pageIndex, pdf::PDFRenderError error);
void onRenderingFinished();
Ui::PDFRenderToImagesDialog* ui;
const pdf::PDFDocument* m_document;
pdf::PDFDrawWidgetProxy* m_proxy;
pdf::PDFProgress* m_progress;
pdf::PDFImageWriterSettings m_imageWriterSettings;
pdf::PDFPageImageExportSettings m_imageExportSettings;
bool m_isLoadingData;
QFutureWatcher<void> m_watcher;
std::vector<pdf::PDFInteger> m_pageIndices;
pdf::PDFOptionalContentActivity* m_optionalContentActivity;
pdf::PDFCMSPointer m_cms;
pdf::PDFRasterizerPool* m_rasterizerPool;
};
} // namespace pdfviewer
Q_DECLARE_METATYPE(pdf::PDFRenderError)
#endif // PDFRENDERTOIMAGESDIALOG_H

View File

@@ -0,0 +1,293 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>PDFRenderToImagesDialog</class>
<widget class="QDialog" name="PDFRenderToImagesDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>690</width>
<height>602</height>
</rect>
</property>
<property name="windowTitle">
<string>Render Document to Images</string>
</property>
<layout class="QVBoxLayout" name="dialogLayout">
<item>
<widget class="QGroupBox" name="filesGroupBox">
<property name="title">
<string>Output Files Settings</string>
</property>
<layout class="QGridLayout" name="filesGroupBoxLayout">
<item row="0" column="0">
<widget class="QLabel" name="pagesToRenderLabel">
<property name="text">
<string>Pages to render</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="fileTemplateLabel">
<property name="text">
<string>File template</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QRadioButton" name="pagesAllButton">
<property name="text">
<string>All</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="directoryLabel">
<property name="text">
<string>Generate into directory</string>
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="QToolButton" name="selectDirectoryButton">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="2" column="1" colspan="2">
<widget class="QLineEdit" name="directoryEdit"/>
</item>
<item row="3" column="1" colspan="2">
<widget class="QLineEdit" name="fileTemplateEdit"/>
</item>
<item row="1" column="1">
<widget class="QRadioButton" name="pagesSelectButton">
<property name="text">
<string>Pages:</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLineEdit" name="selectedPagesEdit"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="imageResolutionGroupBox">
<property name="title">
<string>Image Resolution</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="resolutionLabel">
<property name="text">
<string>Resolution</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QRadioButton" name="resolutionPixelsButton">
<property name="text">
<string>Pixels</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QRadioButton" name="resolutionDPIButton">
<property name="text">
<string>DPI</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QSpinBox" name="resolutionDPIEdit">
<property name="suffix">
<string> dots/inch</string>
</property>
<property name="minimum">
<number>72</number>
</property>
<property name="maximum">
<number>6000</number>
</property>
<property name="singleStep">
<number>36</number>
</property>
<property name="value">
<number>300</number>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QSpinBox" name="resolutionPixelsEdit">
<property name="suffix">
<string> px</string>
</property>
<property name="minimum">
<number>100</number>
</property>
<property name="maximum">
<number>16384</number>
</property>
<property name="singleStep">
<number>100</number>
</property>
<property name="value">
<number>1000</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="imageFormatSettings">
<property name="title">
<string>Image Format Settings</string>
</property>
<layout class="QGridLayout" name="imageFormatSettingsLayout">
<item row="0" column="0">
<widget class="QLabel" name="imageFormatLabel">
<property name="text">
<string>Format</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="imageSubtypeLabel">
<property name="text">
<string>Subtype</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="subtypeComboBox"/>
</item>
<item row="3" column="1">
<widget class="QSpinBox" name="qualityEdit">
<property name="maximum">
<number>100</number>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="formatComboBox"/>
</item>
<item row="4" column="0">
<widget class="QLabel" name="gammaLabel">
<property name="text">
<string>Gamma</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="optimizedWriteLabel">
<property name="text">
<string>Optimized write</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QDoubleSpinBox" name="gammaEdit"/>
</item>
<item row="3" column="0">
<widget class="QLabel" name="qualityLabel">
<property name="text">
<string>Quality</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="compressionLabel">
<property name="text">
<string>Compression</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="compressionEdit"/>
</item>
<item row="6" column="0">
<widget class="QLabel" name="progressiveScanWriteLabel">
<property name="text">
<string>Progressive scan write</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QCheckBox" name="optimizedWriteCheckBox">
<property name="text">
<string>Enable</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QCheckBox" name="progressiveScanWriteCheckBox">
<property name="text">
<string>Enable</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QPlainTextEdit" name="progressMessagesEdit">
<property name="undoRedoEnabled">
<bool>false</bool>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Apply|QDialogButtonBox::Close</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>PDFRenderToImagesDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>PDFRenderToImagesDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@@ -0,0 +1,94 @@
// Copyright (C) 2019-2020 Jakub Melka
//
// This file is part of Pdf4Qt.
//
// Pdf4Qt is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Pdf4Qt is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with Pdf4Qt. If not, see <https://www.gnu.org/licenses/>.
#include "pdfsendmail.h"
#include <QDir>
#include <QWidget>
#include <QFileInfo>
#ifdef Q_OS_WIN
#include <Windows.h>
#include <MAPI.h>
#include <string>
#endif
namespace pdfviewer
{
bool PDFSendMail::sendMail(QWidget* parent, QString subject, QString fileName)
{
#ifdef Q_OS_WIN
QFileInfo fileInfo(fileName);
std::wstring subjectString = subject.toStdWString();
std::wstring fileNameString = fileInfo.fileName().toStdWString();
std::wstring filePathString = QDir::toNativeSeparators(fileInfo.absoluteFilePath()).toStdWString();
HMODULE mapiLib = ::LoadLibrary(L"MAPI32.DLL");
if (!mapiLib)
{
return false;
}
LPMAPISENDMAILW SendMail;
SendMail = (LPMAPISENDMAILW)GetProcAddress(mapiLib, "MAPISendMailW");
if (!SendMail)
{
::FreeLibrary(mapiLib);
return false;
}
// Jakub Melka: now, we have function for mail sending, we can use it!
// First, we must fill the info structures.
MapiFileDescW fileDesc;
::ZeroMemory(&fileDesc, sizeof(fileDesc));
fileDesc.nPosition = ULONG(-1);
fileDesc.lpszFileName = const_cast<PWSTR>(fileNameString.c_str());
fileDesc.lpszPathName = const_cast<PWSTR>(filePathString.c_str());
MapiMessageW message;
::ZeroMemory(&message, sizeof(message));
message.lpszSubject = const_cast<PWSTR>(subjectString.c_str());
message.nFileCount = 1;
message.lpFiles = &fileDesc;
const int returnCode = SendMail(0, parent->winId(), &message, MAPI_LOGON_UI | MAPI_DIALOG, 0);
::FreeLibrary(mapiLib);
switch (returnCode)
{
case SUCCESS_SUCCESS:
case MAPI_USER_ABORT:
case MAPI_E_LOGIN_FAILURE:
return true;
default:
return false;
}
return false;
#else
static_assert(false, "Implement this for another OS!");
return false;
#endif
}
} // namespace pdfviewer

View File

@@ -0,0 +1,38 @@
// Copyright (C) 2019-2020 Jakub Melka
//
// This file is part of Pdf4Qt.
//
// Pdf4Qt is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Pdf4Qt is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with Pdf4Qt. If not, see <https://www.gnu.org/licenses/>.
#ifndef PDFSENDMAIL_H
#define PDFSENDMAIL_H
#include <QString>
class QWidget;
namespace pdfviewer
{
class PDFSendMail
{
public:
PDFSendMail() = delete;
static bool sendMail(QWidget* parent, QString subject, QString fileName);
};
} // namespace pdfviewer
#endif // PDFSENDMAIL_H

View File

@@ -0,0 +1,729 @@
// Copyright (C) 2019-2020 Jakub Melka
//
// This file is part of Pdf4Qt.
//
// Pdf4Qt is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Pdf4Qt is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with Pdf4Qt. If not, see <https://www.gnu.org/licenses/>.
#include "pdfsidebarwidget.h"
#include "ui_pdfsidebarwidget.h"
#include "pdfviewersettings.h"
#include "pdfwidgetutils.h"
#include "pdftexttospeech.h"
#include "pdfdocument.h"
#include "pdfitemmodels.h"
#include "pdfexception.h"
#include "pdfsignaturehandler.h"
#include "pdfdrawspacecontroller.h"
#include <QMenu>
#include <QAction>
#include <QFileDialog>
#include <QStandardPaths>
#include <QMessageBox>
#include <QPainter>
namespace pdfviewer
{
constexpr const char* STYLESHEET =
"QPushButton { background-color: #404040; color: #FFFFFF; }"
"QPushButton:disabled { background-color: #404040; color: #000000; }"
"QPushButton:checked { background-color: #808080; color: #FFFFFF; }"
"QWidget#thumbnailsToolbarWidget { background-color: #F0F0F0 }"
"QWidget#speechPage { background-color: #F0F0F0 }"
"QWidget#PDFSidebarWidget { background-color: #404040; background: green;}";
PDFSidebarWidget::PDFSidebarWidget(pdf::PDFDrawWidgetProxy* proxy,
PDFTextToSpeech* textToSpeech,
pdf::PDFCertificateStore* certificateStore,
PDFViewerSettings* settings,
QWidget* parent) :
QWidget(parent),
ui(new Ui::PDFSidebarWidget),
m_proxy(proxy),
m_textToSpeech(textToSpeech),
m_certificateStore(certificateStore),
m_settings(settings),
m_outlineTreeModel(nullptr),
m_thumbnailsModel(nullptr),
m_optionalContentTreeModel(nullptr),
m_document(nullptr),
m_optionalContentActivity(nullptr),
m_attachmentsTreeModel(nullptr)
{
ui->setupUi(this);
setStyleSheet(STYLESHEET);
// Outline
QIcon bookmarkIcon(":/resources/bookmark.svg");
m_outlineTreeModel = new pdf::PDFOutlineTreeItemModel(qMove(bookmarkIcon), this);
ui->bookmarksTreeView->setModel(m_outlineTreeModel);
ui->bookmarksTreeView->header()->hide();
connect(ui->bookmarksTreeView, &QTreeView::clicked, this, &PDFSidebarWidget::onOutlineItemClicked);
// Thumbnails
m_thumbnailsModel = new pdf::PDFThumbnailsItemModel(proxy, this);
int thumbnailsMargin = ui->thumbnailsListView->style()->pixelMetric(QStyle::PM_FocusFrameHMargin, nullptr, ui->thumbnailsListView) + 1;
int thumbnailsFontSize = QFontMetrics(ui->thumbnailsListView->font()).lineSpacing();
m_thumbnailsModel->setExtraItemSizeHint(2 * thumbnailsMargin, thumbnailsMargin + thumbnailsFontSize);
ui->thumbnailsListView->setModel(m_thumbnailsModel);
connect(ui->thumbnailsSizeSlider, &QSlider::valueChanged, this, &PDFSidebarWidget::onThumbnailsSizeChanged);
connect(ui->thumbnailsListView, &QListView::clicked, this, &PDFSidebarWidget::onThumbnailClicked);
onThumbnailsSizeChanged(ui->thumbnailsSizeSlider->value());
// Optional content
ui->optionalContentTreeView->header()->hide();
m_optionalContentTreeModel = new pdf::PDFOptionalContentTreeItemModel(this);
ui->optionalContentTreeView->setModel(m_optionalContentTreeModel);
// Attachments
ui->attachmentsTreeView->header()->hide();
m_attachmentsTreeModel = new pdf::PDFAttachmentsTreeItemModel(this);
ui->attachmentsTreeView->setModel(m_attachmentsTreeModel);
ui->attachmentsTreeView->setSelectionMode(QAbstractItemView::SingleSelection);
ui->attachmentsTreeView->setSelectionBehavior(QAbstractItemView::SelectItems);
ui->attachmentsTreeView->setContextMenuPolicy(Qt::CustomContextMenu);
connect(ui->attachmentsTreeView, &QTreeView::customContextMenuRequested, this, &PDFSidebarWidget::onAttachmentCustomContextMenuRequested);
m_pageInfo[Invalid] = { nullptr, ui->emptyPage };
m_pageInfo[OptionalContent] = { ui->optionalContentButton, ui->optionalContentPage };
m_pageInfo[Bookmarks] = { ui->bookmarksButton, ui->bookmarksPage };
m_pageInfo[Thumbnails] = { ui->thumbnailsButton, ui->thumbnailsPage };
m_pageInfo[Attachments] = { ui->attachmentsButton, ui->attachmentsPage };
m_pageInfo[Speech] = { ui->speechButton, ui->speechPage };
m_pageInfo[Signatures] = { ui->signaturesButton, ui->signaturesPage };
for (const auto& pageInfo : m_pageInfo)
{
if (pageInfo.second.button)
{
connect(pageInfo.second.button, &QPushButton::clicked, this, &PDFSidebarWidget::onPageButtonClicked);
}
}
m_textToSpeech->initializeUI(ui->speechLocaleComboBox, ui->speechVoiceComboBox,
ui->speechRateEdit, ui->speechPitchEdit, ui->speechVolumeEdit,
ui->speechPlayButton, ui->speechPauseButton, ui->speechStopButton, ui->speechSynchronizeButton,
ui->speechRateValueLabel, ui->speechPitchValueLabel, ui->speechVolumeValueLabel,
ui->speechActualTextEdit);
ui->signatureTreeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
connect(ui->signatureTreeWidget, &QTreeWidget::customContextMenuRequested, this, &PDFSidebarWidget::onSignatureCustomContextMenuRequested);
selectPage(Invalid);
updateButtons();
}
PDFSidebarWidget::~PDFSidebarWidget()
{
delete ui;
}
void PDFSidebarWidget::setDocument(const pdf::PDFModifiedDocument& document, const std::vector<pdf::PDFSignatureVerificationResult>& signatures)
{
m_document = document;
m_optionalContentActivity = document.getOptionalContentActivity();
m_signatures = signatures;
// Update outline
m_outlineTreeModel->setDocument(document);
// Thumbnails
m_thumbnailsModel->setDocument(document);
// Update optional content
m_optionalContentTreeModel->setDocument(document);
m_optionalContentTreeModel->setActivity(m_optionalContentActivity);
ui->optionalContentTreeView->expandAll();
// Update attachments
m_attachmentsTreeModel->setDocument(document);
ui->attachmentsTreeView->expandAll();
ui->attachmentsTreeView->resizeColumnToContents(0);
Page preferred = Invalid;
if (m_document)
{
const pdf::PageMode pageMode = m_document->getCatalog()->getPageMode();
switch (pageMode)
{
case pdf::PageMode::UseOutlines:
preferred = Bookmarks;
break;
case pdf::PageMode::UseThumbnails:
preferred = Thumbnails;
break;
case pdf::PageMode::UseOptionalContent:
preferred = OptionalContent;
break;
case pdf::PageMode::UseAttachments:
preferred = Attachments;
break;
case pdf::PageMode::Fullscreen:
{
pdf::PDFViewerPreferences::NonFullScreenPageMode nonFullscreenPageMode = m_document->getCatalog()->getViewerPreferences()->getNonFullScreenPageMode();
switch (nonFullscreenPageMode)
{
case pdf::PDFViewerPreferences::NonFullScreenPageMode::UseOutline:
preferred = Bookmarks;
break;
case pdf::PDFViewerPreferences::NonFullScreenPageMode::UseThumbnails:
preferred = Thumbnails;
break;
case pdf::PDFViewerPreferences::NonFullScreenPageMode::UseOptionalContent:
preferred = OptionalContent;
break;
default:
break;
}
break;
}
default:
break;
}
}
// Update GUI
updateGUI(preferred);
updateButtons();
updateSignatures(signatures);
}
bool PDFSidebarWidget::isEmpty() const
{
for (int i = _BEGIN; i < _END; ++i)
{
if (!isEmpty(static_cast<Page>(i)))
{
return false;
}
}
return true;
}
bool PDFSidebarWidget::isEmpty(Page page) const
{
switch (page)
{
case Invalid:
return true;
case Bookmarks:
return m_outlineTreeModel->isEmpty();
case Thumbnails:
return m_thumbnailsModel->isEmpty();
case OptionalContent:
return m_optionalContentTreeModel->isEmpty();
case Attachments:
return m_attachmentsTreeModel->isEmpty();
case Speech:
return !m_textToSpeech->isValid();
case Signatures:
return m_signatures.empty();
default:
Q_ASSERT(false);
break;
}
return true;
}
void PDFSidebarWidget::selectPage(Page page)
{
// Switch state of the buttons and select the page
for (const auto& pageInfo : m_pageInfo)
{
if (pageInfo.second.button)
{
pageInfo.second.button->setChecked(pageInfo.first == page);
}
if (pageInfo.first == page)
{
ui->stackedWidget->setCurrentWidget(pageInfo.second.page);
}
}
}
std::vector<PDFSidebarWidget::Page> PDFSidebarWidget::getValidPages() const
{
std::vector<PDFSidebarWidget::Page> result;
result.reserve(_END - _BEGIN + 1);
for (int i = _BEGIN; i < _END; ++i)
{
if (!isEmpty(static_cast<Page>(i)))
{
result.push_back(static_cast<Page>(i));
}
}
return result;
}
void PDFSidebarWidget::setCurrentPages(const std::vector<pdf::PDFInteger>& currentPages)
{
if (!currentPages.empty() && ui->synchronizeThumbnailsButton->isChecked())
{
QModelIndex index = m_thumbnailsModel->index(currentPages.front(), 0, QModelIndex());
if (index.isValid())
{
ui->thumbnailsListView->scrollTo(index, QListView::EnsureVisible);
// Try to examine, if we have to switch the current index
QModelIndex currentIndex = ui->thumbnailsListView->currentIndex();
if (currentIndex.isValid())
{
const pdf::PDFInteger currentPageIndex = m_thumbnailsModel->getPageIndex(currentIndex);
Q_ASSERT(std::is_sorted(currentPages.cbegin(), currentPages.cend()));
if (std::binary_search(currentPages.cbegin(), currentPages.cend(), currentPageIndex))
{
return;
}
}
ui->thumbnailsListView->setCurrentIndex(index);
}
}
}
void PDFSidebarWidget::updateGUI(Page preferredPage)
{
if (preferredPage != Invalid && !isEmpty(preferredPage))
{
selectPage(preferredPage);
}
else
{
// Select first nonempty page
std::vector<Page> validPages = getValidPages();
if (!validPages.empty())
{
selectPage(validPages.front());
}
else
{
selectPage(Invalid);
}
}
}
void PDFSidebarWidget::updateButtons()
{
for (const auto& pageInfo : m_pageInfo)
{
if (pageInfo.second.button)
{
pageInfo.second.button->setEnabled(!isEmpty(pageInfo.first));
}
}
}
void PDFSidebarWidget::updateSignatures(const std::vector<pdf::PDFSignatureVerificationResult>& signatures)
{
ui->signatureTreeWidget->setUpdatesEnabled(false);
ui->signatureTreeWidget->clear();
m_certificateInfos.clear();
QIcon okIcon(":/resources/result-ok.svg");
QIcon errorIcon(":/resources/result-error.svg");
QIcon warningIcon(":/resources/result-warning.svg");
QIcon infoIcon(":/resources/result-information.svg");
if (m_settings->getSettings().m_signatureTreatWarningsAsErrors)
{
warningIcon = errorIcon;
}
for (const pdf::PDFSignatureVerificationResult& signature : signatures)
{
const pdf::PDFCertificateInfos& certificateInfos = signature.getCertificateInfos();
const pdf::PDFCertificateInfo* certificateInfo = !certificateInfos.empty() ? &certificateInfos.front() : nullptr;
QString templateString;
switch (signature.getType())
{
case pdf::PDFSignature::Type::Sig:
templateString = tr("Signature - %1");
break;
case pdf::PDFSignature::Type::DocTimeStamp:
templateString = tr("Timestamp - %1");
break;
case pdf::PDFSignature::Type::Invalid:
continue;
default:
Q_ASSERT(false);
break;
}
QString text = templateString.arg(certificateInfo ? certificateInfo->getName(pdf::PDFCertificateInfo::CommonName) : tr("Unknown"));
QTreeWidgetItem* rootItem = new QTreeWidgetItem(QStringList(text));
if (signature.hasError())
{
rootItem->setIcon(0, errorIcon);
}
else if (signature.hasWarning())
{
rootItem->setIcon(0, warningIcon);
}
else
{
rootItem->setIcon(0, okIcon);
}
if (signature.isCertificateValid())
{
QTreeWidgetItem* certificateItem = new QTreeWidgetItem(rootItem, QStringList(tr("Certificate is valid.")));
certificateItem->setIcon(0, okIcon);
}
if (signature.isSignatureValid())
{
QTreeWidgetItem* signatureItem = new QTreeWidgetItem(rootItem, QStringList(tr("Signature is valid.")));
signatureItem->setIcon(0, okIcon);
}
for (const QString& error : signature.getErrors())
{
QTreeWidgetItem* item = new QTreeWidgetItem(rootItem, QStringList(error));
item->setIcon(0, errorIcon);
}
for (const QString& error : signature.getWarnings())
{
QTreeWidgetItem* item = new QTreeWidgetItem(rootItem, QStringList(error));
item->setIcon(0, warningIcon);
}
QString hashAlgorithms = signature.getHashAlgorithms().join(", ");
if (!hashAlgorithms.isEmpty())
{
QTreeWidgetItem* item = new QTreeWidgetItem(rootItem, QStringList(tr("Hash algorithm: %1").arg(hashAlgorithms.toUpper())));
item->setIcon(0, infoIcon);
}
QDateTime signingDate = signature.getSignatureDate();
if (signingDate.isValid())
{
QTreeWidgetItem* item = new QTreeWidgetItem(rootItem, QStringList(QString("Signing date/time: %2").arg(signingDate.toString(Qt::DefaultLocaleShortDate))));
item->setIcon(0, infoIcon);
}
QDateTime timestampDate = signature.getTimestampDate();
if (timestampDate.isValid())
{
QTreeWidgetItem* item = new QTreeWidgetItem(rootItem, QStringList(QString("Timestamp: %2").arg(timestampDate.toString(Qt::DefaultLocaleShortDate))));
item->setIcon(0, infoIcon);
}
if (certificateInfo)
{
QTreeWidgetItem* certChainRoot = new QTreeWidgetItem(rootItem, QStringList(tr("Certificate validation chain")));
certChainRoot->setIcon(0, infoIcon);
for (const pdf::PDFCertificateInfo& currentCertificateInfo : certificateInfos)
{
QTreeWidgetItem* certRoot = new QTreeWidgetItem(certChainRoot, QStringList(currentCertificateInfo.getName(pdf::PDFCertificateInfo::CommonName)));
certRoot->setIcon(0, infoIcon);
pdf::PDFCertificateInfo::KeyUsageFlags keyUsageFlags = currentCertificateInfo.getKeyUsage();
if (keyUsageFlags.testFlag(pdf::PDFCertificateInfo::KeyUsageCertSign))
{
m_certificateInfos.push_back(currentCertificateInfo);
certRoot->setData(0, Qt::UserRole, m_certificateInfos.size() - 1);
}
auto addName = [certRoot, &currentCertificateInfo, &infoIcon](pdf::PDFCertificateInfo::NameEntry nameEntry, QString caption)
{
QString text = currentCertificateInfo.getName(nameEntry);
if (!text.isEmpty())
{
QTreeWidgetItem* item = new QTreeWidgetItem(certRoot, QStringList(QString("%1: %2").arg(caption, text)));
item->setIcon(0, infoIcon);
}
};
QString publicKeyMethod;
switch (currentCertificateInfo.getPublicKey())
{
case pdf::PDFCertificateInfo::KeyRSA:
publicKeyMethod = tr("Protected by RSA method, %1-bit key").arg(currentCertificateInfo.getKeySize());
break;
case pdf::PDFCertificateInfo::KeyDSA:
publicKeyMethod = tr("Protected by DSA method, %1-bit key").arg(currentCertificateInfo.getKeySize());
break;
case pdf::PDFCertificateInfo::KeyEC:
publicKeyMethod = tr("Protected by EC method, %1-bit key").arg(currentCertificateInfo.getKeySize());
break;
case pdf::PDFCertificateInfo::KeyDH:
publicKeyMethod = tr("Protected by DH method, %1-bit key").arg(currentCertificateInfo.getKeySize());
break;
case pdf::PDFCertificateInfo::KeyUnknown:
publicKeyMethod = tr("Unknown protection method, %1-bit key").arg(currentCertificateInfo.getKeySize());
break;
default:
Q_ASSERT(false);
break;
}
addName(pdf::PDFCertificateInfo::CountryName, tr("Country"));
addName(pdf::PDFCertificateInfo::OrganizationName, tr("Organization"));
addName(pdf::PDFCertificateInfo::OrganizationalUnitName, tr("Org. unit"));
addName(pdf::PDFCertificateInfo::DistinguishedName, tr("Name"));
addName(pdf::PDFCertificateInfo::StateOrProvinceName, tr("State"));
addName(pdf::PDFCertificateInfo::SerialNumber, tr("Serial number"));
addName(pdf::PDFCertificateInfo::LocalityName, tr("Locality"));
addName(pdf::PDFCertificateInfo::Title, tr("Title"));
addName(pdf::PDFCertificateInfo::Surname, tr("Surname"));
addName(pdf::PDFCertificateInfo::GivenName, tr("Forename"));
addName(pdf::PDFCertificateInfo::Initials, tr("Initials"));
addName(pdf::PDFCertificateInfo::Pseudonym, tr("Pseudonym"));
addName(pdf::PDFCertificateInfo::GenerationalQualifier, tr("Qualifier"));
addName(pdf::PDFCertificateInfo::Email, tr("Email"));
QTreeWidgetItem* publicKeyItem = new QTreeWidgetItem(certRoot, QStringList(publicKeyMethod));
publicKeyItem->setIcon(0, infoIcon);
QDateTime notValidBefore = currentCertificateInfo.getNotValidBefore().toLocalTime();
QDateTime notValidAfter = currentCertificateInfo.getNotValidAfter().toLocalTime();
if (notValidBefore.isValid())
{
QTreeWidgetItem* item = new QTreeWidgetItem(certRoot, QStringList(QString("Valid from: %2").arg(notValidBefore.toString(Qt::DefaultLocaleShortDate))));
item->setIcon(0, infoIcon);
}
if (notValidAfter.isValid())
{
QTreeWidgetItem* item = new QTreeWidgetItem(certRoot, QStringList(QString("Valid to: %2").arg(notValidAfter.toString(Qt::DefaultLocaleShortDate))));
item->setIcon(0, infoIcon);
}
QStringList keyUsages;
if (keyUsageFlags.testFlag(pdf::PDFCertificateInfo::KeyUsageDigitalSignature))
{
keyUsages << tr("Digital signatures");
}
if (keyUsageFlags.testFlag(pdf::PDFCertificateInfo::KeyUsageNonRepudiation))
{
keyUsages << tr("Non-repudiation");
}
if (keyUsageFlags.testFlag(pdf::PDFCertificateInfo::KeyUsageKeyEncipherment))
{
keyUsages << tr("Key encipherement");
}
if (keyUsageFlags.testFlag(pdf::PDFCertificateInfo::KeyUsageDataEncipherment))
{
keyUsages << tr("Application data encipherement");
}
if (keyUsageFlags.testFlag(pdf::PDFCertificateInfo::KeyUsageAgreement))
{
keyUsages << tr("Key agreement");
}
if (keyUsageFlags.testFlag(pdf::PDFCertificateInfo::KeyUsageCertSign))
{
keyUsages << tr("Verify signatures on certificates");
}
if (keyUsageFlags.testFlag(pdf::PDFCertificateInfo::KeyUsageCrlSign))
{
keyUsages << tr("Verify signatures on revocation information");
}
if (keyUsageFlags.testFlag(pdf::PDFCertificateInfo::KeyUsageEncipherOnly))
{
keyUsages << tr("Encipher data during key agreement");
}
if (keyUsageFlags.testFlag(pdf::PDFCertificateInfo::KeyUsageDecipherOnly))
{
keyUsages << tr("Decipher data during key agreement");
}
if (keyUsageFlags.testFlag(pdf::PDFCertificateInfo::KeyUsageExtended_TIMESTAMP))
{
keyUsages << tr("Trusted timestamping");
}
if (!keyUsages.isEmpty())
{
QTreeWidgetItem* keyUsageRoot = new QTreeWidgetItem(certRoot, QStringList(tr("Key usages")));
keyUsageRoot->setIcon(0, infoIcon);
for (const QString& keyUsage : keyUsages)
{
QTreeWidgetItem* keyUsageItem = new QTreeWidgetItem(keyUsageRoot, QStringList(keyUsage));
keyUsageItem->setIcon(0, infoIcon);
}
}
}
}
ui->signatureTreeWidget->addTopLevelItem(rootItem);
}
ui->signatureTreeWidget->expandToDepth(1);
ui->signatureTreeWidget->setUpdatesEnabled(true);
}
void PDFSidebarWidget::onPageButtonClicked()
{
QObject* pushButton = sender();
for (const auto& pageInfo : m_pageInfo)
{
if (pageInfo.second.button == pushButton)
{
Q_ASSERT(!isEmpty(pageInfo.first));
selectPage(pageInfo.first);
break;
}
}
}
void PDFSidebarWidget::onOutlineItemClicked(const QModelIndex& index)
{
if (const pdf::PDFAction* action = m_outlineTreeModel->getAction(index))
{
emit actionTriggered(action);
}
}
void PDFSidebarWidget::onThumbnailsSizeChanged(int size)
{
const int thumbnailsSize = pdf::PDFWidgetUtils::getPixelSize(this, size * 10.0);
Q_ASSERT(thumbnailsSize > 0);
m_thumbnailsModel->setThumbnailsSize(thumbnailsSize);
}
void PDFSidebarWidget::onAttachmentCustomContextMenuRequested(const QPoint& pos)
{
if (const pdf::PDFFileSpecification* fileSpecification = m_attachmentsTreeModel->getFileSpecification(ui->attachmentsTreeView->indexAt(pos)))
{
QMenu menu(this);
QAction* action = new QAction(QApplication::style()->standardIcon(QStyle::SP_DialogSaveButton, nullptr, ui->attachmentsTreeView), tr("Save to File..."), &menu);
auto onSaveTriggered = [this, fileSpecification]()
{
const pdf::PDFEmbeddedFile* platformFile = fileSpecification->getPlatformFile();
if (platformFile && platformFile->isValid())
{
QString defaultFileName = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) + QDir::separator() + fileSpecification->getPlatformFileName();
QString saveFileName = QFileDialog::getSaveFileName(this, tr("Save attachment"), defaultFileName);
if (!saveFileName.isEmpty())
{
try
{
QByteArray data = m_document->getDecodedStream(platformFile->getStream());
QFile file(saveFileName);
if (file.open(QFile::WriteOnly | QFile::Truncate))
{
file.write(data);
file.close();
}
else
{
QMessageBox::critical(this, tr("Error"), tr("Failed to save attachment to file. %1").arg(file.errorString()));
}
}
catch (pdf::PDFException e)
{
QMessageBox::critical(this, tr("Error"), tr("Failed to save attachment to file. %1").arg(e.getMessage()));
}
}
}
else
{
QMessageBox::critical(this, tr("Error"), tr("Failed to save attachment to file. Attachment is corrupted."));
}
};
connect(action, &QAction::triggered, this, onSaveTriggered);
menu.addAction(action);
menu.exec(ui->attachmentsTreeView->viewport()->mapToGlobal(pos));
}
}
void PDFSidebarWidget::onThumbnailClicked(const QModelIndex& index)
{
if (index.isValid())
{
m_proxy->goToPage(m_thumbnailsModel->getPageIndex(index));
}
}
void PDFSidebarWidget::onSignatureCustomContextMenuRequested(const QPoint& pos)
{
if (QTreeWidgetItem* item = ui->signatureTreeWidget->itemAt(pos))
{
QVariant data = item->data(0, Qt::UserRole);
if (data.isValid())
{
const pdf::PDFCertificateInfo& info = m_certificateInfos.at(data.toInt());
if (!m_certificateStore->contains(info))
{
QMenu menu;
QAction* action = menu.addAction(tr("Add to trusted certificates"));
auto addCertificate = [this, info]()
{
if (QMessageBox::question(this, tr("Add to Trusted Certificate Store"), tr("Are you sure want to add '%1' to the trusted certificate store?").arg(info.getName(pdf::PDFCertificateInfo::CommonName))) == QMessageBox::Yes)
{
if (!m_certificateStore->add(pdf::PDFCertificateStore::EntryType::User, info))
{
QMessageBox::critical(this, tr("Trusted Certificate Store Error"), tr("Failed to add certificate to the trusted certificate store."));
}
}
};
connect(action, &QAction::triggered, this, addCertificate);
menu.exec(ui->signatureTreeWidget->viewport()->mapToGlobal(pos));
}
}
}
}
void PDFSidebarWidget::paintEvent(QPaintEvent* event)
{
Q_UNUSED(event);
QPainter painter(this);
painter.fillRect(rect(), QColor(64, 64, 64));
}
} // namespace pdfviewer

View File

@@ -0,0 +1,138 @@
// Copyright (C) 2019-2020 Jakub Melka
//
// This file is part of Pdf4Qt.
//
// Pdf4Qt is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Pdf4Qt is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with Pdf4Qt. If not, see <https://www.gnu.org/licenses/>.
#ifndef PDFSIDEBARWIDGET_H
#define PDFSIDEBARWIDGET_H
#include "pdfglobal.h"
#include <QWidget>
class QPushButton;
class QWidget;
namespace Ui
{
class PDFSidebarWidget;
}
namespace pdf
{
class PDFAction;
class PDFDocument;
class PDFCertificateInfo;
class PDFDrawWidgetProxy;
class PDFCertificateStore;
class PDFModifiedDocument;
class PDFThumbnailsItemModel;
class PDFOutlineTreeItemModel;
class PDFOptionalContentActivity;
class PDFAttachmentsTreeItemModel;
class PDFSignatureVerificationResult;
class PDFOptionalContentTreeItemModel;
}
namespace pdfviewer
{
class PDFTextToSpeech;
class PDFViewerSettings;
class PDFSidebarWidget : public QWidget
{
Q_OBJECT
public:
explicit PDFSidebarWidget(pdf::PDFDrawWidgetProxy* proxy,
PDFTextToSpeech* textToSpeech,
pdf::PDFCertificateStore* certificateStore,
PDFViewerSettings* settings,
QWidget* parent);
virtual ~PDFSidebarWidget() override;
virtual void paintEvent(QPaintEvent* event) override;
enum Page
{
Invalid,
_BEGIN,
Bookmarks = _BEGIN,
Thumbnails,
OptionalContent,
Attachments,
Speech,
Signatures,
_END
};
void setDocument(const pdf::PDFModifiedDocument& document, const std::vector<pdf::PDFSignatureVerificationResult>& signatures);
/// Returns true, if all items in sidebar are empty
bool isEmpty() const;
/// Returns true, if page is empty
bool isEmpty(Page page) const;
/// Selects current page
void selectPage(Page page);
/// Returns list of valid pages (nonempty pages)
std::vector<Page> getValidPages() const;
/// Sets current pages (for example, selects the correct thumbnail)
void setCurrentPages(const std::vector<pdf::PDFInteger>& currentPages);
signals:
void actionTriggered(const pdf::PDFAction* action);
private:
void updateGUI(Page preferredPage);
void updateButtons();
void updateSignatures(const std::vector<pdf::PDFSignatureVerificationResult>& signatures);
void onPageButtonClicked();
void onOutlineItemClicked(const QModelIndex& index);
void onThumbnailsSizeChanged(int size);
void onAttachmentCustomContextMenuRequested(const QPoint& pos);
void onThumbnailClicked(const QModelIndex& index);
void onSignatureCustomContextMenuRequested(const QPoint &pos);
struct PageInfo
{
QPushButton* button = nullptr;
QWidget* page = nullptr;
};
Ui::PDFSidebarWidget* ui;
pdf::PDFDrawWidgetProxy* m_proxy;
PDFTextToSpeech* m_textToSpeech;
pdf::PDFCertificateStore* m_certificateStore;
PDFViewerSettings* m_settings;
pdf::PDFOutlineTreeItemModel* m_outlineTreeModel;
pdf::PDFThumbnailsItemModel* m_thumbnailsModel;
pdf::PDFOptionalContentTreeItemModel* m_optionalContentTreeModel;
const pdf::PDFDocument* m_document;
pdf::PDFOptionalContentActivity* m_optionalContentActivity;
pdf::PDFAttachmentsTreeItemModel* m_attachmentsTreeModel;
std::map<Page, PageInfo> m_pageInfo;
std::vector<pdf::PDFSignatureVerificationResult> m_signatures;
std::vector<pdf::PDFCertificateInfo> m_certificateInfos;
};
} // namespace pdfviewer
#endif // PDFSIDEBARWIDGET_H

View File

@@ -0,0 +1,447 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>PDFSidebarWidget</class>
<widget class="QWidget" name="PDFSidebarWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>339</width>
<height>566</height>
</rect>
</property>
<layout class="QHBoxLayout" name="sidebarLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QPushButton" name="bookmarksButton">
<property name="text">
<string>Bookmarks</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="flat">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="thumbnailsButton">
<property name="text">
<string>Thumbnails</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="flat">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="optionalContentButton">
<property name="text">
<string>Visibility</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="flat">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="attachmentsButton">
<property name="text">
<string>Attachments</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="flat">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="speechButton">
<property name="text">
<string>Speech</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="flat">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="signaturesButton">
<property name="text">
<string>Signatures</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="flat">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="buttonSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<widget class="QStackedWidget" name="stackedWidget">
<property name="currentIndex">
<number>6</number>
</property>
<widget class="QWidget" name="emptyPage"/>
<widget class="QWidget" name="bookmarksPage">
<layout class="QVBoxLayout" name="bookmarksPageLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QTreeView" name="bookmarksTreeView"/>
</item>
</layout>
</widget>
<widget class="QWidget" name="thumbnailsPage">
<layout class="QVBoxLayout" name="thumbnailsLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QWidget" name="thumbnailsToolbarWidget" native="true">
<layout class="QHBoxLayout" name="thumbnailsToolbarLayout">
<item>
<widget class="QToolButton" name="synchronizeThumbnailsButton">
<property name="toolTip">
<string>Synchronize thumbnails with current page</string>
</property>
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/synchronize.svg</normaloff>:/resources/synchronize.svg</iconset>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QSlider" name="thumbnailsSizeSlider">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>6</number>
</property>
<property name="value">
<number>3</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QListView" name="thumbnailsListView">
<property name="movement">
<enum>QListView::Static</enum>
</property>
<property name="resizeMode">
<enum>QListView::Adjust</enum>
</property>
<property name="viewMode">
<enum>QListView::IconMode</enum>
</property>
<property name="itemAlignment">
<set>Qt::AlignBottom|Qt::AlignHCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="optionalContentPage">
<layout class="QVBoxLayout" name="optionalContentPageLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QTreeView" name="optionalContentTreeView"/>
</item>
</layout>
</widget>
<widget class="QWidget" name="attachmentsPage">
<layout class="QVBoxLayout" name="attachmentsPageLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QTreeView" name="attachmentsTreeView"/>
</item>
</layout>
</widget>
<widget class="QWidget" name="speechPage">
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QComboBox" name="speechLocaleComboBox"/>
</item>
<item>
<widget class="QComboBox" name="speechVoiceComboBox"/>
</item>
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="1">
<widget class="QSlider" name="speechRateEdit">
<property name="minimum">
<number>-10</number>
</property>
<property name="maximum">
<number>10</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="speechVolumeLabel">
<property name="text">
<string>Volume</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSlider" name="speechPitchEdit">
<property name="minimum">
<number>-10</number>
</property>
<property name="maximum">
<number>10</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="speechPitchLabel">
<property name="text">
<string>Pitch</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSlider" name="speechVolumeEdit">
<property name="maximum">
<number>100</number>
</property>
<property name="value">
<number>100</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="speechRateLabel">
<property name="text">
<string>Rate</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="speechRateValueLabel"/>
</item>
<item row="1" column="2">
<widget class="QLabel" name="speechPitchValueLabel"/>
</item>
<item row="2" column="2">
<widget class="QLabel" name="speechVolumeValueLabel"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QToolButton" name="speechPlayButton">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/play.svg</normaloff>:/resources/play.svg</iconset>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="speechPauseButton">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/pause.svg</normaloff>:/resources/pause.svg</iconset>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="speechStopButton">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/stop.svg</normaloff>:/resources/stop.svg</iconset>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="speechSynchronizeButton">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/synchronize.svg</normaloff>:/resources/synchronize.svg</iconset>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QTextBrowser" name="speechActualTextEdit"/>
</item>
</layout>
</widget>
<widget class="QWidget" name="signaturesPage">
<layout class="QVBoxLayout" name="signaturesPageLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QTreeWidget" name="signatureTreeWidget">
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="headerHidden">
<bool>true</bool>
</property>
<column>
<property name="text">
<string notr="true">1</string>
</property>
</column>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<resources>
<include location="pdfforqtviewer.qrc"/>
</resources>
<connections/>
</ui>

View File

@@ -0,0 +1,534 @@
// Copyright (C) 2020 Jakub Melka
//
// This file is part of Pdf4Qt.
//
// Pdf4Qt is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Pdf4Qt is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with Pdf4Qt. If not, see <https://www.gnu.org/licenses/>.
#include "pdftexttospeech.h"
#include "pdfviewersettings.h"
#include "pdfdrawspacecontroller.h"
#include "pdfcompiler.h"
#include "pdfdrawwidget.h"
#include <QLabel>
#include <QAction>
#include <QSlider>
#include <QComboBox>
#include <QToolButton>
#include <QTextBrowser>
#include <QTextToSpeech>
namespace pdfviewer
{
PDFTextToSpeech::PDFTextToSpeech(QObject* parent) :
BaseClass(parent),
m_textToSpeech(nullptr),
m_document(nullptr),
m_proxy(nullptr),
m_state(Invalid),
m_initialized(false),
m_speechLocaleComboBox(nullptr),
m_speechVoiceComboBox(nullptr),
m_speechRateEdit(nullptr),
m_speechVolumeEdit(nullptr),
m_speechPitchEdit(nullptr),
m_speechPlayButton(nullptr),
m_speechPauseButton(nullptr),
m_speechStopButton(nullptr),
m_speechSynchronizeButton(nullptr),
m_speechRateValueLabel(nullptr),
m_speechPitchValueLabel(nullptr),
m_speechVolumeValueLabel(nullptr),
m_speechActualTextBrowser(nullptr)
{
}
bool PDFTextToSpeech::isValid() const
{
return m_document != nullptr;
}
void PDFTextToSpeech::setDocument(const pdf::PDFModifiedDocument& document)
{
if (m_document != document)
{
stop();
m_document = document;
if (m_textToSpeech)
{
m_state = m_document ? Ready : NoDocument;
}
else
{
// Set state to invalid, speech engine is not set
m_state = Invalid;
}
updateUI();
}
}
void PDFTextToSpeech::setSettings(const PDFViewerSettings* viewerSettings)
{
Q_ASSERT(viewerSettings);
if (!m_initialized)
{
// This object is not initialized yet
return;
}
// First, stop the engine
stop();
delete m_textToSpeech;
m_textToSpeech = nullptr;
const PDFViewerSettings::Settings& settings = viewerSettings->getSettings();
if (!settings.m_speechEngine.isEmpty())
{
m_textToSpeech = new QTextToSpeech(settings.m_speechEngine);
connect(m_textToSpeech, &QTextToSpeech::stateChanged, this, &PDFTextToSpeech::updatePlay);
m_state = m_document ? Ready : NoDocument;
QVector<QLocale> locales = m_textToSpeech->availableLocales();
m_speechLocaleComboBox->setUpdatesEnabled(false);
m_speechLocaleComboBox->clear();
for (const QLocale& locale : locales)
{
m_speechLocaleComboBox->addItem(QString("%1 (%2)").arg(locale.nativeLanguageName(), locale.nativeCountryName()), locale.name());
}
m_speechLocaleComboBox->setUpdatesEnabled(true);
QVector<QVoice> voices = m_textToSpeech->availableVoices();
m_speechVoiceComboBox->setUpdatesEnabled(false);
m_speechVoiceComboBox->clear();
for (const QVoice& voice : voices)
{
m_speechVoiceComboBox->addItem(QString("%1 (%2, %3)").arg(voice.name(), QVoice::genderName(voice.gender()), QVoice::ageName(voice.age())), voice.name());
}
m_speechVoiceComboBox->setUpdatesEnabled(true);
}
else
{
// Set state to invalid, speech engine is not set
m_state = Invalid;
m_speechLocaleComboBox->clear();
m_speechVoiceComboBox->clear();
}
if (m_textToSpeech)
{
setLocale(settings.m_speechLocale);
setVoice(settings.m_speechVoice);
setRate(settings.m_speechRate);
setPitch(settings.m_speechPitch);
setVolume(settings.m_speechVolume);
}
updateUI();
}
void PDFTextToSpeech::setProxy(pdf::PDFDrawWidgetProxy* proxy)
{
m_proxy = proxy;
pdf::PDFAsynchronousTextLayoutCompiler* compiler = m_proxy->getTextLayoutCompiler();
connect(compiler, &pdf::PDFAsynchronousTextLayoutCompiler::textLayoutChanged, this, &PDFTextToSpeech::updatePlay);
}
void PDFTextToSpeech::initializeUI(QComboBox* speechLocaleComboBox,
QComboBox* speechVoiceComboBox,
QSlider* speechRateEdit,
QSlider* speechPitchEdit,
QSlider* speechVolumeEdit,
QToolButton* speechPlayButton,
QToolButton* speechPauseButton,
QToolButton* speechStopButton,
QToolButton* speechSynchronizeButton,
QLabel* speechRateValueLabel,
QLabel* speechPitchValueLabel,
QLabel* speechVolumeValueLabel,
QTextBrowser* speechActualTextBrowser)
{
Q_ASSERT(speechLocaleComboBox);
Q_ASSERT(speechVoiceComboBox);
Q_ASSERT(speechRateEdit);
Q_ASSERT(speechVolumeEdit);
Q_ASSERT(speechPitchEdit);
Q_ASSERT(speechPlayButton);
Q_ASSERT(speechPauseButton);
Q_ASSERT(speechStopButton);
Q_ASSERT(speechSynchronizeButton);
m_speechLocaleComboBox = speechLocaleComboBox;
m_speechVoiceComboBox = speechVoiceComboBox;
m_speechRateEdit = speechRateEdit;
m_speechVolumeEdit = speechVolumeEdit;
m_speechPitchEdit = speechPitchEdit;
m_speechPlayButton = speechPlayButton;
m_speechPauseButton = speechPauseButton;
m_speechStopButton = speechStopButton;
m_speechSynchronizeButton = speechSynchronizeButton;
m_speechRateValueLabel = speechRateValueLabel;
m_speechPitchValueLabel = speechPitchValueLabel;
m_speechVolumeValueLabel = speechVolumeValueLabel;
m_speechActualTextBrowser = speechActualTextBrowser;
connect(m_speechLocaleComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &PDFTextToSpeech::onLocaleChanged);
connect(m_speechVoiceComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &PDFTextToSpeech::onVoiceChanged);
connect(m_speechRateEdit, &QSlider::valueChanged, this, &PDFTextToSpeech::onRateChanged);
connect(m_speechPitchEdit, &QSlider::valueChanged, this, &PDFTextToSpeech::onPitchChanged);
connect(m_speechVolumeEdit, &QSlider::valueChanged, this, &PDFTextToSpeech::onVolumeChanged);
connect(m_speechPlayButton, &QToolButton::clicked, this, &PDFTextToSpeech::onPlayClicked);
connect(m_speechPauseButton, &QToolButton::clicked, this, &PDFTextToSpeech::onPauseClicked);
connect(m_speechStopButton, &QToolButton::clicked, this, &PDFTextToSpeech::onStopClicked);
m_initialized = true;
}
void PDFTextToSpeech::updateUI()
{
bool enableControls = false;
bool enablePlay = false;
bool enablePause = false;
bool enableStop = false;
switch (m_state)
{
case pdfviewer::PDFTextToSpeech::Invalid:
{
enableControls = false;
enablePlay = false;
enablePause = false;
enableStop = false;
break;
}
case pdfviewer::PDFTextToSpeech::NoDocument:
{
enableControls = true;
enablePlay = false;
enablePause = false;
enableStop = false;
break;
}
case pdfviewer::PDFTextToSpeech::Ready:
{
enableControls = true;
enablePlay = true;
enablePause = false;
enableStop = false;
break;
}
case pdfviewer::PDFTextToSpeech::Playing:
{
enableControls = true;
enablePlay = false;
enablePause = true;
enableStop = true;
break;
}
case pdfviewer::PDFTextToSpeech::Paused:
{
enableControls = true;
enablePlay = true;
enablePause = false;
enableStop = true;
break;
}
case pdfviewer::PDFTextToSpeech::Error:
{
enableControls = false;
enablePlay = false;
enablePause = false;
enableStop = false;
break;
}
default:
Q_ASSERT(false);
break;
}
m_speechLocaleComboBox->setEnabled(enableControls && m_speechLocaleComboBox->count() > 0);
m_speechVoiceComboBox->setEnabled(enableControls && m_speechVoiceComboBox->count() > 0);
m_speechRateEdit->setEnabled(enableControls);
m_speechVolumeEdit->setEnabled(enableControls);
m_speechPitchEdit->setEnabled(enableControls);
m_speechPlayButton->setEnabled(enablePlay);
m_speechPauseButton->setEnabled(enablePause);
m_speechStopButton->setEnabled(enableStop);
m_speechSynchronizeButton->setEnabled(enableControls);
}
void PDFTextToSpeech::stop()
{
switch (m_state)
{
case Playing:
case Paused:
{
m_textToSpeech->stop();
m_currentTextFlowIndex = 0;
m_currentPage = 0;
m_currentTextLayout = pdf::PDFTextLayout();
m_textFlows = pdf::PDFTextFlows();
m_state = Ready;
break;
}
default:
break;
}
updateUI();
}
void PDFTextToSpeech::setLocale(const QString& locale)
{
m_speechLocaleComboBox->setCurrentIndex(m_speechLocaleComboBox->findData(locale));
}
void PDFTextToSpeech::setVoice(const QString& voice)
{
m_speechVoiceComboBox->setCurrentIndex(m_speechVoiceComboBox->findData(voice));
}
void PDFTextToSpeech::setRate(const double rate)
{
pdf::PDFLinearInterpolation<double> interpolation(-1.0, 1.0, m_speechRateEdit->minimum(), m_speechRateEdit->maximum());
m_speechRateEdit->setValue(qRound(interpolation(rate)));
onRateChanged(m_speechRateEdit->value());
}
void PDFTextToSpeech::setPitch(const double pitch)
{
pdf::PDFLinearInterpolation<double> interpolation(-1.0, 1.0, m_speechPitchEdit->minimum(), m_speechPitchEdit->maximum());
m_speechPitchEdit->setValue(qRound(interpolation(pitch)));
onPitchChanged(m_speechPitchEdit->value());
}
void PDFTextToSpeech::setVolume(const double volume)
{
pdf::PDFLinearInterpolation<double> interpolation(0.0, 1.0, m_speechVolumeEdit->minimum(), m_speechVolumeEdit->maximum());
m_speechVolumeEdit->setValue(qRound(interpolation(volume)));
onVolumeChanged(m_speechVolumeEdit->value());
}
void PDFTextToSpeech::onLocaleChanged()
{
if (m_textToSpeech)
{
m_textToSpeech->setLocale(QLocale(m_speechLocaleComboBox->currentData().toString()));
}
}
void PDFTextToSpeech::onVoiceChanged()
{
if (m_textToSpeech)
{
QString voice = m_speechVoiceComboBox->currentData().toString();
for (const QVoice& voiceObject : m_textToSpeech->availableVoices())
{
if (voiceObject.name() == voice)
{
m_textToSpeech->setVoice(voiceObject);
}
}
}
}
void PDFTextToSpeech::onRateChanged(int rate)
{
if (m_textToSpeech)
{
pdf::PDFLinearInterpolation<double> interpolation(m_speechRateEdit->minimum(), m_speechRateEdit->maximum(), -1.0, 1.0);
double value = interpolation(rate);
m_textToSpeech->setRate(value);
m_speechRateValueLabel->setText(QString::number(value, 'f', 2));
}
}
void PDFTextToSpeech::onPitchChanged(int pitch)
{
if (m_textToSpeech)
{
pdf::PDFLinearInterpolation<double> interpolation(m_speechPitchEdit->minimum(), m_speechPitchEdit->maximum(), -1.0, 1.0);
double value = interpolation(pitch);
m_textToSpeech->setPitch(pitch);
m_speechPitchValueLabel->setText(QString::number(value, 'f', 2));
}
}
void PDFTextToSpeech::onVolumeChanged(int volume)
{
if (m_textToSpeech)
{
pdf::PDFLinearInterpolation<double> interpolation(m_speechVolumeEdit->minimum(), m_speechVolumeEdit->maximum(), 0.0, 1.0);
double value = interpolation(volume);
m_textToSpeech->setVolume(value);
m_speechVolumeValueLabel->setText(QString::number(value, 'f', 2));
}
}
void PDFTextToSpeech::onPlayClicked()
{
switch (m_state)
{
case Paused:
{
m_textToSpeech->resume();
m_state = Playing;
if (m_textToSpeech->state() == QTextToSpeech::Ready)
{
updatePlay();
}
break;
}
case Ready:
{
m_state = Playing;
m_currentTextFlowIndex = std::numeric_limits<size_t>::max();
m_currentPage = -1;
updatePlay();
break;
}
}
updateUI();
}
void PDFTextToSpeech::onPauseClicked()
{
Q_ASSERT(m_state == Playing);
if (m_state == Playing)
{
m_textToSpeech->pause();
m_state = Paused;
updateUI();
}
}
void PDFTextToSpeech::onStopClicked()
{
stop();
}
void PDFTextToSpeech::updatePlay()
{
if (m_state != Playing)
{
return;
}
Q_ASSERT(m_proxy);
Q_ASSERT(m_document);
// Jakub Melka: Check, if we have text layout. If not, then create it and return immediately.
// Otherwise, check, if we have something to say.
pdf::PDFAsynchronousTextLayoutCompiler* compiler = m_proxy->getTextLayoutCompiler();
if (!compiler->isTextLayoutReady())
{
compiler->makeTextLayout();
return;
}
QTextToSpeech::State state = m_textToSpeech->state();
if (state == QTextToSpeech::Ready)
{
if (m_currentPage == -1)
{
// Handle starting of document reading
std::vector<pdf::PDFInteger> currentPages = m_proxy->getWidget()->getDrawWidget()->getCurrentPages();
if (!currentPages.empty())
{
updateToNextPage(currentPages.front());
}
}
else if (++m_currentTextFlowIndex >= m_textFlows.size())
{
// Handle transition to next page
updateToNextPage(m_currentPage + 1);
}
if (m_currentTextFlowIndex < m_textFlows.size())
{
// Say next thing
const pdf::PDFTextFlow& textFlow = m_textFlows[m_currentTextFlowIndex];
QString text = textFlow.getText();
m_textToSpeech->say(text);
m_speechActualTextBrowser->setText(text);
}
else
{
// We are finished the reading
m_state = Ready;
}
}
else if (state == QTextToSpeech::BackendError)
{
m_state = Error;
}
updateUI();
}
void PDFTextToSpeech::updateToNextPage(pdf::PDFInteger pageIndex)
{
Q_ASSERT(m_document);
Q_ASSERT(m_state = Playing);
m_currentPage = pageIndex;
const pdf::PDFInteger pageCount = m_document->getCatalog()->getPageCount();
pdf::PDFAsynchronousTextLayoutCompiler* compiler = m_proxy->getTextLayoutCompiler();
Q_ASSERT(compiler->isTextLayoutReady());
m_currentTextLayout = pdf::PDFTextLayout();
m_textFlows.clear();
m_speechActualTextBrowser->clear();
// Find first nonempty page
while (m_currentPage < pageCount)
{
m_currentTextLayout = compiler->getTextLayout(m_currentPage);
m_textFlows = pdf::PDFTextFlow::createTextFlows(m_currentTextLayout, pdf::PDFTextFlow::SeparateBlocks | pdf::PDFTextFlow::RemoveSoftHyphen, m_currentPage);
if (!m_textFlows.empty())
{
break;
}
++m_currentPage;
}
if (m_currentPage < pageCount && m_speechSynchronizeButton->isChecked())
{
m_proxy->goToPage(m_currentPage);
}
m_currentTextFlowIndex = 0;
}
} // namespace pdfviewer

View File

@@ -0,0 +1,147 @@
// Copyright (C) 2020 Jakub Melka
//
// This file is part of Pdf4Qt.
//
// Pdf4Qt is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Pdf4Qt is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with Pdf4Qt. If not, see <https://www.gnu.org/licenses/>.
#ifndef PDFTEXTTOSPEECH_H
#define PDFTEXTTOSPEECH_H
#include "pdftextlayout.h"
#include <QObject>
class QLabel;
class QSlider;
class QComboBox;
class QToolButton;
class QTextBrowser;
class QTextToSpeech;
namespace pdf
{
class PDFDocument;
class PDFDrawWidgetProxy;
class PDFModifiedDocument;
}
namespace pdfviewer
{
class PDFViewerSettings;
/// Text to speech engine used to reading the document
class PDFTextToSpeech : public QObject
{
Q_OBJECT
private:
using BaseClass = QObject;
public:
explicit PDFTextToSpeech(QObject* parent);
enum State
{
Invalid, ///< Text to speech engine is invalid (maybe bad engine)
NoDocument, ///< No document to read
Ready, ///< Ready to read the document contents
Playing, ///< Document is being read
Paused, ///< User paused the reading
Error ///< Error occured in text to speech engine
};
/// Returns true, if text to speech engine is valid and can be used
/// to synthetise text.
bool isValid() const;
/// Sets active document to text to speech engine
void setDocument(const pdf::PDFModifiedDocument& document);
/// Apply settings to the reader
void setSettings(const PDFViewerSettings* viewerSettings);
/// Set draw proxy
void setProxy(pdf::PDFDrawWidgetProxy* proxy);
/// Initialize the ui, which is used
void initializeUI(QComboBox* speechLocaleComboBox,
QComboBox* speechVoiceComboBox,
QSlider* speechRateEdit,
QSlider* speechPitchEdit,
QSlider* speechVolumeEdit,
QToolButton* speechPlayButton,
QToolButton* speechPauseButton,
QToolButton* speechStopButton,
QToolButton* speechSynchronizeButton,
QLabel* speechRateValueLabel,
QLabel* speechPitchValueLabel,
QLabel* speechVolumeValueLabel,
QTextBrowser* speechActualTextBrowser);
private:
/// Updates UI controls depending on the state
void updateUI();
/// Stop the engine, if it is reading
void stop();
void setLocale(const QString& locale);
void setVoice(const QString& voice);
void setRate(const double rate);
void setPitch(const double pitch);
void setVolume(const double volume);
void onLocaleChanged();
void onVoiceChanged();
void onRateChanged(int rate);
void onPitchChanged(int pitch);
void onVolumeChanged(int volume);
void onPlayClicked();
void onPauseClicked();
void onStopClicked();
void updatePlay();
void updateToNextPage(pdf::PDFInteger pageIndex);
QTextToSpeech* m_textToSpeech;
const pdf::PDFDocument* m_document;
pdf::PDFDrawWidgetProxy* m_proxy;
State m_state;
bool m_initialized;
QComboBox* m_speechLocaleComboBox;
QComboBox* m_speechVoiceComboBox;
QSlider* m_speechRateEdit;
QSlider* m_speechVolumeEdit;
QSlider* m_speechPitchEdit;
QToolButton* m_speechPlayButton;
QToolButton* m_speechPauseButton;
QToolButton* m_speechStopButton;
QToolButton* m_speechSynchronizeButton;
QLabel* m_speechRateValueLabel;
QLabel* m_speechPitchValueLabel;
QLabel* m_speechVolumeValueLabel;
QTextBrowser* m_speechActualTextBrowser;
pdf::PDFTextLayout m_currentTextLayout; ///< Text layout for actual page
pdf::PDFTextFlows m_textFlows; ///< Text flows for actual page
size_t m_currentTextFlowIndex = 0; ///< Index of current text flow
pdf::PDFInteger m_currentPage = 0; ///< Current page
};
} // namespace pdfviewer
#endif // PDFTEXTTOSPEECH_H

View File

@@ -0,0 +1,111 @@
// Copyright (C) 2020 Jakub Melka
//
// This file is part of Pdf4Qt.
//
// Pdf4Qt is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Pdf4Qt is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with Pdf4Qt. If not, see <https://www.gnu.org/licenses/>.
#include "pdfundoredomanager.h"
namespace pdfviewer
{
PDFUndoRedoManager::PDFUndoRedoManager(QObject* parent) :
BaseClass(parent)
{
}
PDFUndoRedoManager::~PDFUndoRedoManager()
{
}
void PDFUndoRedoManager::doUndo()
{
if (!canUndo())
{
// Undo operation can't be performed
return;
}
UndoRedoItem item = m_undoSteps.back();
m_undoSteps.pop_back();
m_redoSteps.insert(m_redoSteps.begin(), item);
clampUndoRedoSteps();
emit undoRedoStateChanged();
emit documentChangeRequest(pdf::PDFModifiedDocument(item.oldDocument, nullptr, item.flags));
}
void PDFUndoRedoManager::doRedo()
{
if (!canRedo())
{
// Redo operation can't be performed
return;
}
UndoRedoItem item = m_redoSteps.front();
m_redoSteps.erase(m_redoSteps.begin());
m_undoSteps.push_back(item);
clampUndoRedoSteps();
emit undoRedoStateChanged();
emit documentChangeRequest(pdf::PDFModifiedDocument(item.newDocument, nullptr, item.flags));
}
void PDFUndoRedoManager::clear()
{
if (canUndo() || canRedo())
{
m_undoSteps.clear();
m_redoSteps.clear();
emit undoRedoStateChanged();
}
}
void PDFUndoRedoManager::createUndo(pdf::PDFModifiedDocument document, pdf::PDFDocumentPointer oldDocument)
{
m_undoSteps.emplace_back(oldDocument, document, document.getFlags());
m_redoSteps.clear();
clampUndoRedoSteps();
emit undoRedoStateChanged();
}
void PDFUndoRedoManager::setMaximumSteps(size_t undoLimit, size_t redoLimit)
{
if (m_undoLimit != undoLimit || m_redoLimit != redoLimit)
{
m_undoLimit = undoLimit;
m_redoLimit = redoLimit;
clampUndoRedoSteps();
emit undoRedoStateChanged();
}
}
void PDFUndoRedoManager::clampUndoRedoSteps()
{
if (m_undoSteps.size() > m_undoLimit)
{
// We erase from oldest steps to newest
m_undoSteps.erase(m_undoSteps.begin(), std::next(m_undoSteps.begin(), m_undoSteps.size() - m_undoLimit));
}
if (m_redoSteps.size() > m_redoLimit)
{
// Newest steps are erased
m_redoSteps.resize(m_redoLimit);
}
}
} // namespace pdfviewer

View File

@@ -0,0 +1,104 @@
// Copyright (C) 2020 Jakub Melka
//
// This file is part of Pdf4Qt.
//
// Pdf4Qt is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Pdf4Qt is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with Pdf4Qt. If not, see <https://www.gnu.org/licenses/>.
#ifndef PDFUNDOREDOMANAGER_H
#define PDFUNDOREDOMANAGER_H
#include "pdfdocument.h"
#include <QObject>
namespace pdfviewer
{
/// Undo/Redo document manager, it is managing undo and redo steps,
/// when document is modified.
class PDFUndoRedoManager : public QObject
{
Q_OBJECT
private:
using BaseClass = QObject;
public:
explicit PDFUndoRedoManager(QObject* parent);
virtual ~PDFUndoRedoManager() override;
bool canUndo() const { return !m_undoSteps.empty(); }
bool canRedo() const { return !m_redoSteps.empty(); }
/// Performs single undo step. If Undo action can't be performed,
/// then nothing happens.
void doUndo();
/// Performs single redo step. If Redo action can't be performed,
/// then nothing happens.
void doRedo();
/// Clears all undo/redo steps
void clear();
/// Create undo action (after document modification)
/// \param document Document created by modification
/// \param oldDocument Old document
void createUndo(pdf::PDFModifiedDocument document, pdf::PDFDocumentPointer oldDocument);
/// Sets maximum steps for undo/redo
/// \param undoLimit Maximum undo steps
/// \param redoLimit Maximum redo steps
void setMaximumSteps(size_t undoLimit, size_t redoLimit);
signals:
/// This signals are emitted, when undo/redo action availability has
/// been changed (for example, user pressed undo/redo action)
void undoRedoStateChanged();
/// This signal is being emitted, when user performs undo/redo action.
/// Before signal is emitted, this object is in corrected state, as action
/// is performed.
/// \param document Document
void documentChangeRequest(pdf::PDFModifiedDocument document);
private:
/// Clamps undo/redo steps so they fit the limits
void clampUndoRedoSteps();
struct UndoRedoItem
{
explicit inline UndoRedoItem() = default;
explicit inline UndoRedoItem(pdf::PDFDocumentPointer oldDocument, pdf::PDFDocumentPointer newDocument, pdf::PDFModifiedDocument::ModificationFlags flags) :
oldDocument(qMove(oldDocument)),
newDocument(qMove(newDocument)),
flags(flags)
{
}
pdf::PDFDocumentPointer oldDocument;
pdf::PDFDocumentPointer newDocument;
pdf::PDFModifiedDocument::ModificationFlags flags = pdf::PDFModifiedDocument::None;
};
size_t m_undoLimit = 0;
size_t m_redoLimit = 0;
std::vector<UndoRedoItem> m_undoSteps;
std::vector<UndoRedoItem> m_redoSteps;
};
} // namespace pdfviewer
#endif // PDFUNDOREDOMANAGER_H

View File

@@ -0,0 +1,27 @@
// Copyright (C) 2020 Jakub Melka
//
// This file is part of Pdf4Qt.
//
// Pdf4Qt is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Pdf4Qt is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with Pdf4Qt. If not, see <https://www.gnu.org/licenses/>.
#ifndef PDFVIEWERGLOBAL_H
#define PDFVIEWERGLOBAL_H
#if defined(Pdf4QtVIEWER_LIBRARY)
# define Pdf4QtVIEWERLIBSHARED_EXPORT Q_DECL_EXPORT
#else
# define Pdf4QtVIEWERLIBSHARED_EXPORT Q_DECL_IMPORT
#endif
#endif // PDFVIEWERGLOBAL_H

View File

@@ -0,0 +1,524 @@
// Copyright (C) 2019-2020 Jakub Melka
//
// This file is part of Pdf4Qt.
//
// Pdf4Qt is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Pdf4Qt is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with Pdf4Qt. If not, see <https://www.gnu.org/licenses/>.
#include "pdfviewermainwindow.h"
#include "ui_pdfviewermainwindow.h"
#include "pdfaboutdialog.h"
#include "pdfsidebarwidget.h"
#include "pdfadvancedfindwidget.h"
#include "pdfviewersettingsdialog.h"
#include "pdfdocumentpropertiesdialog.h"
#include "pdfrendertoimagesdialog.h"
#include "pdfoptimizedocumentdialog.h"
#include "pdfdocumentreader.h"
#include "pdfvisitor.h"
#include "pdfstreamfilters.h"
#include "pdfdrawwidget.h"
#include "pdfdrawspacecontroller.h"
#include "pdfrenderingerrorswidget.h"
#include "pdffont.h"
#include "pdfitemmodels.h"
#include "pdfutils.h"
#include "pdfsendmail.h"
#include "pdfexecutionpolicy.h"
#include "pdfwidgetutils.h"
#include "pdfdocumentwriter.h"
#include "pdfsignaturehandler.h"
#include "pdfadvancedtools.h"
#include "pdfwidgetutils.h"
#include <QPainter>
#include <QSettings>
#include <QFileDialog>
#include <QMessageBox>
#include <QCloseEvent>
#include <QApplication>
#include <QDesktopWidget>
#include <QStandardPaths>
#include <QDockWidget>
#include <QTreeView>
#include <QLayout>
#include <QHeaderView>
#include <QInputDialog>
#include <QSpinBox>
#include <QLabel>
#include <QDoubleSpinBox>
#include <QDesktopServices>
#include <QFileDialog>
#include <QLockFile>
#include <QtPrintSupport/QPrinter>
#include <QtPrintSupport/QPrintDialog>
#include <QtConcurrent/QtConcurrent>
#include <QPluginLoader>
#include <QToolButton>
#include <QActionGroup>
#ifdef Q_OS_WIN
#include "Windows.h"
#endif
namespace pdfviewer
{
PDFViewerMainWindow::PDFViewerMainWindow(QWidget* parent) :
QMainWindow(parent),
ui(new Ui::PDFViewerMainWindow),
m_actionManager(new PDFActionManager(this)),
m_programController(new PDFProgramController(this)),
m_sidebarWidget(nullptr),
m_sidebarDockWidget(nullptr),
m_advancedFindWidget(nullptr),
m_advancedFindDockWidget(nullptr),
m_pageNumberSpinBox(nullptr),
m_pageNumberLabel(nullptr),
m_pageZoomSpinBox(nullptr),
m_isLoadingUI(false),
m_progress(new pdf::PDFProgress(this)),
m_taskbarButton(new QWinTaskbarButton(this)),
m_progressTaskbarIndicator(nullptr),
m_progressDialog(nullptr),
m_isChangingProgressStep(false)
{
ui->setupUi(this);
setAcceptDrops(true);
// Initialize toolbar icon size
adjustToolbar(ui->mainToolBar);
// Initialize task bar progress
m_progressTaskbarIndicator = m_taskbarButton->progress();
// Initialize actions
m_actionManager->setAction(PDFActionManager::Open, ui->actionOpen);
m_actionManager->setAction(PDFActionManager::Close, ui->actionClose);
m_actionManager->setAction(PDFActionManager::Quit, ui->actionQuit);
m_actionManager->setAction(PDFActionManager::ZoomIn, ui->actionZoom_In);
m_actionManager->setAction(PDFActionManager::ZoomOut, ui->actionZoom_Out);
m_actionManager->setAction(PDFActionManager::Find, ui->actionFind);
m_actionManager->setAction(PDFActionManager::FindPrevious, ui->actionFindPrevious);
m_actionManager->setAction(PDFActionManager::FindNext, ui->actionFindNext);
m_actionManager->setAction(PDFActionManager::SelectTextAll, ui->actionSelectTextAll);
m_actionManager->setAction(PDFActionManager::DeselectText, ui->actionDeselectText);
m_actionManager->setAction(PDFActionManager::CopyText, ui->actionCopyText);
m_actionManager->setAction(PDFActionManager::RotateRight, ui->actionRotateRight);
m_actionManager->setAction(PDFActionManager::RotateLeft, ui->actionRotateLeft);
m_actionManager->setAction(PDFActionManager::Print, ui->actionPrint);
m_actionManager->setAction(PDFActionManager::Undo, ui->actionUndo);
m_actionManager->setAction(PDFActionManager::Redo, ui->actionRedo);
m_actionManager->setAction(PDFActionManager::Save, ui->actionSave);
m_actionManager->setAction(PDFActionManager::SaveAs, ui->actionSave_As);
m_actionManager->setAction(PDFActionManager::GoToDocumentStart, ui->actionGoToDocumentStart);
m_actionManager->setAction(PDFActionManager::GoToDocumentEnd, ui->actionGoToDocumentEnd);
m_actionManager->setAction(PDFActionManager::GoToNextPage, ui->actionGoToNextPage);
m_actionManager->setAction(PDFActionManager::GoToPreviousPage, ui->actionGoToPreviousPage);
m_actionManager->setAction(PDFActionManager::GoToNextLine, ui->actionGoToNextLine);
m_actionManager->setAction(PDFActionManager::GoToPreviousLine, ui->actionGoToPreviousLine);
m_actionManager->setAction(PDFActionManager::CreateStickyNoteComment, ui->actionStickyNoteComment);
m_actionManager->setAction(PDFActionManager::CreateStickyNoteHelp, ui->actionStickyNoteHelp);
m_actionManager->setAction(PDFActionManager::CreateStickyNoteInsert, ui->actionStickyNoteInsert);
m_actionManager->setAction(PDFActionManager::CreateStickyNoteKey, ui->actionStickyNoteKey);
m_actionManager->setAction(PDFActionManager::CreateStickyNoteNewParagraph, ui->actionStickyNoteNewParagraph);
m_actionManager->setAction(PDFActionManager::CreateStickyNoteNote, ui->actionStickyNoteNote);
m_actionManager->setAction(PDFActionManager::CreateStickyNoteParagraph, ui->actionStickyNoteParagraph);
m_actionManager->setAction(PDFActionManager::CreateTextHighlight, ui->actionCreateTextHighlight);
m_actionManager->setAction(PDFActionManager::CreateTextUnderline, ui->actionCreateTextUnderline);
m_actionManager->setAction(PDFActionManager::CreateTextStrikeout, ui->actionCreateTextStrikeout);
m_actionManager->setAction(PDFActionManager::CreateTextSquiggly, ui->actionCreateTextSquiggly);
m_actionManager->setAction(PDFActionManager::CreateHyperlink, ui->actionCreateHyperlink);
m_actionManager->setAction(PDFActionManager::CreateInlineText, ui->actionInlineText);
m_actionManager->setAction(PDFActionManager::CreateStraightLine, ui->actionCreateStraightLine);
m_actionManager->setAction(PDFActionManager::CreatePolyline, ui->actionCreatePolyline);
m_actionManager->setAction(PDFActionManager::CreatePolygon, ui->actionCreatePolygon);
m_actionManager->setAction(PDFActionManager::CreateEllipse, ui->actionCreateEllipse);
m_actionManager->setAction(PDFActionManager::CreateFreehandCurve, ui->actionCreateFreehandCurve);
m_actionManager->setAction(PDFActionManager::RenderOptionAntialiasing, ui->actionRenderOptionAntialiasing);
m_actionManager->setAction(PDFActionManager::RenderOptionTextAntialiasing, ui->actionRenderOptionTextAntialiasing);
m_actionManager->setAction(PDFActionManager::RenderOptionSmoothPictures, ui->actionRenderOptionSmoothPictures);
m_actionManager->setAction(PDFActionManager::RenderOptionIgnoreOptionalContentSettings, ui->actionRenderOptionIgnoreOptionalContentSettings);
m_actionManager->setAction(PDFActionManager::RenderOptionDisplayAnnotations, ui->actionRenderOptionDisplayAnnotations);
m_actionManager->setAction(PDFActionManager::RenderOptionInvertColors, ui->actionInvertColors);
m_actionManager->setAction(PDFActionManager::RenderOptionShowTextBlocks, ui->actionShow_Text_Blocks);
m_actionManager->setAction(PDFActionManager::RenderOptionShowTextLines, ui->actionShow_Text_Lines);
m_actionManager->setAction(PDFActionManager::Properties, ui->actionProperties);
m_actionManager->setAction(PDFActionManager::Options, ui->actionOptions);
m_actionManager->setAction(PDFActionManager::About, ui->actionAbout);
m_actionManager->setAction(PDFActionManager::SendByMail, ui->actionSend_by_E_Mail);
m_actionManager->setAction(PDFActionManager::RenderToImages, ui->actionRender_to_Images);
m_actionManager->setAction(PDFActionManager::Optimize, ui->actionOptimize);
m_actionManager->setAction(PDFActionManager::FitPage, ui->actionFitPage);
m_actionManager->setAction(PDFActionManager::FitWidth, ui->actionFitWidth);
m_actionManager->setAction(PDFActionManager::FitHeight, ui->actionFitHeight);
m_actionManager->setAction(PDFActionManager::ShowRenderingErrors, ui->actionRendering_Errors);
m_actionManager->setAction(PDFActionManager::PageLayoutSinglePage, ui->actionPageLayoutSinglePage);
m_actionManager->setAction(PDFActionManager::PageLayoutContinuous, ui->actionPageLayoutContinuous);
m_actionManager->setAction(PDFActionManager::PageLayoutTwoPages, ui->actionPageLayoutTwoPages);
m_actionManager->setAction(PDFActionManager::PageLayoutTwoColumns, ui->actionPageLayoutTwoColumns);
m_actionManager->setAction(PDFActionManager::PageLayoutFirstPageOnRightSide, ui->actionFirstPageOnRightSide);
m_actionManager->setAction(PDFActionManager::ToolSelectText, ui->actionSelectText);
m_actionManager->setAction(PDFActionManager::ToolMagnifier, ui->actionMagnifier);
m_actionManager->setAction(PDFActionManager::ToolScreenshot, ui->actionScreenshot);
m_actionManager->setAction(PDFActionManager::ToolExtractImage, ui->actionExtractImage);
m_actionManager->initActions(pdf::PDFWidgetUtils::scaleDPI(this, QSize(24, 24)), true);
for (QAction* action : m_programController->getRecentFileManager()->getActions())
{
ui->menuFile->insertAction(ui->actionQuit, action);
}
ui->menuFile->insertSeparator(ui->actionQuit);
connect(ui->actionQuit, &QAction::triggered, this, &PDFViewerMainWindow::onActionQuitTriggered);
m_pageNumberSpinBox = new QSpinBox(this);
m_pageNumberLabel = new QLabel(this);
m_pageNumberSpinBox->setFixedWidth(pdf::PDFWidgetUtils::scaleDPI_x(m_pageNumberSpinBox, 80));
m_pageNumberSpinBox->setAlignment(Qt::AlignCenter);
connect(m_pageNumberSpinBox, &QSpinBox::editingFinished, this, &PDFViewerMainWindow::onPageNumberSpinboxEditingFinished);
for (QAction* action : m_actionManager->getActionGroup(PDFActionManager::CreateStampGroup)->actions())
{
ui->menuStamp->addAction(action);
}
// Page control
ui->mainToolBar->addSeparator();
ui->mainToolBar->addAction(ui->actionGoToDocumentStart);
ui->mainToolBar->addAction(ui->actionGoToPreviousPage);
ui->mainToolBar->addWidget(m_pageNumberSpinBox);
ui->mainToolBar->addWidget(m_pageNumberLabel);
ui->mainToolBar->addAction(ui->actionGoToNextPage);
ui->mainToolBar->addAction(ui->actionGoToDocumentEnd);
// Zoom
ui->mainToolBar->addSeparator();
ui->mainToolBar->addAction(ui->actionZoom_In);
ui->mainToolBar->addAction(ui->actionZoom_Out);
m_pageZoomSpinBox = new QDoubleSpinBox(this);
m_pageZoomSpinBox->setMinimum(pdf::PDFDrawWidgetProxy::getMinZoom() * 100);
m_pageZoomSpinBox->setMaximum(pdf::PDFDrawWidgetProxy::getMaxZoom() * 100);
m_pageZoomSpinBox->setDecimals(2);
m_pageZoomSpinBox->setSuffix(tr("%"));
m_pageZoomSpinBox->setFixedWidth(pdf::PDFWidgetUtils::scaleDPI_x(m_pageNumberSpinBox, 80));
m_pageZoomSpinBox->setAlignment(Qt::AlignVCenter | Qt::AlignRight);
connect(m_pageZoomSpinBox, &QDoubleSpinBox::editingFinished, this, &PDFViewerMainWindow::onPageZoomSpinboxEditingFinished);
ui->mainToolBar->addWidget(m_pageZoomSpinBox);
// Fit page, width, height
ui->mainToolBar->addAction(ui->actionFitPage);
ui->mainToolBar->addAction(ui->actionFitWidth);
ui->mainToolBar->addAction(ui->actionFitHeight);
ui->mainToolBar->addSeparator();
// Tools
ui->mainToolBar->addAction(ui->actionSelectText);
ui->mainToolBar->addAction(ui->actionCreateTextHighlight);
ui->mainToolBar->addAction(ui->actionCreateTextUnderline);
ui->mainToolBar->addAction(ui->actionCreateTextStrikeout);
ui->mainToolBar->addAction(ui->actionCreateTextSquiggly);
ui->mainToolBar->addAction(ui->actionMagnifier);
ui->mainToolBar->addAction(ui->actionScreenshot);
ui->mainToolBar->addAction(ui->actionExtractImage);
ui->mainToolBar->addSeparator();
// Special tools
QToolButton* insertStickyNoteButton = m_actionManager->createToolButtonForActionGroup(PDFActionManager::CreateStickyNoteGroup, ui->mainToolBar);
ui->mainToolBar->addWidget(insertStickyNoteButton);
ui->mainToolBar->addSeparator();
m_programController->initialize(PDFProgramController::AllFeatures, this, this, m_actionManager, m_progress);
setCentralWidget(m_programController->getPdfWidget());
setFocusProxy(m_programController->getPdfWidget());
m_sidebarWidget = new PDFSidebarWidget(m_programController->getPdfWidget()->getDrawWidgetProxy(), m_programController->getTextToSpeech(), m_programController->getCertificateStore(), m_programController->getSettings(), this);
m_sidebarDockWidget = new QDockWidget(tr("Sidebar"), this);
m_sidebarDockWidget->setObjectName("SidebarDockWidget");
m_sidebarDockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
m_sidebarDockWidget->setWidget(m_sidebarWidget);
addDockWidget(Qt::LeftDockWidgetArea, m_sidebarDockWidget);
m_sidebarDockWidget->hide();
connect(m_sidebarWidget, &PDFSidebarWidget::actionTriggered, m_programController, &PDFProgramController::onActionTriggered);
m_advancedFindWidget = new PDFAdvancedFindWidget(m_programController->getPdfWidget()->getDrawWidgetProxy(), this);
m_advancedFindDockWidget = new QDockWidget(tr("Advanced find"), this);
m_advancedFindDockWidget->setObjectName("AdvancedFind");
m_advancedFindDockWidget->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
m_advancedFindDockWidget->setWidget(m_advancedFindWidget);
addDockWidget(Qt::BottomDockWidgetArea, m_advancedFindDockWidget);
m_advancedFindDockWidget->hide();
QAction* toggleAdvancedFindAction = m_advancedFindDockWidget->toggleViewAction();
toggleAdvancedFindAction->setObjectName("actionAdvancedFind");
toggleAdvancedFindAction->setText(tr("Advanced Find"));
toggleAdvancedFindAction->setShortcut(QKeySequence("Ctrl+Shift+F"));
toggleAdvancedFindAction->setIcon(QIcon(":/resources/find-advanced.svg"));
ui->menuEdit->insertAction(nullptr, toggleAdvancedFindAction);
m_actionManager->addAdditionalAction(m_advancedFindDockWidget->toggleViewAction());
ui->menuView->addSeparator();
ui->menuView->addAction(m_sidebarDockWidget->toggleViewAction());
m_sidebarDockWidget->toggleViewAction()->setObjectName("actionSidebar");
m_actionManager->addAdditionalAction(m_sidebarDockWidget->toggleViewAction());
connect(m_progress, &pdf::PDFProgress::progressStarted, this, &PDFViewerMainWindow::onProgressStarted);
connect(m_progress, &pdf::PDFProgress::progressStep, this, &PDFViewerMainWindow::onProgressStep);
connect(m_progress, &pdf::PDFProgress::progressFinished, this, &PDFViewerMainWindow::onProgressFinished);
m_programController->finishInitialization();
if (pdf::PDFToolManager* toolManager = m_programController->getToolManager())
{
connect(toolManager, &pdf::PDFToolManager::messageDisplayRequest, statusBar(), &QStatusBar::showMessage);
}
}
PDFViewerMainWindow::~PDFViewerMainWindow()
{
delete m_programController;
m_programController = nullptr;
delete m_actionManager;
m_actionManager = nullptr;
delete ui;
}
void PDFViewerMainWindow::onActionQuitTriggered()
{
close();
}
void PDFViewerMainWindow::onPageNumberSpinboxEditingFinished()
{
if (m_isLoadingUI)
{
return;
}
if (m_pageNumberSpinBox->hasFocus())
{
m_programController->getPdfWidget()->setFocus();
}
m_programController->getPdfWidget()->getDrawWidgetProxy()->goToPage(m_pageNumberSpinBox->value() - 1);
}
void PDFViewerMainWindow::onPageZoomSpinboxEditingFinished()
{
if (m_isLoadingUI)
{
return;
}
if (m_pageZoomSpinBox->hasFocus())
{
m_programController->getPdfWidget()->setFocus();
}
m_programController->getPdfWidget()->getDrawWidgetProxy()->zoom(m_pageZoomSpinBox->value() / 100.0);
}
void PDFViewerMainWindow::onProgressStarted(pdf::ProgressStartupInfo info)
{
Q_ASSERT(!m_progressDialog);
if (info.showDialog)
{
m_progressDialog = new QProgressDialog(info.text, QString(), 0, 100, this);
m_progressDialog->setWindowModality(Qt::WindowModal);
m_progressDialog->setCancelButton(nullptr);
}
m_progressTaskbarIndicator->setRange(0, 100);
m_progressTaskbarIndicator->reset();
m_progressTaskbarIndicator->show();
m_programController->setIsBusy(true);
m_programController->updateActionsAvailability();
}
void PDFViewerMainWindow::onProgressStep(int percentage)
{
if (m_isChangingProgressStep)
{
return;
}
pdf::PDFTemporaryValueChange guard(&m_isChangingProgressStep, true);
if (m_progressDialog)
{
m_progressDialog->setValue(percentage);
}
m_progressTaskbarIndicator->setValue(percentage);
}
void PDFViewerMainWindow::onProgressFinished()
{
if (m_progressDialog)
{
m_progressDialog->hide();
m_progressDialog->deleteLater();
m_progressDialog = nullptr;
}
m_progressTaskbarIndicator->hide();
m_programController->setIsBusy(false);
m_programController->updateActionsAvailability();
}
void PDFViewerMainWindow::updateUI(bool fullUpdate)
{
pdf::PDFTemporaryValueChange guard(&m_isLoadingUI, true);
if (fullUpdate)
{
if (pdf::PDFDocument* document = m_programController->getDocument())
{
size_t pageCount = document->getCatalog()->getPageCount();
m_pageNumberSpinBox->setMinimum(1);
m_pageNumberSpinBox->setMaximum(static_cast<int>(pageCount));
m_pageNumberSpinBox->setEnabled(true);
m_pageNumberLabel->setText(tr(" / %1").arg(pageCount));
}
else
{
m_pageNumberSpinBox->setEnabled(false);
m_pageNumberLabel->setText(QString());
}
}
else
{
std::vector<pdf::PDFInteger> currentPages = m_programController->getPdfWidget()->getDrawWidget()->getCurrentPages();
if (!currentPages.empty())
{
m_pageNumberSpinBox->setValue(currentPages.front() + 1);
// Prefetch pages, if it is enabled
if (m_programController->getSettings()->isPagePrefetchingEnabled())
{
m_programController->getPdfWidget()->getDrawWidgetProxy()->prefetchPages(currentPages.back());
}
}
m_sidebarWidget->setCurrentPages(currentPages);
}
m_pageZoomSpinBox->setValue(m_programController->getPdfWidget()->getDrawWidgetProxy()->getZoom() * 100);
}
QMenu* PDFViewerMainWindow::addToolMenu(QString name)
{
return ui->menuTools->addMenu(name);
}
void PDFViewerMainWindow::setStatusBarMessage(QString message, int time)
{
statusBar()->showMessage(message, time);
}
void PDFViewerMainWindow::setDocument(const pdf::PDFModifiedDocument& document)
{
if (m_sidebarWidget)
{
m_sidebarWidget->setDocument(document, *m_programController->getSignatures());
}
if (m_advancedFindWidget)
{
m_advancedFindWidget->setDocument(document);
}
if (m_sidebarWidget)
{
if (m_sidebarWidget->isEmpty())
{
m_sidebarDockWidget->hide();
}
else
{
m_sidebarDockWidget->show();
}
}
if (!document && m_advancedFindDockWidget)
{
m_advancedFindDockWidget->hide();
}
}
void PDFViewerMainWindow::adjustToolbar(QToolBar* toolbar)
{
QSize iconSize = pdf::PDFWidgetUtils::scaleDPI(this, QSize(24, 24));
toolbar->setIconSize(iconSize);
}
void PDFViewerMainWindow::closeEvent(QCloseEvent* event)
{
if (!m_programController->canClose())
{
// Jakub Melka: Do not allow to close the application, if document
// reading is running.
event->ignore();
}
else
{
m_programController->writeSettings();
m_programController->closeDocument();
event->accept();
}
}
void PDFViewerMainWindow::showEvent(QShowEvent* event)
{
Q_UNUSED(event);
m_taskbarButton->setWindow(windowHandle());
}
void PDFViewerMainWindow::dragEnterEvent(QDragEnterEvent* event)
{
if (event->mimeData()->hasUrls())
{
event->setDropAction(Qt::LinkAction);
event->accept();
}
}
void PDFViewerMainWindow::dragMoveEvent(QDragMoveEvent* event)
{
if (event->mimeData()->hasUrls())
{
event->setDropAction(Qt::LinkAction);
event->accept();
}
}
void PDFViewerMainWindow::dropEvent(QDropEvent* event)
{
if (event->mimeData()->hasUrls())
{
QList<QUrl> urls = event->mimeData()->urls();
if (urls.size() == 1)
{
m_programController->openDocument(urls.front().toLocalFile());
event->acceptProposedAction();
}
}
}
} // namespace pdfviewer

View File

@@ -0,0 +1,127 @@
// Copyright (C) 2019-2020 Jakub Melka
//
// This file is part of Pdf4Qt.
//
// Pdf4Qt is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Pdf4Qt is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with Pdf4Qt. If not, see <https://www.gnu.org/licenses/>.
#ifndef PDFVIEWERMAINWINDOW_H
#define PDFVIEWERMAINWINDOW_H
#include "pdfviewerglobal.h"
#include "pdfcatalog.h"
#include "pdfrenderer.h"
#include "pdfprogress.h"
#include "pdfdocument.h"
#include "pdfviewersettings.h"
#include "pdfdocumentreader.h"
#include "pdfdocumentpropertiesdialog.h"
#include "pdfwidgettool.h"
#include "pdfrecentfilemanager.h"
#include "pdftexttospeech.h"
#include "pdfannotation.h"
#include "pdfform.h"
#include "pdfundoredomanager.h"
#include "pdfplugin.h"
#include "pdfprogramcontroller.h"
#include <QFuture>
#include <QTreeView>
#include <QMainWindow>
#include <QWinTaskbarButton>
#include <QWinTaskbarProgress>
#include <QFutureWatcher>
#include <QProgressDialog>
class QLabel;
class QSpinBox;
class QSettings;
class QDoubleSpinBox;
namespace Ui
{
class PDFViewerMainWindow;
}
namespace pdf
{
class PDFAction;
class PDFWidget;
class PDFDocument;
class PDFOptionalContentTreeItemModel;
}
namespace pdfviewer
{
class PDFSidebarWidget;
class PDFAdvancedFindWidget;
class Pdf4QtVIEWERLIBSHARED_EXPORT PDFViewerMainWindow : public QMainWindow, public IMainWindow
{
Q_OBJECT
public:
explicit PDFViewerMainWindow(QWidget *parent = nullptr);
virtual ~PDFViewerMainWindow() override;
virtual void closeEvent(QCloseEvent* event) override;
virtual void showEvent(QShowEvent* event) override;
PDFProgramController* getProgramController() const { return m_programController; }
virtual void updateUI(bool fullUpdate) override;
virtual QMenu* addToolMenu(QString name) override;
virtual void setStatusBarMessage(QString message, int time) override;
virtual void setDocument(const pdf::PDFModifiedDocument& document) override;
virtual void adjustToolbar(QToolBar* toolbar) override;
protected:
virtual void dragEnterEvent(QDragEnterEvent* event) override;
virtual void dragMoveEvent(QDragMoveEvent* event) override;
virtual void dropEvent(QDropEvent* event) override;
private:
void onActionQuitTriggered();
void onPageNumberSpinboxEditingFinished();
void onPageZoomSpinboxEditingFinished();
void onProgressStarted(pdf::ProgressStartupInfo info);
void onProgressStep(int percentage);
void onProgressFinished();
QIcon createStickyNoteIcon(QString key) const;
Ui::PDFViewerMainWindow* ui;
PDFActionManager* m_actionManager;
PDFProgramController* m_programController;
PDFSidebarWidget* m_sidebarWidget;
QDockWidget* m_sidebarDockWidget;
PDFAdvancedFindWidget* m_advancedFindWidget;
QDockWidget* m_advancedFindDockWidget;
QSpinBox* m_pageNumberSpinBox;
QLabel* m_pageNumberLabel;
QDoubleSpinBox* m_pageZoomSpinBox;
bool m_isLoadingUI;
pdf::PDFProgress* m_progress;
QWinTaskbarButton* m_taskbarButton;
QWinTaskbarProgress* m_progressTaskbarIndicator;
QProgressDialog* m_progressDialog;
bool m_isChangingProgressStep;
};
} // namespace pdfviewer
#endif // PDFVIEWERMAINWINDOW_H

View File

@@ -0,0 +1,824 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>PDFViewerMainWindow</class>
<widget class="QMainWindow" name="PDFViewerMainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>770</width>
<height>572</height>
</rect>
</property>
<property name="windowTitle">
<string>PDF Viewer</string>
</property>
<widget class="QWidget" name="centralWidget"/>
<widget class="QMenuBar" name="menuBar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>770</width>
<height>21</height>
</rect>
</property>
<widget class="QMenu" name="menuFile">
<property name="title">
<string>File</string>
</property>
<addaction name="actionOpen"/>
<addaction name="actionClose"/>
<addaction name="separator"/>
<addaction name="actionSave"/>
<addaction name="actionSave_As"/>
<addaction name="separator"/>
<addaction name="actionSend_by_E_Mail"/>
<addaction name="actionPrint"/>
<addaction name="actionRender_to_Images"/>
<addaction name="separator"/>
<addaction name="actionProperties"/>
<addaction name="separator"/>
<addaction name="actionQuit"/>
</widget>
<widget class="QMenu" name="menuGoTo">
<property name="title">
<string>Go To</string>
</property>
<addaction name="actionGoToDocumentStart"/>
<addaction name="actionGoToDocumentEnd"/>
<addaction name="actionGoToPreviousPage"/>
<addaction name="actionGoToNextPage"/>
<addaction name="actionGoToPreviousLine"/>
<addaction name="actionGoToNextLine"/>
</widget>
<widget class="QMenu" name="menuView">
<property name="title">
<string>View</string>
</property>
<widget class="QMenu" name="menuPage_Layout">
<property name="title">
<string>Page Layout</string>
</property>
<addaction name="actionPageLayoutSinglePage"/>
<addaction name="actionPageLayoutContinuous"/>
<addaction name="actionPageLayoutTwoPages"/>
<addaction name="actionPageLayoutTwoColumns"/>
<addaction name="separator"/>
<addaction name="actionFirstPageOnRightSide"/>
</widget>
<widget class="QMenu" name="menuRendering_Options">
<property name="title">
<string>Rendering Options</string>
</property>
<addaction name="actionRenderOptionAntialiasing"/>
<addaction name="actionRenderOptionTextAntialiasing"/>
<addaction name="actionRenderOptionSmoothPictures"/>
<addaction name="actionRenderOptionIgnoreOptionalContentSettings"/>
<addaction name="actionRenderOptionDisplayAnnotations"/>
</widget>
<addaction name="menuPage_Layout"/>
<addaction name="menuRendering_Options"/>
<addaction name="separator"/>
<addaction name="actionRotateRight"/>
<addaction name="actionRotateLeft"/>
<addaction name="separator"/>
<addaction name="actionZoom_In"/>
<addaction name="actionZoom_Out"/>
<addaction name="separator"/>
<addaction name="actionFitPage"/>
<addaction name="actionFitWidth"/>
<addaction name="actionFitHeight"/>
<addaction name="separator"/>
<addaction name="actionInvertColors"/>
</widget>
<widget class="QMenu" name="menuTools">
<property name="title">
<string>Tools</string>
</property>
<addaction name="actionMagnifier"/>
<addaction name="actionScreenshot"/>
<addaction name="actionExtractImage"/>
<addaction name="separator"/>
<addaction name="actionRendering_Errors"/>
<addaction name="separator"/>
<addaction name="actionOptions"/>
</widget>
<widget class="QMenu" name="menuHelp">
<property name="title">
<string>Help</string>
</property>
<addaction name="actionAbout"/>
</widget>
<widget class="QMenu" name="menuDeveloper">
<property name="title">
<string>Developer</string>
</property>
<addaction name="actionShow_Text_Blocks"/>
<addaction name="actionShow_Text_Lines"/>
</widget>
<widget class="QMenu" name="menuEdit">
<property name="title">
<string>Edit</string>
</property>
<addaction name="actionUndo"/>
<addaction name="actionRedo"/>
<addaction name="separator"/>
<addaction name="actionFind"/>
<addaction name="actionFindPrevious"/>
<addaction name="actionFindNext"/>
<addaction name="separator"/>
<addaction name="actionSelectText"/>
<addaction name="actionCopyText"/>
<addaction name="actionSelectTextAll"/>
<addaction name="actionDeselectText"/>
<addaction name="separator"/>
<addaction name="actionOptimize"/>
<addaction name="separator"/>
</widget>
<widget class="QMenu" name="menuInsert">
<property name="title">
<string>Insert</string>
</property>
<widget class="QMenu" name="menuSticky_Note">
<property name="title">
<string>Sticky Note</string>
</property>
<addaction name="actionStickyNoteComment"/>
<addaction name="actionStickyNoteHelp"/>
<addaction name="actionStickyNoteInsert"/>
<addaction name="actionStickyNoteKey"/>
<addaction name="actionStickyNoteNewParagraph"/>
<addaction name="actionStickyNoteNote"/>
<addaction name="actionStickyNoteParagraph"/>
</widget>
<widget class="QMenu" name="menuStamp">
<property name="title">
<string>Stamp</string>
</property>
</widget>
<widget class="QMenu" name="menuTextHighlight">
<property name="title">
<string>Text Higlight</string>
</property>
<addaction name="actionCreateTextHighlight"/>
<addaction name="actionCreateTextUnderline"/>
<addaction name="actionCreateTextStrikeout"/>
<addaction name="actionCreateTextSquiggly"/>
</widget>
<addaction name="menuSticky_Note"/>
<addaction name="actionCreateHyperlink"/>
<addaction name="actionInlineText"/>
<addaction name="actionCreateStraightLine"/>
<addaction name="actionCreatePolyline"/>
<addaction name="actionCreatePolygon"/>
<addaction name="actionCreateEllipse"/>
<addaction name="actionCreateFreehandCurve"/>
<addaction name="menuStamp"/>
<addaction name="menuTextHighlight"/>
</widget>
<addaction name="menuFile"/>
<addaction name="menuEdit"/>
<addaction name="menuView"/>
<addaction name="menuInsert"/>
<addaction name="menuGoTo"/>
<addaction name="menuTools"/>
<addaction name="menuHelp"/>
<addaction name="menuDeveloper"/>
</widget>
<widget class="QToolBar" name="mainToolBar">
<attribute name="toolBarArea">
<enum>TopToolBarArea</enum>
</attribute>
<attribute name="toolBarBreak">
<bool>false</bool>
</attribute>
<addaction name="actionOpen"/>
</widget>
<widget class="QStatusBar" name="statusBar"/>
<action name="actionOpen">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/open.svg</normaloff>:/resources/open.svg</iconset>
</property>
<property name="text">
<string>Open</string>
</property>
</action>
<action name="actionClose">
<property name="text">
<string>Close</string>
</property>
</action>
<action name="actionQuit">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/quit.svg</normaloff>:/resources/quit.svg</iconset>
</property>
<property name="text">
<string>Quit</string>
</property>
</action>
<action name="actionPageLayoutSinglePage">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Single Page</string>
</property>
<property name="shortcut">
<string>Ctrl+1</string>
</property>
</action>
<action name="actionPageLayoutContinuous">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Continuous</string>
</property>
<property name="shortcut">
<string>Ctrl+2</string>
</property>
</action>
<action name="actionPageLayoutTwoPages">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Two Pages</string>
</property>
<property name="shortcut">
<string>Ctrl+3</string>
</property>
</action>
<action name="actionPageLayoutTwoColumns">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Two columns</string>
</property>
<property name="shortcut">
<string>Ctrl+4</string>
</property>
</action>
<action name="actionFirstPageOnRightSide">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>First page on right side</string>
</property>
<property name="toolTip">
<string>First page on right side</string>
</property>
<property name="shortcut">
<string>Ctrl+5</string>
</property>
</action>
<action name="actionRendering_Errors">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/rendering-errors.svg</normaloff>:/resources/rendering-errors.svg</iconset>
</property>
<property name="text">
<string>Rendering Errors</string>
</property>
<property name="shortcut">
<string>Ctrl+E</string>
</property>
</action>
<action name="actionRenderOptionAntialiasing">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Antialiasing</string>
</property>
</action>
<action name="actionRenderOptionTextAntialiasing">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Text Antialiasing</string>
</property>
</action>
<action name="actionRenderOptionSmoothPictures">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Smooth Pictures</string>
</property>
</action>
<action name="actionRenderOptionIgnoreOptionalContentSettings">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Ignore Optional Content Settings</string>
</property>
</action>
<action name="actionOptions">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/settings.svg</normaloff>:/resources/settings.svg</iconset>
</property>
<property name="text">
<string>Options...</string>
</property>
<property name="shortcut">
<string>Ctrl+K</string>
</property>
</action>
<action name="actionZoom_In">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/zoom-in.svg</normaloff>:/resources/zoom-in.svg</iconset>
</property>
<property name="text">
<string>Zoom In</string>
</property>
</action>
<action name="actionZoom_Out">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/zoom-out.svg</normaloff>:/resources/zoom-out.svg</iconset>
</property>
<property name="text">
<string>Zoom Out</string>
</property>
</action>
<action name="actionAbout">
<property name="text">
<string>About</string>
</property>
</action>
<action name="actionFitPage">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/zoom-fit.svg</normaloff>:/resources/zoom-fit.svg</iconset>
</property>
<property name="text">
<string>Fit Page</string>
</property>
</action>
<action name="actionFitWidth">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/zoom-fit-horizontal.svg</normaloff>:/resources/zoom-fit-horizontal.svg</iconset>
</property>
<property name="text">
<string>Fit Width</string>
</property>
<property name="shortcut">
<string>W</string>
</property>
</action>
<action name="actionFitHeight">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/zoom-fit-vertical.svg</normaloff>:/resources/zoom-fit-vertical.svg</iconset>
</property>
<property name="text">
<string>Fit Height</string>
</property>
<property name="shortcut">
<string>H</string>
</property>
</action>
<action name="actionProperties">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/info.svg</normaloff>:/resources/info.svg</iconset>
</property>
<property name="text">
<string>Properties</string>
</property>
</action>
<action name="actionSend_by_E_Mail">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/send-mail.svg</normaloff>:/resources/send-mail.svg</iconset>
</property>
<property name="text">
<string>Send by E-Mail</string>
</property>
</action>
<action name="actionShow_Text_Blocks">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Show Text Blocks</string>
</property>
</action>
<action name="actionShow_Text_Lines">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Show Text Lines</string>
</property>
</action>
<action name="actionFind">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/find.svg</normaloff>:/resources/find.svg</iconset>
</property>
<property name="text">
<string>Find</string>
</property>
</action>
<action name="actionFindPrevious">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/find-previous.svg</normaloff>:/resources/find-previous.svg</iconset>
</property>
<property name="text">
<string>Find Previous</string>
</property>
</action>
<action name="actionFindNext">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/find-next.svg</normaloff>:/resources/find-next.svg</iconset>
</property>
<property name="text">
<string>Find Next</string>
</property>
</action>
<action name="actionSelectText">
<property name="checkable">
<bool>true</bool>
</property>
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/select-text.svg</normaloff>:/resources/select-text.svg</iconset>
</property>
<property name="text">
<string>Select text</string>
</property>
</action>
<action name="actionSelectTextAll">
<property name="text">
<string>Select All</string>
</property>
</action>
<action name="actionDeselectText">
<property name="text">
<string>Deselect</string>
</property>
</action>
<action name="actionCopyText">
<property name="text">
<string>Copy text</string>
</property>
</action>
<action name="actionInvertColors">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Invert Colors</string>
</property>
</action>
<action name="actionRotateRight">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/rotate-right.svg</normaloff>:/resources/rotate-right.svg</iconset>
</property>
<property name="text">
<string>Rotate Right</string>
</property>
</action>
<action name="actionRotateLeft">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/rotate-left.svg</normaloff>:/resources/rotate-left.svg</iconset>
</property>
<property name="text">
<string>Rotate Left</string>
</property>
</action>
<action name="actionPrint">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/print.svg</normaloff>:/resources/print.svg</iconset>
</property>
<property name="text">
<string>Print</string>
</property>
</action>
<action name="actionRender_to_Images">
<property name="text">
<string>Render to Images</string>
</property>
</action>
<action name="actionMagnifier">
<property name="checkable">
<bool>true</bool>
</property>
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/magnifier.svg</normaloff>:/resources/magnifier.svg</iconset>
</property>
<property name="text">
<string>Magnifier</string>
</property>
<property name="toolTip">
<string>Magnifier Tool</string>
</property>
</action>
<action name="actionScreenshot">
<property name="checkable">
<bool>true</bool>
</property>
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/screenshot-tool.svg</normaloff>:/resources/screenshot-tool.svg</iconset>
</property>
<property name="text">
<string>Screenshot</string>
</property>
</action>
<action name="actionExtractImage">
<property name="checkable">
<bool>true</bool>
</property>
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/extract-image.svg</normaloff>:/resources/extract-image.svg</iconset>
</property>
<property name="text">
<string>Extract Image</string>
</property>
</action>
<action name="actionRenderOptionDisplayAnnotations">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Display Annotations</string>
</property>
</action>
<action name="actionUndo">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/undo.svg</normaloff>:/resources/undo.svg</iconset>
</property>
<property name="text">
<string>Undo</string>
</property>
</action>
<action name="actionRedo">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/redo.svg</normaloff>:/resources/redo.svg</iconset>
</property>
<property name="text">
<string>Redo</string>
</property>
</action>
<action name="actionOptimize">
<property name="text">
<string>Optimize</string>
</property>
</action>
<action name="actionSave_As">
<property name="text">
<string>Save &amp;As</string>
</property>
</action>
<action name="actionSave">
<property name="text">
<string>Save</string>
</property>
</action>
<action name="actionStickyNoteComment">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Comment</string>
</property>
</action>
<action name="actionStickyNoteHelp">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Help</string>
</property>
</action>
<action name="actionStickyNoteInsert">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Insert</string>
</property>
</action>
<action name="actionStickyNoteKey">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Key</string>
</property>
</action>
<action name="actionStickyNoteNewParagraph">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>New Paragraph</string>
</property>
</action>
<action name="actionStickyNoteNote">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Note</string>
</property>
</action>
<action name="actionStickyNoteParagraph">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Paragraph</string>
</property>
</action>
<action name="actionCreateHyperlink">
<property name="checkable">
<bool>true</bool>
</property>
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/hyperlink.svg</normaloff>:/resources/hyperlink.svg</iconset>
</property>
<property name="text">
<string>Hyperlink</string>
</property>
</action>
<action name="actionInlineText">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Inline text</string>
</property>
</action>
<action name="actionCreateStraightLine">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Straight Line</string>
</property>
</action>
<action name="actionCreatePolyline">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Polyline</string>
</property>
</action>
<action name="actionCreatePolygon">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Polygon</string>
</property>
</action>
<action name="actionCreateEllipse">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Ellipse</string>
</property>
</action>
<action name="actionCreateFreehandCurve">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Freehand Curve</string>
</property>
</action>
<action name="actionCreateTextHighlight">
<property name="checkable">
<bool>true</bool>
</property>
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/highlight.svg</normaloff>:/resources/highlight.svg</iconset>
</property>
<property name="text">
<string>Highlight</string>
</property>
</action>
<action name="actionCreateTextUnderline">
<property name="checkable">
<bool>true</bool>
</property>
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/underline.svg</normaloff>:/resources/underline.svg</iconset>
</property>
<property name="text">
<string>Underline</string>
</property>
</action>
<action name="actionCreateTextStrikeout">
<property name="checkable">
<bool>true</bool>
</property>
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/strikeout.svg</normaloff>:/resources/strikeout.svg</iconset>
</property>
<property name="text">
<string>Strikeout</string>
</property>
</action>
<action name="actionCreateTextSquiggly">
<property name="checkable">
<bool>true</bool>
</property>
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/squiggly.svg</normaloff>:/resources/squiggly.svg</iconset>
</property>
<property name="text">
<string>Squiggly</string>
</property>
</action>
<action name="actionGoToDocumentStart">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/previous-start.svg</normaloff>:/resources/previous-start.svg</iconset>
</property>
<property name="text">
<string>Go to document start</string>
</property>
</action>
<action name="actionGoToDocumentEnd">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/next-end.svg</normaloff>:/resources/next-end.svg</iconset>
</property>
<property name="text">
<string>Go to document end</string>
</property>
</action>
<action name="actionGoToNextPage">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/next-page.svg</normaloff>:/resources/next-page.svg</iconset>
</property>
<property name="text">
<string>Go to next page</string>
</property>
</action>
<action name="actionGoToPreviousPage">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/previous-page.svg</normaloff>:/resources/previous-page.svg</iconset>
</property>
<property name="text">
<string>Go to previous page</string>
</property>
</action>
<action name="actionGoToNextLine">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/next.svg</normaloff>:/resources/next.svg</iconset>
</property>
<property name="text">
<string>Go to next line</string>
</property>
</action>
<action name="actionGoToPreviousLine">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/previous.svg</normaloff>:/resources/previous.svg</iconset>
</property>
<property name="text">
<string>Go to previous line</string>
</property>
</action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources>
<include location="pdfforqtviewer.qrc"/>
</resources>
<connections/>
</ui>

View File

@@ -0,0 +1,273 @@
// Copyright (C) 2019-2020 Jakub Melka
//
// This file is part of Pdf4Qt.
//
// Pdf4Qt is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Pdf4Qt is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with Pdf4Qt. If not, see <https://www.gnu.org/licenses/>.
#include "pdfviewersettings.h"
#include "pdfconstants.h"
#include <QPixmapCache>
namespace pdfviewer
{
const int PIXMAP_CACHE_LIMIT = QPixmapCache::cacheLimit();
void PDFViewerSettings::setSettings(const PDFViewerSettings::Settings& settings)
{
if (m_settings != settings)
{
m_settings = settings;
emit settingsChanged();
}
}
void PDFViewerSettings::readSettings(QSettings& settings, const pdf::PDFCMSSettings& defaultCMSSettings)
{
Settings defaultSettings;
settings.beginGroup("ViewerSettings");
m_settings.m_directory = settings.value("defaultDirectory", QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)).toString();
m_settings.m_features = static_cast<pdf::PDFRenderer::Features>(settings.value("rendererFeatures", static_cast<int>(pdf::PDFRenderer::getDefaultFeatures())).toInt());
m_settings.m_rendererEngine = static_cast<pdf::RendererEngine>(settings.value("renderingEngine", static_cast<int>(pdf::RendererEngine::OpenGL)).toInt());
m_settings.m_multisampleAntialiasing = settings.value("msaa", defaultSettings.m_multisampleAntialiasing).toBool();
m_settings.m_rendererSamples = settings.value("rendererSamples", defaultSettings.m_rendererSamples).toInt();
m_settings.m_prefetchPages = settings.value("prefetchPages", defaultSettings.m_prefetchPages).toBool();
m_settings.m_preferredMeshResolutionRatio = settings.value("preferredMeshResolutionRatio", defaultSettings.m_preferredMeshResolutionRatio).toDouble();
m_settings.m_minimalMeshResolutionRatio = settings.value("minimalMeshResolutionRatio", defaultSettings.m_minimalMeshResolutionRatio).toDouble();
m_settings.m_colorTolerance = settings.value("colorTolerance", defaultSettings.m_colorTolerance).toDouble();
m_settings.m_compiledPageCacheLimit = settings.value("compiledPageCacheLimit", defaultSettings.m_compiledPageCacheLimit).toInt();
m_settings.m_thumbnailsCacheLimit = settings.value("thumbnailsCacheLimit", defaultSettings.m_thumbnailsCacheLimit).toInt();
m_settings.m_fontCacheLimit = settings.value("fontCacheLimit", defaultSettings.m_fontCacheLimit).toInt();
m_settings.m_instancedFontCacheLimit = settings.value("instancedFontCacheLimit", defaultSettings.m_instancedFontCacheLimit).toInt();
m_settings.m_allowLaunchApplications = settings.value("allowLaunchApplications", defaultSettings.m_allowLaunchApplications).toBool();
m_settings.m_allowLaunchURI = settings.value("allowLaunchURI", defaultSettings.m_allowLaunchURI).toBool();
m_settings.m_multithreadingStrategy = static_cast<pdf::PDFExecutionPolicy::Strategy>(settings.value("multithreadingStrategy", static_cast<int>(defaultSettings.m_multithreadingStrategy)).toInt());
m_settings.m_magnifierSize = settings.value("magnifierSize", defaultSettings.m_magnifierSize).toInt();
m_settings.m_magnifierZoom = settings.value("magnifierZoom", defaultSettings.m_magnifierZoom).toDouble();
m_settings.m_maximumUndoSteps = settings.value("maximumUndoSteps", defaultSettings.m_maximumUndoSteps).toInt();
m_settings.m_maximumRedoSteps = settings.value("maximumRedoSteps", defaultSettings.m_maximumRedoSteps).toInt();
settings.endGroup();
settings.beginGroup("ColorManagementSystemSettings");
m_colorManagementSystemSettings.system = static_cast<pdf::PDFCMSSettings::System>(settings.value("system", int(defaultCMSSettings.system)).toInt());
m_colorManagementSystemSettings.accuracy = static_cast<pdf::PDFCMSSettings::Accuracy>(settings.value("accuracy", int(defaultCMSSettings.accuracy)).toInt());
m_colorManagementSystemSettings.intent = static_cast<pdf::RenderingIntent>(settings.value("intent", int(defaultCMSSettings.intent)).toInt());
m_colorManagementSystemSettings.isBlackPointCompensationActive = settings.value("isBlackPointCompensationActive", defaultCMSSettings.isBlackPointCompensationActive).toBool();
m_colorManagementSystemSettings.isWhitePaperColorTransformed = settings.value("isWhitePaperColorTransformed", defaultCMSSettings.isWhitePaperColorTransformed).toBool();
m_colorManagementSystemSettings.outputCS = settings.value("outputCS", defaultCMSSettings.outputCS).toString();
m_colorManagementSystemSettings.deviceGray = settings.value("deviceGray", defaultCMSSettings.deviceGray).toString();
m_colorManagementSystemSettings.deviceRGB = settings.value("deviceRGB", defaultCMSSettings.deviceRGB).toString();
m_colorManagementSystemSettings.deviceCMYK = settings.value("deviceCMYK", defaultCMSSettings.deviceCMYK).toString();
m_colorManagementSystemSettings.profileDirectory = settings.value("profileDirectory", defaultCMSSettings.profileDirectory).toString();
settings.endGroup();
settings.beginGroup("SpeechSettings");
m_settings.m_speechEngine = settings.value("speechEngine", defaultSettings.m_speechEngine).toString();
m_settings.m_speechLocale = settings.value("speechLocale", defaultSettings.m_speechLocale).toString();
m_settings.m_speechVoice = settings.value("speechVoice", defaultSettings.m_speechVoice).toString();
m_settings.m_speechRate = settings.value("speechRate", defaultSettings.m_speechRate).toDouble();
m_settings.m_speechPitch = settings.value("speechPitch", defaultSettings.m_speechPitch).toDouble();
m_settings.m_speechVolume = settings.value("speechVolume", defaultSettings.m_speechVolume).toDouble();
settings.endGroup();
settings.beginGroup("Forms");
m_settings.m_formAppearanceFlags = static_cast<pdf::PDFFormManager::FormAppearanceFlags>(settings.value("formAppearance", int(pdf::PDFFormManager::getDefaultApperanceFlags())).toInt());
settings.endGroup();
settings.beginGroup("Signature");
m_settings.m_signatureVerificationEnabled = settings.value("signatureVerificationEnabled", defaultSettings.m_signatureVerificationEnabled).toBool();
m_settings.m_signatureTreatWarningsAsErrors = settings.value("signatureTreatWarningsAsErrors", defaultSettings.m_signatureTreatWarningsAsErrors).toBool();
m_settings.m_signatureIgnoreCertificateValidityTime = settings.value("signatureIgnoreCertificateValidityTime", defaultSettings.m_signatureIgnoreCertificateValidityTime).toBool();
m_settings.m_signatureUseSystemStore = settings.value("signatureUseSystemStore", defaultSettings.m_signatureUseSystemStore).toBool();
settings.endGroup();
emit settingsChanged();
}
void PDFViewerSettings::writeSettings(QSettings& settings)
{
settings.beginGroup("ViewerSettings");
settings.setValue("defaultDirectory", m_settings.m_directory);
settings.setValue("rendererFeatures", static_cast<int>(m_settings.m_features));
settings.setValue("renderingEngine", static_cast<int>(m_settings.m_rendererEngine));
settings.setValue("msaa", m_settings.m_multisampleAntialiasing);
settings.setValue("rendererSamples", m_settings.m_rendererSamples);
settings.setValue("prefetchPages", m_settings.m_prefetchPages);
settings.setValue("preferredMeshResolutionRatio", m_settings.m_preferredMeshResolutionRatio);
settings.setValue("minimalMeshResolutionRatio", m_settings.m_minimalMeshResolutionRatio);
settings.setValue("colorTolerance", m_settings.m_colorTolerance);
settings.setValue("compiledPageCacheLimit", m_settings.m_compiledPageCacheLimit);
settings.setValue("thumbnailsCacheLimit", m_settings.m_thumbnailsCacheLimit);
settings.setValue("fontCacheLimit", m_settings.m_fontCacheLimit);
settings.setValue("instancedFontCacheLimit", m_settings.m_instancedFontCacheLimit);
settings.setValue("allowLaunchApplications", m_settings.m_allowLaunchApplications);
settings.setValue("allowLaunchURI", m_settings.m_allowLaunchURI);
settings.setValue("multithreadingStrategy", static_cast<int>(m_settings.m_multithreadingStrategy));
settings.setValue("magnifierSize", m_settings.m_magnifierSize);
settings.setValue("magnifierZoom", m_settings.m_magnifierZoom);
settings.setValue("maximumUndoSteps", m_settings.m_maximumUndoSteps);
settings.setValue("maximumRedoSteps", m_settings.m_maximumRedoSteps);
settings.endGroup();
settings.beginGroup("ColorManagementSystemSettings");
settings.setValue("system", int(m_colorManagementSystemSettings.system));
settings.setValue("accuracy", int(m_colorManagementSystemSettings.accuracy));
settings.setValue("intent", int(m_colorManagementSystemSettings.intent));
settings.setValue("isBlackPointCompensationActive", m_colorManagementSystemSettings.isBlackPointCompensationActive);
settings.setValue("isWhitePaperColorTransformed", m_colorManagementSystemSettings.isWhitePaperColorTransformed);
settings.setValue("outputCS", m_colorManagementSystemSettings.outputCS);
settings.setValue("deviceGray", m_colorManagementSystemSettings.deviceGray);
settings.setValue("deviceRGB", m_colorManagementSystemSettings.deviceRGB);
settings.setValue("deviceCMYK", m_colorManagementSystemSettings.deviceCMYK);
settings.setValue("profileDirectory", m_colorManagementSystemSettings.profileDirectory);
settings.endGroup();
settings.beginGroup("SpeechSettings");
settings.setValue("speechEngine", m_settings.m_speechEngine);
settings.setValue("speechLocale", m_settings.m_speechLocale);
settings.setValue("speechVoice", m_settings.m_speechVoice);
settings.setValue("speechRate", m_settings.m_speechRate);
settings.setValue("speechPitch", m_settings.m_speechPitch);
settings.setValue("speechVolume", m_settings.m_speechVolume);
settings.endGroup();
settings.beginGroup("Forms");
settings.setValue("formAppearance", int(m_settings.m_formAppearanceFlags));
settings.endGroup();
settings.beginGroup("Signature");
settings.setValue("signatureVerificationEnabled", m_settings.m_signatureVerificationEnabled);
settings.setValue("signatureTreatWarningsAsErrors", m_settings.m_signatureTreatWarningsAsErrors);
settings.setValue("signatureIgnoreCertificateValidityTime", m_settings.m_signatureIgnoreCertificateValidityTime);
settings.setValue("signatureUseSystemStore", m_settings.m_signatureUseSystemStore);
settings.endGroup();
}
QString PDFViewerSettings::getDirectory() const
{
return m_settings.m_directory;
}
void PDFViewerSettings::setDirectory(const QString& directory)
{
if (m_settings.m_directory != directory)
{
m_settings.m_directory = directory;
emit settingsChanged();
}
}
pdf::PDFRenderer::Features PDFViewerSettings::getFeatures() const
{
return m_settings.m_features;
}
void PDFViewerSettings::setFeatures(const pdf::PDFRenderer::Features& features)
{
if (m_settings.m_features != features)
{
m_settings.m_features = features;
emit settingsChanged();
}
}
pdf::RendererEngine PDFViewerSettings::getRendererEngine() const
{
return m_settings.m_rendererEngine;
}
void PDFViewerSettings::setRendererEngine(pdf::RendererEngine rendererEngine)
{
if (m_settings.m_rendererEngine != rendererEngine)
{
m_settings.m_rendererEngine = rendererEngine;
emit settingsChanged();
}
}
int PDFViewerSettings::getRendererSamples() const
{
return m_settings.m_rendererSamples;
}
void PDFViewerSettings::setRendererSamples(int rendererSamples)
{
if (m_settings.m_rendererSamples != rendererSamples)
{
m_settings.m_rendererSamples = rendererSamples;
emit settingsChanged();
}
}
void PDFViewerSettings::setPreferredMeshResolutionRatio(pdf::PDFReal preferredMeshResolutionRatio)
{
if (m_settings.m_preferredMeshResolutionRatio != preferredMeshResolutionRatio)
{
m_settings.m_preferredMeshResolutionRatio = preferredMeshResolutionRatio;
emit settingsChanged();
}
}
void PDFViewerSettings::setMinimalMeshResolutionRatio(pdf::PDFReal minimalMeshResolutionRatio)
{
if (m_settings.m_minimalMeshResolutionRatio != minimalMeshResolutionRatio)
{
m_settings.m_minimalMeshResolutionRatio = minimalMeshResolutionRatio;
emit settingsChanged();
}
}
void PDFViewerSettings::setColorTolerance(pdf::PDFReal colorTolerance)
{
if (m_settings.m_colorTolerance != colorTolerance)
{
m_settings.m_colorTolerance = colorTolerance;
emit settingsChanged();
}
}
PDFViewerSettings::Settings::Settings() :
m_features(pdf::PDFRenderer::getDefaultFeatures()),
m_rendererEngine(pdf::RendererEngine::OpenGL),
m_multisampleAntialiasing(true),
m_rendererSamples(16),
m_prefetchPages(true),
m_preferredMeshResolutionRatio(0.02),
m_minimalMeshResolutionRatio(0.005),
m_colorTolerance(0.01),
m_allowLaunchApplications(true),
m_allowLaunchURI(true),
m_compiledPageCacheLimit(128 * 1024),
m_thumbnailsCacheLimit(PIXMAP_CACHE_LIMIT),
m_fontCacheLimit(pdf::DEFAULT_FONT_CACHE_LIMIT),
m_instancedFontCacheLimit(pdf::DEFAULT_REALIZED_FONT_CACHE_LIMIT),
m_multithreadingStrategy(pdf::PDFExecutionPolicy::Strategy::AlwaysMultithreaded),
m_speechRate(0.0),
m_speechPitch(0.0),
m_speechVolume(1.0),
m_magnifierSize(100),
m_magnifierZoom(2.0),
m_maximumUndoSteps(5),
m_maximumRedoSteps(5),
m_formAppearanceFlags(pdf::PDFFormManager::getDefaultApperanceFlags()),
m_signatureVerificationEnabled(true),
m_signatureTreatWarningsAsErrors(false),
m_signatureIgnoreCertificateValidityTime(false),
m_signatureUseSystemStore(true)
{
}
} // namespace pdfviewer

View File

@@ -0,0 +1,144 @@
// Copyright (C) 2019-2020 Jakub Melka
//
// This file is part of Pdf4Qt.
//
// Pdf4Qt is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Pdf4Qt is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with Pdf4Qt. If not, see <https://www.gnu.org/licenses/>.
#ifndef PDFVIEWERSETTINGS_H
#define PDFVIEWERSETTINGS_H
#include "pdfrenderer.h"
#include "pdfcms.h"
#include "pdfexecutionpolicy.h"
#include "pdfform.h"
#include <QObject>
namespace pdfviewer
{
class PDFViewerSettings : public QObject
{
Q_OBJECT
public:
inline explicit PDFViewerSettings(QObject* parent) :
QObject(parent)
{
}
struct Settings
{
Settings();
bool operator==(const Settings&) const = default;
bool operator!=(const Settings&) const = default;
pdf::PDFRenderer::Features m_features;
QString m_directory;
pdf::RendererEngine m_rendererEngine;
bool m_multisampleAntialiasing;
int m_rendererSamples;
bool m_prefetchPages;
pdf::PDFReal m_preferredMeshResolutionRatio;
pdf::PDFReal m_minimalMeshResolutionRatio;
pdf::PDFReal m_colorTolerance;
bool m_allowLaunchApplications;
bool m_allowLaunchURI;
pdf::PDFExecutionPolicy::Strategy m_multithreadingStrategy;
// Cache settings
int m_compiledPageCacheLimit;
int m_thumbnailsCacheLimit;
int m_fontCacheLimit;
int m_instancedFontCacheLimit;
// Speech settings
QString m_speechEngine;
QString m_speechLocale;
QString m_speechVoice;
double m_speechRate;
double m_speechPitch;
double m_speechVolume;
// Magnifier tool settings
int m_magnifierSize;
double m_magnifierZoom;
// Undo/redo steps settings
int m_maximumUndoSteps;
int m_maximumRedoSteps;
// Form settings
pdf::PDFFormManager::FormAppearanceFlags m_formAppearanceFlags;
// Signature settings
bool m_signatureVerificationEnabled;
bool m_signatureTreatWarningsAsErrors;
bool m_signatureIgnoreCertificateValidityTime;
bool m_signatureUseSystemStore;
};
const Settings& getSettings() const { return m_settings; }
void setSettings(const Settings& settings);
void readSettings(QSettings& settings, const pdf::PDFCMSSettings& defaultCMSSettings);
void writeSettings(QSettings& settings);
QString getDirectory() const;
void setDirectory(const QString& directory);
pdf::PDFRenderer::Features getFeatures() const;
void setFeatures(const pdf::PDFRenderer::Features& features);
pdf::RendererEngine getRendererEngine() const;
void setRendererEngine(pdf::RendererEngine rendererEngine);
int getRendererSamples() const;
void setRendererSamples(int rendererSamples);
bool isPagePrefetchingEnabled() const { return m_settings.m_prefetchPages; }
bool isMultisampleAntialiasingEnabled() const { return m_settings.m_multisampleAntialiasing; }
pdf::PDFReal getPreferredMeshResolutionRatio() const { return m_settings.m_preferredMeshResolutionRatio; }
void setPreferredMeshResolutionRatio(pdf::PDFReal preferredMeshResolutionRatio);
pdf::PDFReal getMinimalMeshResolutionRatio() const { return m_settings.m_minimalMeshResolutionRatio; }
void setMinimalMeshResolutionRatio(pdf::PDFReal minimalMeshResolutionRatio);
pdf::PDFReal getColorTolerance() const { return m_settings.m_colorTolerance; }
void setColorTolerance(pdf::PDFReal colorTolerance);
int getCompiledPageCacheLimit() const { return m_settings.m_compiledPageCacheLimit; }
int getThumbnailsCacheLimit() const { return m_settings.m_thumbnailsCacheLimit; }
int getFontCacheLimit() const { return m_settings.m_fontCacheLimit; }
int getInstancedFontCacheLimit() const { return m_settings.m_instancedFontCacheLimit; }
const pdf::PDFCMSSettings& getColorManagementSystemSettings() const { return m_colorManagementSystemSettings; }
void setColorManagementSystemSettings(const pdf::PDFCMSSettings& settings) { m_colorManagementSystemSettings = settings; }
pdf::PDFExecutionPolicy::Strategy getMultithreadingStrategy() const { return m_settings.m_multithreadingStrategy; }
signals:
void settingsChanged();
private:
Settings m_settings;
pdf::PDFCMSSettings m_colorManagementSystemSettings;
};
} // namespace pdfviewer
#endif // PDFVIEWERSETTINGS_H

View File

@@ -0,0 +1,893 @@
// Copyright (C) 2019-2020 Jakub Melka
//
// This file is part of Pdf4Qt.
//
// Pdf4Qt is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Pdf4Qt is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with Pdf4Qt. If not, see <https://www.gnu.org/licenses/>.
#include "pdfviewersettingsdialog.h"
#include "ui_pdfviewersettingsdialog.h"
#include "pdfglobal.h"
#include "pdfutils.h"
#include "pdfrecentfilemanager.h"
#include <QAction>
#include <QLineEdit>
#include <QMessageBox>
#include <QFileDialog>
#include <QListWidgetItem>
#include <QTextToSpeech>
#include <QNetworkReply>
#include <QNetworkAccessManager>
#include <QDomDocument>
namespace pdfviewer
{
PDFViewerSettingsDialog::PDFViewerSettingsDialog(const PDFViewerSettings::Settings& settings,
const pdf::PDFCMSSettings& cmsSettings,
const OtherSettings& otherSettings,
const pdf::PDFCertificateStore& certificateStore,
const std::vector<QAction*>& actions,
pdf::PDFCMSManager* cmsManager,
const QStringList& enabledPlugins,
const pdf::PDFPluginInfos& plugins,
QWidget* parent) :
QDialog(parent),
ui(new Ui::PDFViewerSettingsDialog),
m_settings(settings),
m_cmsSettings(cmsSettings),
m_otherSettings(otherSettings),
m_certificateStore(certificateStore),
m_actions(),
m_isLoadingData(false),
m_enabledPlugins(enabledPlugins),
m_plugins(plugins),
m_networkAccessManager(nullptr),
m_downloadCertificatesFromEUTLReply(nullptr)
{
ui->setupUi(this);
m_textToSpeechEngines = QTextToSpeech::availableEngines();
new QListWidgetItem(QIcon(":/resources/engine.svg"), tr("Engine"), ui->optionsPagesWidget, EngineSettings);
new QListWidgetItem(QIcon(":/resources/rendering.svg"), tr("Rendering"), ui->optionsPagesWidget, RenderingSettings);
new QListWidgetItem(QIcon(":/resources/shading.svg"), tr("Shading"), ui->optionsPagesWidget, ShadingSettings);
new QListWidgetItem(QIcon(":/resources/cache.svg"), tr("Cache"), ui->optionsPagesWidget, CacheSettings);
new QListWidgetItem(QIcon(":/resources/shortcuts.svg"), tr("Shortcuts"), ui->optionsPagesWidget, ShortcutSettings);
new QListWidgetItem(QIcon(":/resources/cms.svg"), tr("Colors"), ui->optionsPagesWidget, ColorManagementSystemSettings);
new QListWidgetItem(QIcon(":/resources/security.svg"), tr("Security"), ui->optionsPagesWidget, SecuritySettings);
new QListWidgetItem(QIcon(":/resources/ui.svg"), tr("UI"), ui->optionsPagesWidget, UISettings);
new QListWidgetItem(QIcon(":/resources/speech.svg"), tr("Speech"), ui->optionsPagesWidget, SpeechSettings);
new QListWidgetItem(QIcon(":/resources/form-settings.svg"), tr("Forms"), ui->optionsPagesWidget, FormSettings);
new QListWidgetItem(QIcon(":/resources/signature.svg"), tr("Signature"), ui->optionsPagesWidget, SignatureSettings);
new QListWidgetItem(QIcon(":/resources/plugins.svg"), tr("Plugins"), ui->optionsPagesWidget, PluginsSettings);
ui->renderingEngineComboBox->addItem(tr("Software"), static_cast<int>(pdf::RendererEngine::Software));
ui->renderingEngineComboBox->addItem(tr("Hardware accelerated (OpenGL)"), static_cast<int>(pdf::RendererEngine::OpenGL));
for (int i : { 1, 2, 4, 8, 16 })
{
ui->multisampleAntialiasingSamplesCountComboBox->addItem(QString::number(i), i);
}
ui->multithreadingComboBox->addItem(tr("Single thread"), static_cast<int>(pdf::PDFExecutionPolicy::Strategy::SingleThreaded));
ui->multithreadingComboBox->addItem(tr("Multithreading (load balanced)"), static_cast<int>(pdf::PDFExecutionPolicy::Strategy::PageMultithreaded));
ui->multithreadingComboBox->addItem(tr("Multithreading (maximum threads)"), static_cast<int>(pdf::PDFExecutionPolicy::Strategy::AlwaysMultithreaded));
ui->maximumRecentFileCountEdit->setMinimum(PDFRecentFileManager::getMinimumRecentFiles());
ui->maximumRecentFileCountEdit->setMaximum(PDFRecentFileManager::getMaximumRecentFiles());
// Load CMS data
ui->cmsTypeComboBox->addItem(pdf::PDFCMSManager::getSystemName(pdf::PDFCMSSettings::System::Generic), int(pdf::PDFCMSSettings::System::Generic));
ui->cmsTypeComboBox->addItem(pdf::PDFCMSManager::getSystemName(pdf::PDFCMSSettings::System::LittleCMS2), int(pdf::PDFCMSSettings::System::LittleCMS2));
ui->cmsRenderingIntentComboBox->addItem(tr("Auto"), int(pdf::RenderingIntent::Auto));
ui->cmsRenderingIntentComboBox->addItem(tr("Perceptual"), int(pdf::RenderingIntent::Perceptual));
ui->cmsRenderingIntentComboBox->addItem(tr("Relative colorimetric"), int(pdf::RenderingIntent::RelativeColorimetric));
ui->cmsRenderingIntentComboBox->addItem(tr("Absolute colorimetric"), int(pdf::RenderingIntent::AbsoluteColorimetric));
ui->cmsRenderingIntentComboBox->addItem(tr("Saturation"), int(pdf::RenderingIntent::Saturation));
ui->cmsAccuracyComboBox->addItem(tr("Low"), int(pdf::PDFCMSSettings::Accuracy::Low));
ui->cmsAccuracyComboBox->addItem(tr("Medium"), int(pdf::PDFCMSSettings::Accuracy::Medium));
ui->cmsAccuracyComboBox->addItem(tr("High"), int(pdf::PDFCMSSettings::Accuracy::High));
auto fillColorProfileList = [](QComboBox* comboBox, const pdf::PDFColorProfileIdentifiers& identifiers)
{
for (const pdf::PDFColorProfileIdentifier& identifier : identifiers)
{
comboBox->addItem(identifier.name, identifier.id);
}
};
fillColorProfileList(ui->cmsOutputColorProfileComboBox, cmsManager->getOutputProfiles());
fillColorProfileList(ui->cmsDeviceGrayColorProfileComboBox, cmsManager->getGrayProfiles());
fillColorProfileList(ui->cmsDeviceRGBColorProfileComboBox, cmsManager->getRGBProfiles());
fillColorProfileList(ui->cmsDeviceCMYKColorProfileComboBox, cmsManager->getCMYKProfiles());
for (QWidget* widget : { ui->engineInfoLabel, ui->renderingInfoLabel, ui->securityInfoLabel, ui->cmsInfoLabel })
{
widget->setMinimumWidth(widget->sizeHint().width());
}
for (QCheckBox* checkBox : findChildren<QCheckBox*>())
{
connect(checkBox, &QCheckBox::clicked, this, &PDFViewerSettingsDialog::saveData);
}
for (QComboBox* comboBox : findChildren<QComboBox*>())
{
connect(comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &PDFViewerSettingsDialog::saveData);
}
for (QDoubleSpinBox* spinBox : findChildren<QDoubleSpinBox*>())
{
connect(spinBox, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &PDFViewerSettingsDialog::saveData);
}
for (QSpinBox* spinBox : findChildren<QSpinBox*>())
{
connect(spinBox, QOverload<int>::of(&QSpinBox::valueChanged), this, &PDFViewerSettingsDialog::saveData);
}
for (QLineEdit* lineEdit : findChildren<QLineEdit*>())
{
connect(lineEdit, &QLineEdit::editingFinished, this, &PDFViewerSettingsDialog::saveData);
}
for (QAction* action : actions)
{
if (!action->objectName().isEmpty())
{
m_actions.append(action);
}
}
// Text to speech
for (const QString& engine : m_textToSpeechEngines)
{
ui->speechEnginesComboBox->addItem(engine, engine);
}
connect(ui->trustedCertificateStoreTableWidget, &QTableWidget::itemSelectionChanged, this, &PDFViewerSettingsDialog::updateTrustedCertificatesTableActions);
connect(ui->pluginsTableWidget, &QTableWidget::itemSelectionChanged, this, &PDFViewerSettingsDialog::updatePluginInformation);
ui->optionsPagesWidget->setCurrentRow(0);
adjustSize();
loadData();
loadActionShortcutsTable();
loadPluginsTable();
updateTrustedCertificatesTable();
updateTrustedCertificatesTableActions();
}
PDFViewerSettingsDialog::~PDFViewerSettingsDialog()
{
delete ui;
}
void PDFViewerSettingsDialog::on_optionsPagesWidget_currentItemChanged(QListWidgetItem* current, QListWidgetItem* previous)
{
Q_UNUSED(previous);
switch (current->type())
{
case EngineSettings:
ui->stackedWidget->setCurrentWidget(ui->enginePage);
break;
case RenderingSettings:
ui->stackedWidget->setCurrentWidget(ui->renderingPage);
break;
case ShadingSettings:
ui->stackedWidget->setCurrentWidget(ui->shadingPage);
break;
case CacheSettings:
ui->stackedWidget->setCurrentWidget(ui->cachePage);
break;
case ShortcutSettings:
ui->stackedWidget->setCurrentWidget(ui->shortcutsPage);
break;
case ColorManagementSystemSettings:
ui->stackedWidget->setCurrentWidget(ui->cmsPage);
break;
case SecuritySettings:
ui->stackedWidget->setCurrentWidget(ui->securityPage);
break;
case UISettings:
ui->stackedWidget->setCurrentWidget(ui->uiPage);
break;
case SpeechSettings:
ui->stackedWidget->setCurrentWidget(ui->speechPage);
break;
case FormSettings:
ui->stackedWidget->setCurrentWidget(ui->formPage);
break;
case SignatureSettings:
ui->stackedWidget->setCurrentWidget(ui->signaturePage);
break;
case PluginsSettings:
ui->stackedWidget->setCurrentWidget(ui->pluginsPage);
break;
default:
Q_ASSERT(false);
break;
}
}
void PDFViewerSettingsDialog::loadData()
{
pdf::PDFTemporaryValueChange guard(&m_isLoadingData, true);
ui->renderingEngineComboBox->setCurrentIndex(ui->renderingEngineComboBox->findData(static_cast<int>(m_settings.m_rendererEngine)));
// Engine
if (m_settings.m_rendererEngine == pdf::RendererEngine::OpenGL)
{
ui->multisampleAntialiasingCheckBox->setEnabled(true);
ui->multisampleAntialiasingCheckBox->setChecked(m_settings.m_multisampleAntialiasing);
if (m_settings.m_multisampleAntialiasing)
{
ui->multisampleAntialiasingSamplesCountComboBox->setEnabled(true);
ui->multisampleAntialiasingSamplesCountComboBox->setCurrentIndex(ui->multisampleAntialiasingSamplesCountComboBox->findData(m_settings.m_rendererSamples));
}
else
{
ui->multisampleAntialiasingSamplesCountComboBox->setEnabled(false);
ui->multisampleAntialiasingSamplesCountComboBox->setCurrentIndex(-1);
}
}
else
{
ui->multisampleAntialiasingCheckBox->setEnabled(false);
ui->multisampleAntialiasingCheckBox->setChecked(false);
ui->multisampleAntialiasingSamplesCountComboBox->setEnabled(false);
ui->multisampleAntialiasingSamplesCountComboBox->setCurrentIndex(-1);
}
ui->prefetchPagesCheckBox->setChecked(m_settings.m_prefetchPages);
ui->multithreadingComboBox->setCurrentIndex(ui->multithreadingComboBox->findData(static_cast<int>(m_settings.m_multithreadingStrategy)));
// Rendering
ui->antialiasingCheckBox->setChecked(m_settings.m_features.testFlag(pdf::PDFRenderer::Antialiasing));
ui->textAntialiasingCheckBox->setChecked(m_settings.m_features.testFlag(pdf::PDFRenderer::TextAntialiasing));
ui->smoothPicturesCheckBox->setChecked(m_settings.m_features.testFlag(pdf::PDFRenderer::SmoothImages));
ui->ignoreOptionalContentCheckBox->setChecked(m_settings.m_features.testFlag(pdf::PDFRenderer::IgnoreOptionalContent));
ui->clipToCropBoxCheckBox->setChecked(m_settings.m_features.testFlag(pdf::PDFRenderer::ClipToCropBox));
ui->displayTimeCheckBox->setChecked(m_settings.m_features.testFlag(pdf::PDFRenderer::DisplayTimes));
ui->displayAnnotationsCheckBox->setChecked(m_settings.m_features.testFlag(pdf::PDFRenderer::DisplayAnnotations));
// Shading
ui->preferredMeshResolutionEdit->setValue(m_settings.m_preferredMeshResolutionRatio);
ui->minimalMeshResolutionEdit->setValue(m_settings.m_minimalMeshResolutionRatio);
ui->colorToleranceEdit->setValue(m_settings.m_colorTolerance);
// Cache
ui->compiledPageCacheSizeEdit->setValue(m_settings.m_compiledPageCacheLimit);
ui->thumbnailCacheSizeEdit->setValue(m_settings.m_thumbnailsCacheLimit);
ui->cachedFontLimitEdit->setValue(m_settings.m_fontCacheLimit);
ui->cachedInstancedFontLimitEdit->setValue(m_settings.m_instancedFontCacheLimit);
// Security
ui->allowLaunchCheckBox->setChecked(m_settings.m_allowLaunchApplications);
ui->allowRunURICheckBox->setChecked(m_settings.m_allowLaunchURI);
// UI
ui->maximumRecentFileCountEdit->setValue(m_otherSettings.maximumRecentFileCount);
ui->magnifierSizeEdit->setValue(m_settings.m_magnifierSize);
ui->magnifierZoomEdit->setValue(m_settings.m_magnifierZoom);
ui->maximumUndoStepsEdit->setValue(m_settings.m_maximumUndoSteps);
ui->maximumRedoStepsEdit->setValue(m_settings.m_maximumRedoSteps);
// CMS
ui->cmsTypeComboBox->setCurrentIndex(ui->cmsTypeComboBox->findData(int(m_cmsSettings.system)));
if (m_cmsSettings.system != pdf::PDFCMSSettings::System::Generic)
{
ui->cmsRenderingIntentComboBox->setEnabled(true);
ui->cmsRenderingIntentComboBox->setCurrentIndex(ui->cmsRenderingIntentComboBox->findData(int(m_cmsSettings.intent)));
ui->cmsAccuracyComboBox->setEnabled(true);
ui->cmsAccuracyComboBox->setCurrentIndex(ui->cmsAccuracyComboBox->findData(int(m_cmsSettings.accuracy)));
ui->cmsIsBlackPointCompensationCheckBox->setEnabled(true);
ui->cmsIsBlackPointCompensationCheckBox->setChecked(m_cmsSettings.isBlackPointCompensationActive);
ui->cmsWhitePaperColorTransformedCheckBox->setEnabled(true);
ui->cmsWhitePaperColorTransformedCheckBox->setChecked(m_cmsSettings.isWhitePaperColorTransformed);
ui->cmsOutputColorProfileComboBox->setEnabled(true);
ui->cmsOutputColorProfileComboBox->setCurrentIndex(ui->cmsOutputColorProfileComboBox->findData(m_cmsSettings.outputCS));
ui->cmsDeviceGrayColorProfileComboBox->setEnabled(true);
ui->cmsDeviceGrayColorProfileComboBox->setCurrentIndex(ui->cmsDeviceGrayColorProfileComboBox->findData(m_cmsSettings.deviceGray));
ui->cmsDeviceRGBColorProfileComboBox->setEnabled(true);
ui->cmsDeviceRGBColorProfileComboBox->setCurrentIndex(ui->cmsDeviceRGBColorProfileComboBox->findData(m_cmsSettings.deviceRGB));
ui->cmsDeviceCMYKColorProfileComboBox->setEnabled(true);
ui->cmsDeviceCMYKColorProfileComboBox->setCurrentIndex(ui->cmsDeviceCMYKColorProfileComboBox->findData(m_cmsSettings.deviceCMYK));
ui->cmsProfileDirectoryButton->setEnabled(true);
ui->cmsProfileDirectoryEdit->setEnabled(true);
ui->cmsProfileDirectoryEdit->setText(m_cmsSettings.profileDirectory);
}
else
{
ui->cmsRenderingIntentComboBox->setEnabled(false);
ui->cmsRenderingIntentComboBox->setCurrentIndex(-1);
ui->cmsAccuracyComboBox->setEnabled(false);
ui->cmsAccuracyComboBox->setCurrentIndex(-1);
ui->cmsIsBlackPointCompensationCheckBox->setEnabled(false);
ui->cmsIsBlackPointCompensationCheckBox->setChecked(false);
ui->cmsWhitePaperColorTransformedCheckBox->setEnabled(false);
ui->cmsWhitePaperColorTransformedCheckBox->setChecked(false);
ui->cmsOutputColorProfileComboBox->setEnabled(false);
ui->cmsOutputColorProfileComboBox->setCurrentIndex(-1);
ui->cmsDeviceGrayColorProfileComboBox->setEnabled(false);
ui->cmsDeviceGrayColorProfileComboBox->setCurrentIndex(-1);
ui->cmsDeviceRGBColorProfileComboBox->setEnabled(false);
ui->cmsDeviceRGBColorProfileComboBox->setCurrentIndex(-1);
ui->cmsDeviceCMYKColorProfileComboBox->setEnabled(false);
ui->cmsDeviceCMYKColorProfileComboBox->setCurrentIndex(-1);
ui->cmsProfileDirectoryButton->setEnabled(false);
ui->cmsProfileDirectoryEdit->setEnabled(false);
ui->cmsProfileDirectoryEdit->setText(QString());
}
// Text-to-speech
ui->speechEnginesComboBox->setCurrentIndex(ui->speechEnginesComboBox->findData(m_settings.m_speechEngine));
QString speechEngine = ui->speechEnginesComboBox->currentData().toString();
setSpeechEngine(speechEngine);
ui->speechLocaleComboBox->setCurrentIndex(ui->speechLocaleComboBox->findData(m_settings.m_speechLocale));
ui->speechVoiceComboBox->setCurrentIndex(ui->speechVoiceComboBox->findData(m_settings.m_speechVoice));
ui->speechRateEdit->setValue(m_settings.m_speechRate);
ui->speechPitchEdit->setValue(m_settings.m_speechPitch);
ui->speechVolumeEdit->setValue(m_settings.m_speechVolume);
// Form Settings
ui->formHighlightFieldsCheckBox->setChecked(m_settings.m_formAppearanceFlags.testFlag(pdf::PDFFormManager::HighlightFields));
ui->formHighlightRequiredFieldsCheckBox->setChecked(m_settings.m_formAppearanceFlags.testFlag(pdf::PDFFormManager::HighlightRequiredFields));
// Signature Settings
ui->signatureVerificationEnableCheckBox->setChecked(m_settings.m_signatureVerificationEnabled);
ui->signatureStrictModeEnabledCheckBox->setChecked(m_settings.m_signatureTreatWarningsAsErrors);
ui->signatureIgnoreExpiredCheckBox->setChecked(m_settings.m_signatureIgnoreCertificateValidityTime);
ui->signatureUseSystemCertificateStoreCheckBox->setChecked(m_settings.m_signatureUseSystemStore);
}
void PDFViewerSettingsDialog::saveData()
{
if (m_isLoadingData)
{
return;
}
QObject* sender = this->sender();
if (sender == ui->renderingEngineComboBox)
{
m_settings.m_rendererEngine = static_cast<pdf::RendererEngine>(ui->renderingEngineComboBox->currentData().toInt());
}
else if (sender == ui->multisampleAntialiasingCheckBox)
{
m_settings.m_multisampleAntialiasing = ui->multisampleAntialiasingCheckBox->isChecked();
}
else if (sender == ui->multisampleAntialiasingSamplesCountComboBox)
{
m_settings.m_rendererSamples = ui->multisampleAntialiasingSamplesCountComboBox->currentData().toInt();
}
else if (sender == ui->prefetchPagesCheckBox)
{
m_settings.m_prefetchPages = ui->prefetchPagesCheckBox->isChecked();
}
else if (sender == ui->antialiasingCheckBox)
{
m_settings.m_features.setFlag(pdf::PDFRenderer::Antialiasing, ui->antialiasingCheckBox->isChecked());
}
else if (sender == ui->textAntialiasingCheckBox)
{
m_settings.m_features.setFlag(pdf::PDFRenderer::TextAntialiasing, ui->textAntialiasingCheckBox->isChecked());
}
else if (sender == ui->smoothPicturesCheckBox)
{
m_settings.m_features.setFlag(pdf::PDFRenderer::SmoothImages, ui->smoothPicturesCheckBox->isChecked());
}
else if (sender == ui->ignoreOptionalContentCheckBox)
{
m_settings.m_features.setFlag(pdf::PDFRenderer::IgnoreOptionalContent, ui->ignoreOptionalContentCheckBox->isChecked());
}
else if (sender == ui->displayAnnotationsCheckBox)
{
m_settings.m_features.setFlag(pdf::PDFRenderer::DisplayAnnotations, ui->displayAnnotationsCheckBox->isChecked());
}
else if (sender == ui->clipToCropBoxCheckBox)
{
m_settings.m_features.setFlag(pdf::PDFRenderer::ClipToCropBox, ui->clipToCropBoxCheckBox->isChecked());
}
else if (sender == ui->displayTimeCheckBox)
{
m_settings.m_features.setFlag(pdf::PDFRenderer::DisplayTimes, ui->displayTimeCheckBox->isChecked());
}
else if (sender == ui->preferredMeshResolutionEdit)
{
m_settings.m_preferredMeshResolutionRatio = ui->preferredMeshResolutionEdit->value();
}
else if (sender == ui->minimalMeshResolutionEdit)
{
m_settings.m_minimalMeshResolutionRatio = ui->minimalMeshResolutionEdit->value();
}
else if (sender == ui->colorToleranceEdit)
{
m_settings.m_colorTolerance = ui->colorToleranceEdit->value();
}
else if (sender == ui->allowLaunchCheckBox)
{
m_settings.m_allowLaunchApplications = ui->allowLaunchCheckBox->isChecked();
}
else if (sender == ui->allowRunURICheckBox)
{
m_settings.m_allowLaunchURI = ui->allowRunURICheckBox->isChecked();
}
else if (sender == ui->compiledPageCacheSizeEdit)
{
m_settings.m_compiledPageCacheLimit = ui->compiledPageCacheSizeEdit->value();
}
else if (sender == ui->thumbnailCacheSizeEdit)
{
m_settings.m_thumbnailsCacheLimit = ui->thumbnailCacheSizeEdit->value();
}
else if (sender == ui->cachedFontLimitEdit)
{
m_settings.m_fontCacheLimit = ui->cachedFontLimitEdit->value();
}
else if (sender == ui->cachedInstancedFontLimitEdit)
{
m_settings.m_instancedFontCacheLimit = ui->cachedInstancedFontLimitEdit->value();
}
else if (sender == ui->cmsTypeComboBox)
{
m_cmsSettings.system = static_cast<pdf::PDFCMSSettings::System>(ui->cmsTypeComboBox->currentData().toInt());
}
else if (sender == ui->cmsRenderingIntentComboBox)
{
m_cmsSettings.intent = static_cast<pdf::RenderingIntent>(ui->cmsRenderingIntentComboBox->currentData().toInt());
}
else if (sender == ui->cmsAccuracyComboBox)
{
m_cmsSettings.accuracy = static_cast<pdf::PDFCMSSettings::Accuracy>(ui->cmsAccuracyComboBox->currentData().toInt());
}
else if (sender == ui->cmsIsBlackPointCompensationCheckBox)
{
m_cmsSettings.isBlackPointCompensationActive = ui->cmsIsBlackPointCompensationCheckBox->isChecked();
}
else if (sender == ui->cmsWhitePaperColorTransformedCheckBox)
{
m_cmsSettings.isWhitePaperColorTransformed = ui->cmsWhitePaperColorTransformedCheckBox->isChecked();
}
else if (sender == ui->cmsOutputColorProfileComboBox)
{
m_cmsSettings.outputCS = ui->cmsOutputColorProfileComboBox->currentData().toString();
}
else if (sender == ui->cmsDeviceGrayColorProfileComboBox)
{
m_cmsSettings.deviceGray = ui->cmsDeviceGrayColorProfileComboBox->currentData().toString();
}
else if (sender == ui->cmsDeviceRGBColorProfileComboBox)
{
m_cmsSettings.deviceRGB = ui->cmsDeviceRGBColorProfileComboBox->currentData().toString();
}
else if (sender == ui->cmsDeviceCMYKColorProfileComboBox)
{
m_cmsSettings.deviceCMYK = ui->cmsDeviceCMYKColorProfileComboBox->currentData().toString();
}
else if (sender == ui->cmsProfileDirectoryEdit)
{
m_cmsSettings.profileDirectory = ui->cmsProfileDirectoryEdit->text();
}
else if (sender == ui->multithreadingComboBox)
{
m_settings.m_multithreadingStrategy = static_cast<pdf::PDFExecutionPolicy::Strategy>(ui->multithreadingComboBox->currentData().toInt());
}
else if (sender == ui->maximumRecentFileCountEdit)
{
m_otherSettings.maximumRecentFileCount = ui->maximumRecentFileCountEdit->value();
}
else if (sender == ui->speechEnginesComboBox)
{
m_settings.m_speechEngine = ui->speechEnginesComboBox->currentData().toString();
}
else if (sender == ui->speechLocaleComboBox)
{
m_settings.m_speechLocale = ui->speechLocaleComboBox->currentData().toString();
}
else if (sender == ui->speechVoiceComboBox)
{
m_settings.m_speechVoice = ui->speechVoiceComboBox->currentData().toString();
}
else if (sender == ui->speechRateEdit)
{
m_settings.m_speechRate = ui->speechRateEdit->value();
}
else if (sender == ui->speechPitchEdit)
{
m_settings.m_speechPitch = ui->speechPitchEdit->value();
}
else if (sender == ui->speechVolumeEdit)
{
m_settings.m_speechVolume = ui->speechVolumeEdit->value();
}
else if (sender == ui->magnifierSizeEdit)
{
m_settings.m_magnifierSize = ui->magnifierSizeEdit->value();
}
else if (sender == ui->magnifierZoomEdit)
{
m_settings.m_magnifierZoom = ui->magnifierZoomEdit->value();
}
else if (sender == ui->formHighlightFieldsCheckBox)
{
m_settings.m_formAppearanceFlags.setFlag(pdf::PDFFormManager::HighlightFields, ui->formHighlightFieldsCheckBox->isChecked());
}
else if (sender == ui->formHighlightRequiredFieldsCheckBox)
{
m_settings.m_formAppearanceFlags.setFlag(pdf::PDFFormManager::HighlightRequiredFields, ui->formHighlightRequiredFieldsCheckBox->isChecked());
}
else if (sender == ui->maximumUndoStepsEdit)
{
m_settings.m_maximumUndoSteps = ui->maximumUndoStepsEdit->value();
}
else if (sender == ui->maximumRedoStepsEdit)
{
m_settings.m_maximumRedoSteps = ui->maximumRedoStepsEdit->value();
}
else if (sender == ui->signatureVerificationEnableCheckBox)
{
m_settings.m_signatureVerificationEnabled = ui->signatureVerificationEnableCheckBox->isChecked();
}
else if (sender == ui->signatureStrictModeEnabledCheckBox)
{
m_settings.m_signatureTreatWarningsAsErrors = ui->signatureStrictModeEnabledCheckBox->isChecked();
}
else if (sender == ui->signatureIgnoreExpiredCheckBox)
{
m_settings.m_signatureIgnoreCertificateValidityTime = ui->signatureIgnoreExpiredCheckBox->isChecked();
}
else if (sender == ui->signatureUseSystemCertificateStoreCheckBox)
{
m_settings.m_signatureUseSystemStore = ui->signatureUseSystemCertificateStoreCheckBox->isChecked();
}
const bool loadData = !qobject_cast<const QDoubleSpinBox*>(sender) && !qobject_cast<const QSpinBox*>(sender);
if (loadData)
{
this->loadData();
}
}
void PDFViewerSettingsDialog::updateTrustedCertificatesTable()
{
ui->trustedCertificateStoreTableWidget->setUpdatesEnabled(false);
ui->trustedCertificateStoreTableWidget->clear();
const pdf::PDFCertificateStore::CertificateEntries& certificates = m_certificateStore.getCertificates();
ui->trustedCertificateStoreTableWidget->setRowCount(int(certificates.size()));
ui->trustedCertificateStoreTableWidget->setColumnCount(5);
ui->trustedCertificateStoreTableWidget->verticalHeader()->setVisible(true);
ui->trustedCertificateStoreTableWidget->setShowGrid(true);
ui->trustedCertificateStoreTableWidget->setEditTriggers(QTableWidget::NoEditTriggers);
ui->trustedCertificateStoreTableWidget->setHorizontalHeaderLabels(QStringList() << tr("Type") << tr("Certificate") << tr("Organization") << tr("Valid from") << tr("Valid to"));
for (int i = 0; i < certificates.size(); ++i)
{
QString type;
switch (certificates[i].type)
{
case pdf::PDFCertificateStore::EntryType::User:
type = tr("User");
break;
case pdf::PDFCertificateStore::EntryType::EUTL:
type = tr("EUTL");
break;
case pdf::PDFCertificateStore::EntryType::System:
type = tr("System");
break;
default:
Q_ASSERT(false);
break;
}
const pdf::PDFCertificateInfo& info = certificates[i].info;
ui->trustedCertificateStoreTableWidget->setItem(i, 0, new QTableWidgetItem(type));
ui->trustedCertificateStoreTableWidget->setItem(i, 1, new QTableWidgetItem(info.getName(pdf::PDFCertificateInfo::CommonName)));
ui->trustedCertificateStoreTableWidget->setItem(i, 2, new QTableWidgetItem(info.getName(pdf::PDFCertificateInfo::OrganizationName)));
QDateTime notValidBefore = info.getNotValidBefore().toLocalTime();
QDateTime notValidAfter = info.getNotValidAfter().toLocalTime();
if (notValidBefore.isValid())
{
ui->trustedCertificateStoreTableWidget->setItem(i, 3, new QTableWidgetItem(notValidBefore.toString(Qt::DefaultLocaleShortDate)));
}
if (notValidAfter.isValid())
{
ui->trustedCertificateStoreTableWidget->setItem(i, 4, new QTableWidgetItem(notValidAfter.toString(Qt::DefaultLocaleShortDate)));
}
}
ui->trustedCertificateStoreTableWidget->resizeColumnsToContents();
ui->trustedCertificateStoreTableWidget->setUpdatesEnabled(true);
}
void PDFViewerSettingsDialog::updateTrustedCertificatesTableActions()
{
ui->removeCertificateButton->setEnabled(!ui->trustedCertificateStoreTableWidget->selectionModel()->selectedRows().isEmpty());
}
void PDFViewerSettingsDialog::loadActionShortcutsTable()
{
ui->shortcutsTableWidget->setRowCount(m_actions.size());
ui->shortcutsTableWidget->setColumnCount(2);
ui->shortcutsTableWidget->setHorizontalHeaderLabels({ tr("Action"), tr("Shortcut")});
ui->shortcutsTableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
for (int i = 0; i < m_actions.size(); ++i)
{
QAction* action = m_actions[i];
// Action name and icon
QTableWidgetItem* actionItem = new QTableWidgetItem(action->icon(), action->text());
actionItem->setFlags(Qt::ItemIsEnabled);
ui->shortcutsTableWidget->setItem(i, 0, actionItem);
// Action shortcut
QTableWidgetItem* shortcutItem = new QTableWidgetItem(action->shortcut().toString(QKeySequence::NativeText));
ui->shortcutsTableWidget->setItem(i, 1, shortcutItem);
}
}
bool PDFViewerSettingsDialog::saveActionShortcutsTable()
{
// Jakub Melka: we need validation here
for (int i = 0; i < m_actions.size(); ++i)
{
QString shortcut = ui->shortcutsTableWidget->item(i, 1)->data(Qt::DisplayRole).toString();
if (!shortcut.isEmpty())
{
QKeySequence sequence = QKeySequence::fromString(shortcut, QKeySequence::NativeText);
if (sequence.toString(QKeySequence::PortableText).isEmpty())
{
QMessageBox::critical(this, tr("Error"), tr("Shortcut '%1' is invalid for action %2.").arg(shortcut, m_actions[i]->text()));
return false;
}
}
}
for (int i = 0; i < m_actions.size(); ++i)
{
QAction* action = m_actions[i];
// Set shortcut to the action
QString shortcut = ui->shortcutsTableWidget->item(i, 1)->data(Qt::DisplayRole).toString();
QKeySequence sequence = QKeySequence::fromString(shortcut, QKeySequence::NativeText);
action->setShortcut(sequence);
}
return true;
}
void PDFViewerSettingsDialog::loadPluginsTable()
{
ui->pluginsTableWidget->setRowCount(int(m_plugins.size()));
ui->pluginsTableWidget->setColumnCount(5);
ui->pluginsTableWidget->setHorizontalHeaderLabels({ tr("Active"), tr("Name"), tr("Author"), tr("Version"), tr("License") });
ui->pluginsTableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
ui->pluginsTableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
for (int i = 0; i < m_plugins.size(); ++i)
{
const pdf::PDFPluginInfo& plugin = m_plugins[i];
QTableWidgetItem* activeItem = new QTableWidgetItem(QString());
activeItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsUserCheckable);
activeItem->setCheckState((m_enabledPlugins.contains(plugin.name)) ? Qt::Checked : Qt::Unchecked);
ui->pluginsTableWidget->setItem(i, 0, activeItem);
ui->pluginsTableWidget->setItem(i, 1, new QTableWidgetItem(plugin.name));
ui->pluginsTableWidget->setItem(i, 2, new QTableWidgetItem(plugin.author));
ui->pluginsTableWidget->setItem(i, 3, new QTableWidgetItem(plugin.version));
ui->pluginsTableWidget->setItem(i, 4, new QTableWidgetItem(plugin.license));
}
}
void PDFViewerSettingsDialog::savePluginsTable()
{
QStringList enabledPlugins;
for (int i = 0; i < m_plugins.size(); ++i)
{
bool enabled = ui->pluginsTableWidget->item(i, 0)->data(Qt::CheckStateRole).toInt() == Qt::Checked;
if (enabled)
{
enabledPlugins << m_plugins[i].name;
}
}
m_enabledPlugins = qMove(enabledPlugins);
}
void PDFViewerSettingsDialog::updatePluginInformation()
{
QModelIndexList rows = ui->pluginsTableWidget->selectionModel()->selectedRows();
if (rows.size() == 1)
{
ui->pluginDescriptionLabel->setText(m_plugins.at(rows.front().row()).description);
}
else
{
ui->pluginDescriptionLabel->setText(QString());
}
}
void PDFViewerSettingsDialog::setSpeechEngine(const QString& engine)
{
if (m_currentSpeechEngine == engine)
{
return;
}
m_currentSpeechEngine = engine;
QTextToSpeech textToSpeech(engine, nullptr);
QVector<QLocale> locales = textToSpeech.availableLocales();
ui->speechLocaleComboBox->setUpdatesEnabled(false);
ui->speechLocaleComboBox->clear();
for (const QLocale& locale : locales)
{
ui->speechLocaleComboBox->addItem(QString("%1 (%2)").arg(locale.nativeLanguageName(), locale.nativeCountryName()), locale.name());
}
ui->speechLocaleComboBox->setUpdatesEnabled(true);
QVector<QVoice> voices = textToSpeech.availableVoices();
ui->speechVoiceComboBox->setUpdatesEnabled(false);
ui->speechVoiceComboBox->clear();
for (const QVoice& voice : voices)
{
ui->speechVoiceComboBox->addItem(QString("%1 (%2, %3)").arg(voice.name(), QVoice::genderName(voice.gender()), QVoice::ageName(voice.age())), voice.name());
}
ui->speechVoiceComboBox->setUpdatesEnabled(true);
}
bool PDFViewerSettingsDialog::canCloseDialog()
{
if (m_downloadCertificatesFromEUTLReply)
{
QMessageBox::warning(this, tr("Download"), tr("Downloading certificates from EUTL didn't finish yet. Can't close the dialog."));
return false;
}
return true;
}
void PDFViewerSettingsDialog::accept()
{
if (!canCloseDialog())
{
return;
}
if (saveActionShortcutsTable())
{
savePluginsTable();
QDialog::accept();
}
}
void PDFViewerSettingsDialog::reject()
{
if (canCloseDialog())
{
QDialog::reject();
}
}
void PDFViewerSettingsDialog::on_cmsProfileDirectoryButton_clicked()
{
QString directory = QFileDialog::getExistingDirectory(this, tr("Select color profile directory"));
if (!directory.isEmpty())
{
m_cmsSettings.profileDirectory = directory;
loadData();
}
}
void PDFViewerSettingsDialog::on_trustedCertificateStoreDownloadEUTLButton_clicked()
{
if (m_downloadCertificatesFromEUTLReply)
{
// Jakub Melka: We are already downloading the data
return;
}
if (QMessageBox::question(this, tr("Download EUTL"), tr("Do you want do download EU trusted certificates list from https://ec.europa.eu/information_society/policy/esignature/trusted-list/tl-mp.xml ?")) == QMessageBox::Yes)
{
if (!m_networkAccessManager)
{
m_networkAccessManager = new QNetworkAccessManager(this);
}
m_downloadCertificatesFromEUTLReply = m_networkAccessManager->get(QNetworkRequest(QUrl("https://ec.europa.eu/information_society/policy/esignature/trusted-list/tl-mp.xml")));
auto onFinished = [this]()
{
QNetworkReply::NetworkError error = m_downloadCertificatesFromEUTLReply->error();
if (error == QNetworkReply::NoError)
{
QByteArray data = m_downloadCertificatesFromEUTLReply->readAll();
QDomDocument document;
QString errorMessage;
if (document.setContent(data, &errorMessage))
{
QDomNodeList certificateElements = document.elementsByTagName("X509Certificate");
for (int i = 0; i < certificateElements.count(); ++i)
{
QDomElement certificateElement = certificateElements.at(i).toElement();
QString certificateBase64Encoded = certificateElement.text();
QByteArray certificateData = QByteArray::fromBase64(certificateBase64Encoded.toLatin1(), QByteArray::Base64Encoding);
m_certificateStore.add(pdf::PDFCertificateStore::EntryType::EUTL, certificateData);
}
updateTrustedCertificatesTable();
}
else
{
QMessageBox::critical(this, tr("Error"), errorMessage);
}
}
else
{
QMessageBox::critical(this, tr("Error"), m_downloadCertificatesFromEUTLReply->errorString());
}
m_downloadCertificatesFromEUTLReply->deleteLater();
m_downloadCertificatesFromEUTLReply = nullptr;
};
connect(m_downloadCertificatesFromEUTLReply, &QNetworkReply::finished, this, onFinished);
}
}
void PDFViewerSettingsDialog::on_removeCertificateButton_clicked()
{
std::set<int> rows;
QModelIndexList selectedIndices = ui->trustedCertificateStoreTableWidget->selectionModel()->selectedRows();
for (const QModelIndex& index : selectedIndices)
{
rows.insert(index.row());
}
pdf::PDFCertificateStore::CertificateEntries newEntries;
const pdf::PDFCertificateStore::CertificateEntries& certificates = m_certificateStore.getCertificates();
for (int i = 0; i < int(certificates.size()); ++i)
{
if (!rows.count(i))
{
newEntries.push_back(certificates[i]);
}
}
m_certificateStore.setCertificates(qMove(newEntries));
updateTrustedCertificatesTable();
}
} // namespace pdfviewer

View File

@@ -0,0 +1,138 @@
// Copyright (C) 2019-2020 Jakub Melka
//
// This file is part of Pdf4Qt.
//
// Pdf4Qt is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Pdf4Qt is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with Pdf4Qt. If not, see <https://www.gnu.org/licenses/>.
#ifndef PDFVIEWERSETTINGSDIALOG_H
#define PDFVIEWERSETTINGSDIALOG_H
#include "pdfviewersettings.h"
#include "pdfplugin.h"
#include <QDialog>
class QListWidgetItem;
class QNetworkReply;
class QNetworkAccessManager;
namespace Ui
{
class PDFViewerSettingsDialog;
}
namespace pdfviewer
{
class PDFViewerSettingsDialog : public QDialog
{
Q_OBJECT
public:
struct OtherSettings
{
int maximumRecentFileCount = 0;
};
/// Constructor
/// \param settings Viewer settings
/// \param cmsSettings Color management system settings
/// \param otherSettings Other settings
/// \param certificateStore Certificate store
/// \param actions Actions
/// \param cmsManager CMS manager
/// \param parent Parent widget
explicit PDFViewerSettingsDialog(const PDFViewerSettings::Settings& settings,
const pdf::PDFCMSSettings& cmsSettings,
const OtherSettings& otherSettings,
const pdf::PDFCertificateStore& certificateStore,
const std::vector<QAction*>& actions,
pdf::PDFCMSManager* cmsManager,
const QStringList& enabledPlugins,
const pdf::PDFPluginInfos& plugins,
QWidget* parent);
virtual ~PDFViewerSettingsDialog() override;
virtual void accept() override;
virtual void reject() override;
enum Page : int
{
EngineSettings,
RenderingSettings,
ShadingSettings,
CacheSettings,
ShortcutSettings,
ColorManagementSystemSettings,
SecuritySettings,
UISettings,
SpeechSettings,
FormSettings,
SignatureSettings,
PluginsSettings
};
const PDFViewerSettings::Settings& getSettings() const { return m_settings; }
const pdf::PDFCMSSettings& getCMSSettings() const { return m_cmsSettings; }
const OtherSettings& getOtherSettings() const { return m_otherSettings; }
const pdf::PDFCertificateStore& getCertificateStore() const { return m_certificateStore; }
const QStringList& getEnabledPlugins() const { return m_enabledPlugins; }
private slots:
void on_optionsPagesWidget_currentItemChanged(QListWidgetItem* current, QListWidgetItem* previous);
void on_cmsProfileDirectoryButton_clicked();
void on_trustedCertificateStoreDownloadEUTLButton_clicked();
void on_removeCertificateButton_clicked();
private:
void loadData();
void saveData();
void updateTrustedCertificatesTable();
void updateTrustedCertificatesTableActions();
void loadActionShortcutsTable();
bool saveActionShortcutsTable();
void loadPluginsTable();
void savePluginsTable();
void updatePluginInformation();
void setSpeechEngine(const QString& engine);
/// Returns true, if dialog can be closed. If not, then message is displayed
/// and false is returned.
bool canCloseDialog();
Ui::PDFViewerSettingsDialog* ui;
PDFViewerSettings::Settings m_settings;
pdf::PDFCMSSettings m_cmsSettings;
OtherSettings m_otherSettings;
QList<QAction*> m_actions;
bool m_isLoadingData;
QStringList m_textToSpeechEngines;
QString m_currentSpeechEngine;
pdf::PDFCertificateStore m_certificateStore;
QStringList m_enabledPlugins;
pdf::PDFPluginInfos m_plugins;
QNetworkAccessManager* m_networkAccessManager;
QNetworkReply* m_downloadCertificatesFromEUTLReply;
};
} // namespace pdfviewer
#endif // PDFVIEWERSETTINGSDIALOG_H

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 KiB

View File

@@ -0,0 +1,166 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="app-icon2.svg"
inkscape:export-filename="K:\Programming\PDF\PDF_For_Qt\PdfForQt\PdfForQtViewer\resources\app-icon.png"
inkscape:export-xdpi="108.37334"
inkscape:export-ydpi="108.37334">
<defs
id="defs5285">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 15 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="30 : 15 : 1"
inkscape:persp3d-origin="15 : 10 : 1"
id="perspective5921" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6568541"
inkscape:cx="192.57793"
inkscape:cy="53.941207"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<g
id="g879"
style="fill:#000000;fill-opacity:1;stroke:none">
<g
aria-label=" 🕮 "
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.39999962px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
id="text869">
<path
d="m 28.674223,287.71878 -10.889258,-0.81855 q -0.595313,0.32246 -1.16582,0.49609 -0.570508,0.16123 -1.103809,0.16123 -0.545703,0 -1.178223,-0.16123 -0.620117,-0.17363 -1.32705,-0.49609 l -10.9636721,0.81855 v -17.23926 l 2.3192382,-0.13642 0.8929688,-1.74873 q 1.4634765,-0.38448 2.7657226,-0.57051 1.3146484,-0.19844 2.4556645,-0.19844 1.984374,0 3.100585,0.5209 1.128614,0.5085 1.773536,1.72393 0.58291,-1.19063 1.761132,-1.71153 1.178223,-0.5333 3.237012,-0.5333 1.054199,0 2.306836,0.19844 1.265039,0.18603 2.740918,0.57051 l 0.843359,1.6123 2.43086,0.13643 z m -0.620118,-0.65732 V 270.8888 l -1.525488,-0.0868 0.607715,1.00459 v 14.23789 l -9.934277,-0.62011 q -0.719336,0.60771 -1.835547,0.60771 -1.103809,0 -1.810742,-0.60771 l -9.9838869,0.62011 v -14.23789 l 0.4588868,-0.88056 -1.3766602,0.0744 v 16.06104 L 13.2085,286.28011 q 0.620117,0.33486 1.190625,0.50849 0.570508,0.16124 1.103809,0.16124 0.496093,0 1.016992,-0.16124 0.520898,-0.17363 1.079004,-0.50849 z M 4.1919963,271.9306 v 12.93564 l 1.2154297,-2.36885 v -12.79921 z m 21.1087887,-2.18282 v 12.74961 l 1.227832,2.30684 v -12.73721 z m -20.6374996,15.67657 9.0661136,-0.71934 q 0.396875,0.5085 1.32705,0.71934 -0.173633,-1.5627 -1.215429,-2.23242 -1.029395,-0.68213 -3.249414,-0.68213 -1.0293949,0 -2.2200199,0.14882 -1.1782226,0.13643 -2.5176757,0.42168 z m 21.4932616,0 -1.190625,-2.30684 q -1.438672,-0.31006 -2.678906,-0.45889 -1.227832,-0.14882 -2.244825,-0.14882 -4.378027,0 -4.378027,2.91455 0.917774,-0.14883 1.401465,-0.73174 z M 6.0275432,282.41058 q 1.4386718,-0.26045 2.5424804,-0.38448 1.1162109,-0.12402 1.8975584,-0.12402 3.187402,0 4.588867,1.53789 v -11.54658 q 0,-1.73633 -1.079004,-2.59209 -1.079003,-0.86816 -3.249414,-0.86816 -1.1162105,0 -2.2944332,0.16123 -1.1658203,0.14882 -2.4060546,0.45888 z M 24.69307,269.02845 q -1.364258,-0.29766 -2.517676,-0.44649 -1.153417,-0.14882 -2.095996,-0.14882 -2.294433,0 -3.472656,0.94257 -0.942578,0.74414 -0.942578,2.54248 v 11.57139 q 0.855762,-0.90537 1.823145,-1.24023 0.967382,-0.34727 2.666503,-0.34727 1.128614,0 2.257227,0.13643 1.141016,0.12402 2.282031,0.39687 z"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
id="path881"
inkscape:connector-curvature="0" />
</g>
</g>
<rect
style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="rect871"
width="20.207552"
height="6.4161458"
x="5.4239583"
y="289.4263"
rx="3"
ry="3" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.64444447px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="9.9549494"
y="294.58566"
id="text875"><tspan
sodipodi:role="line"
id="tspan873"
x="9.9549494"
y="294.58566"
style="stroke-width:0.26458332">PDF</tspan></text>
<path
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.66813242;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
d="M 56.035606,61.117383 C 50.91089,56.733484 43.254928,55.395935 31.463645,56.824492 c -2.056179,0.249114 -6.774539,0.972122 -8.087535,1.239275 l -0.574524,0.116899 V 32.992057 7.8034451 L 25.409043,7.242608 c 3.696941,-0.7951744 8.084305,-1.3978883 11.918094,-1.6372476 9.65059,-0.6025263 15.757263,1.613886 18.149934,6.5875026 1.334247,2.773485 1.279091,1.563328 1.22525,26.883248 l -0.048,22.570551 z"
id="path884"
inkscape:connector-curvature="0"
transform="matrix(0.26458333,0,0,0.26458333,0,267)" />
<path
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.66813242;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
d="m 59.264755,39.016347 c 0.06771,-25.638618 0.002,-24.247605 1.27408,-26.963048 1.507681,-3.2183137 4.763884,-5.1976409 10.169237,-6.1815105 2.269207,-0.4130355 7.948482,-0.4089749 11.578874,0.00828 2.659095,0.3056192 6.219363,0.8791726 9.192389,1.4808792 l 1.59099,0.3219984 0.0448,25.2267639 c 0.02615,14.725326 -0.02094,25.226763 -0.113123,25.226763 -0.08686,0 -0.914735,-0.155721 -1.839728,-0.346045 -6.002472,-1.235056 -13.413018,-1.814882 -18.32761,-1.434013 -5.780071,0.447941 -8.737326,1.535854 -12.210146,4.491855 l -1.420607,1.209197 z"
id="path886"
inkscape:connector-curvature="0"
transform="matrix(0.26458333,0,0,0.26458333,0,267)" />
<path
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.66813242;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
d="m 97.88685,62.625306 -2.254543,-4.261612 0.04483,-23.797741 0.04483,-23.797741 2.254541,4.249114 2.254542,4.249115 -0.0448,23.810238 -0.0448,23.81024 z"
id="path888"
inkscape:connector-curvature="0"
transform="matrix(0.26458333,0,0,0.26458333,0,267)" />
<path
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.66813242;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
d="M 10.073664,45.487643 V 15.232137 l 1.458408,-0.113531 c 0.802124,-0.06244 1.916615,-0.114007 2.476647,-0.114589 l 1.01824,-0.0011 -0.797269,1.587458 -0.797269,1.587458 v 26.966903 26.966902 l 1.104854,-0.101905 c 1.671828,-0.154198 35.112801,-2.204923 35.965197,-2.205519 0.542668,-3.53e-4 0.966994,0.151031 1.576986,0.56271 1.527676,1.031015 2.908364,1.42384 5.33338,1.517413 1.338085,0.05163 2.59438,0.0014 3.270369,-0.130944 1.020449,-0.199678 2.932623,-1.014794 4.052038,-1.727289 0.458527,-0.291846 1.26745,-0.256538 18.473166,0.806312 9.896504,0.611338 18.331729,1.156072 18.744939,1.210521 l 0.75131,0.099 v -26.98039 -26.98043 l -1.15599,-1.870168 -1.15599,-1.870168 2.17246,0.111581 c 1.19484,0.06137 2.43098,0.151689 2.74697,0.20071 l 0.57453,0.08913 v 30.397582 30.397583 h -0.65417 c -0.35979,0 -9.209677,-0.644636 -19.66641,-1.432525 L 66.55382,72.772317 65.669936,73.25911 c -2.749991,1.51454 -5.144838,2.116392 -7.849377,1.972637 -2.232484,-0.118665 -3.894293,-0.559839 -6.212813,-1.649367 l -1.687822,-0.79315 -13.338198,0.986753 c -7.336009,0.542715 -16.042882,1.183594 -19.348606,1.424178 -3.305724,0.240583 -6.268944,0.461176 -6.584932,0.490206 l -0.574524,0.05278 z"
id="path890"
inkscape:connector-curvature="0"
transform="matrix(0.26458333,0,0,0.26458333,0,267)" />
<path
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.66813242;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
d="m 59.336921,68.454611 c 0.12295,-1.300105 0.795473,-3.376604 1.407689,-4.346416 1.897407,-3.005688 5.748663,-4.724909 11.819618,-5.276342 4.731191,-0.429739 13.178874,0.353388 20.420929,1.893086 l 1.329045,0.282561 2.173883,4.221341 2.173881,4.22134 h -0.568057 c -0.312434,0 -8.001434,-0.600063 -17.086669,-1.333472 l -16.51861,-1.333473 -0.795265,0.733049 c -0.876147,0.807605 -2.642456,1.685923 -3.744942,1.862218 l -0.709604,0.11347 z"
id="path892"
inkscape:connector-curvature="0"
transform="matrix(0.26458333,0,0,0.26458333,0,267)" />
<path
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.66813242;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
d="m 20.003644,65.144177 2.150869,-4.306003 1.163226,-0.220184 c 7.376688,-1.39631 11.160101,-1.820365 16.366022,-1.834347 2.42412,-0.0065 4.672595,0.07924 5.568466,0.212362 5.948092,0.883867 9.192177,2.997409 10.683939,6.960655 0.463033,1.230168 0.911577,3.27064 0.753673,3.428544 -0.125213,0.125212 -1.745147,-0.3958 -2.660544,-0.855699 -0.374268,-0.188032 -1.010788,-0.646339 -1.41449,-1.018458 l -0.734003,-0.67658 -16.351569,1.303192 C 26.53587,68.854414 18.879564,69.44295 18.51522,69.445516 l -0.662445,0.0047 z"
id="path894"
inkscape:connector-curvature="0"
transform="matrix(0.26458333,0,0,0.26458333,0,267)" />
<path
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.66813242;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
d="m 15.907956,42.889326 -6.61e-4,-24.17437 2.165514,-3.986795 2.165515,-3.986795 0.04483,23.904042 0.04483,23.904043 -1.886401,3.726792 c -1.037521,2.049737 -2.03188,3.965441 -2.209686,4.257122 -0.314207,0.515439 -0.323304,-0.148501 -0.323946,-23.644039 z"
id="path896"
inkscape:connector-curvature="0"
transform="matrix(0.26458333,0,0,0.26458333,0,267)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -0,0 +1,84 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="bookmark.svg">
<defs
id="defs5285" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.35"
inkscape:cx="-278.8134"
inkscape:cy="145.70776"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<path
style="fill:#000000;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:0.1545139;stroke-miterlimit:4;stroke-dasharray:none"
d="m 5.8113839,294.11793 v -0.3071 l 0.07087,-23.95425 18.8279381,-0.11811 0.09449,24.68657 -9.307663,-10.08724 z"
id="path831"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@@ -0,0 +1,158 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="cache.svg">
<defs
id="defs5285">
<inkscape:path-effect
effect="skeletal"
id="path-effect853"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="0.26458333"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<inkscape:path-effect
effect="skeletal"
id="path-effect849"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="0.26458333"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<linearGradient
id="linearGradient841"
osb:paint="solid">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop839" />
</linearGradient>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.98994949"
inkscape:cx="-375.5706"
inkscape:cy="-30.46167"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<ellipse
style="fill:#dcdcdc;fill-opacity:1;stroke:#000000;stroke-width:0.6;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path831"
cx="13.087426"
cy="280.41635"
rx="11.114326"
ry="10.500114" />
<ellipse
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.86595404;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path835"
cx="51.361652"
cy="275.41348"
rx="2.5243223"
ry="2.5364435"
transform="matrix(0.9883438,0.15223844,-0.13518619,0.99082021,0,0)" />
<ellipse
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.67466593;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path837"
cx="13.479585"
cy="280.6969"
rx="4.051156"
ry="3.999856" />
<ellipse
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.80000001;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path845"
cx="24.667669"
cy="290.52716"
rx="1.8662573"
ry="1.842634" />
<path
style="fill:none;stroke:#000000;stroke-width:0.69999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 25.966964,289.0625 -7.748512,-4.25223 5.055431,7.1343"
id="path871"
inkscape:connector-curvature="0" />
<ellipse
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.69999999;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="path876"
cx="18.023989"
cy="284.6889"
rx="0.88533032"
ry="0.81851292" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

@@ -0,0 +1,110 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg8"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="cms.svg">
<defs
id="defs2">
<inkscape:path-effect
effect="spiro"
id="path-effect831"
is_visible="true" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="164.25422"
inkscape:cy="113.44001"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 11.646391,283.58184 v 0 0"
id="path837"
inkscape:connector-curvature="0" />
<ellipse
style="fill:#969696;fill-opacity:0.75294119;stroke:none;stroke-width:1.3012532;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="path876"
cx="9.6383934"
cy="277.41611"
rx="7.7485123"
ry="7.9611235" />
<ellipse
style="fill:#000000;fill-opacity:0.75294119;stroke:none;stroke-width:1.3012532;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="path876-0"
cx="19.607515"
cy="278.33743"
rx="7.7485123"
ry="7.9611239" />
<ellipse
style="fill:#e6e6e6;fill-opacity:0.75294119;stroke:none;stroke-width:1.3012532;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="path876-06"
cx="13.512649"
cy="286.41666"
rx="7.7485123"
ry="7.9611239" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@@ -0,0 +1,756 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg8"
sodipodi:docname="engine.svg"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
<defs
id="defs2">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 15 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="22.487723 : 17.055246 : 1"
inkscape:persp3d-origin="15 : 10 : 1"
id="perspective3725" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.979899"
inkscape:cx="-227.17771"
inkscape:cy="-47.961126"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:pagecheckerboard="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<rect
style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-linejoin:round"
id="rect3741"
width="20.302736"
height="18.993414"
x="4.8495622"
y="272.35382" />
<path
style="fill:none;stroke:#000000;stroke-width:0.30000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 4.9845609,274.4868 -2.2442336,0.0236"
id="path5389"
inkscape:connector-curvature="0"
inkscape:tile-cx="3.8624441"
inkscape:tile-cy="7.4986"
inkscape:tile-w="2.2473882"
inkscape:tile-h="0.32358343"
inkscape:tile-x0="2.73875"
inkscape:tile-y0="7.3368083" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5389"
xlink:href="#path5389"
id="use5557" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5389"
xlink:href="#path5389"
transform="translate(0,0.80895857)"
id="use5559" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5389"
xlink:href="#path5389"
transform="translate(0,1.6179171)"
id="use5561" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5389"
xlink:href="#path5389"
transform="translate(0,2.4268757)"
id="use5563" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5389"
xlink:href="#path5389"
transform="translate(0,3.2358343)"
id="use5565" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5389"
xlink:href="#path5389"
transform="translate(0,4.0447928)"
id="use5567" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5389"
xlink:href="#path5389"
transform="translate(0,4.8537514)"
id="use5569" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5389"
xlink:href="#path5389"
transform="translate(0,5.66271)"
id="use5571" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5389"
xlink:href="#path5389"
transform="translate(0,6.4716686)"
id="use5573" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5389"
xlink:href="#path5389"
transform="translate(0,7.2806271)"
id="use5575" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5389"
xlink:href="#path5389"
transform="translate(0,8.0895857)"
id="use5577" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5389"
xlink:href="#path5389"
transform="translate(0,8.8985443)"
id="use5579" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5389"
xlink:href="#path5389"
transform="translate(0,9.7075028)"
id="use5581" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5389"
xlink:href="#path5389"
transform="translate(0,10.516461)"
id="use5583" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5389"
xlink:href="#path5389"
transform="translate(0,11.32542)"
id="use5585" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5389"
xlink:href="#path5389"
transform="translate(0,12.134379)"
id="use5587" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5389"
xlink:href="#path5389"
transform="translate(0,12.943337)"
id="use5589" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5389"
xlink:href="#path5389"
transform="translate(0,13.752296)"
id="use5591" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5389"
xlink:href="#path5389"
transform="translate(0,14.561254)"
id="use5593" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5389"
xlink:href="#path5389"
transform="translate(0,15.370213)"
id="use5595" />
<use
transform="translate(22.626608,0.0236)"
x="0"
y="0"
inkscape:tiled-clone-of="#path5389"
xlink:href="#path5389"
id="use5557-4"
width="100%"
height="100%"
inkscape:tile-cx="26.489052"
inkscape:tile-cy="7.5222"
inkscape:tile-w="2.2473882"
inkscape:tile-h="0.32358343"
inkscape:tile-x0="25.365358"
inkscape:tile-y0="7.3604083" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#use5557-4"
xlink:href="#use5557-4"
id="use5612" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#use5557-4"
xlink:href="#use5557-4"
transform="translate(0,0.80895857)"
id="use5614" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#use5557-4"
xlink:href="#use5557-4"
transform="translate(0,1.6179171)"
id="use5616" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#use5557-4"
xlink:href="#use5557-4"
transform="translate(0,2.4268757)"
id="use5618" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#use5557-4"
xlink:href="#use5557-4"
transform="translate(0,3.2358343)"
id="use5620" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#use5557-4"
xlink:href="#use5557-4"
transform="translate(0,4.0447928)"
id="use5622" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#use5557-4"
xlink:href="#use5557-4"
transform="translate(0,4.8537514)"
id="use5624" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#use5557-4"
xlink:href="#use5557-4"
transform="translate(0,5.66271)"
id="use5626" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#use5557-4"
xlink:href="#use5557-4"
transform="translate(0,6.4716686)"
id="use5628" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#use5557-4"
xlink:href="#use5557-4"
transform="translate(0,7.2806271)"
id="use5630" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#use5557-4"
xlink:href="#use5557-4"
transform="translate(0,8.0895857)"
id="use5632" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#use5557-4"
xlink:href="#use5557-4"
transform="translate(0,8.8985443)"
id="use5634" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#use5557-4"
xlink:href="#use5557-4"
transform="translate(0,9.7075028)"
id="use5636" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#use5557-4"
xlink:href="#use5557-4"
transform="translate(0,10.516461)"
id="use5638" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#use5557-4"
xlink:href="#use5557-4"
transform="translate(0,11.32542)"
id="use5640" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#use5557-4"
xlink:href="#use5557-4"
transform="translate(0,12.134379)"
id="use5642" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#use5557-4"
xlink:href="#use5557-4"
transform="translate(0,12.943337)"
id="use5644" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#use5557-4"
xlink:href="#use5557-4"
transform="translate(0,13.752296)"
id="use5646" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#use5557-4"
xlink:href="#use5557-4"
transform="translate(0,14.561254)"
id="use5648" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#use5557-4"
xlink:href="#use5557-4"
transform="translate(0,15.370213)"
id="use5650" />
<path
style="fill:none;stroke:#000000;stroke-width:0.3;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="m 6.6149209,272.24416 v -1.58691"
id="path5669"
inkscape:connector-curvature="0"
inkscape:tile-cx="6.6149209"
inkscape:tile-cy="4.450705"
inkscape:tile-w="0.30000001"
inkscape:tile-h="1.58691"
inkscape:tile-x0="6.4649209"
inkscape:tile-y0="3.65725" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5669"
xlink:href="#path5669"
id="use5831" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5669"
xlink:href="#path5669"
transform="translate(0.90000004)"
id="use5833" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5669"
xlink:href="#path5669"
transform="translate(1.8000001)"
id="use5835" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5669"
xlink:href="#path5669"
transform="translate(2.7000001)"
id="use5837" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5669"
xlink:href="#path5669"
transform="translate(3.6000002)"
id="use5839" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5669"
xlink:href="#path5669"
transform="translate(4.5000002)"
id="use5841" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5669"
xlink:href="#path5669"
transform="translate(5.4000002)"
id="use5843" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5669"
xlink:href="#path5669"
transform="translate(6.3000003)"
id="use5845" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5669"
xlink:href="#path5669"
transform="translate(7.2000003)"
id="use5847" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5669"
xlink:href="#path5669"
transform="translate(8.1000004)"
id="use5849" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5669"
xlink:href="#path5669"
transform="translate(9.0000004)"
id="use5851" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5669"
xlink:href="#path5669"
transform="translate(9.9000005)"
id="use5853" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5669"
xlink:href="#path5669"
transform="translate(10.8)"
id="use5855" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5669"
xlink:href="#path5669"
transform="translate(11.700001)"
id="use5857" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5669"
xlink:href="#path5669"
transform="translate(12.600001)"
id="use5859" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5669"
xlink:href="#path5669"
transform="translate(13.500001)"
id="use5861" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5669"
xlink:href="#path5669"
transform="translate(14.400001)"
id="use5863" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5669"
xlink:href="#path5669"
transform="translate(15.300001)"
id="use5865" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5669"
xlink:href="#path5669"
transform="translate(16.200001)"
id="use5867" />
<use
x="0"
y="0"
inkscape:tiled-clone-of="#path5669"
xlink:href="#path5669"
transform="translate(17.100001)"
id="use5869" />
<path
style="fill:none;stroke:#000000;stroke-width:0.30000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 6.6149209,292.88239 v -1.58691"
id="path5669-7"
inkscape:connector-curvature="0"
inkscape:tile-cx="6.6149209"
inkscape:tile-cy="4.450705"
inkscape:tile-w="0.30000001"
inkscape:tile-h="1.58691"
inkscape:tile-x0="6.4649209"
inkscape:tile-y0="3.65725" />
<use
height="100%"
width="100%"
x="0"
y="0"
inkscape:tiled-clone-of="#path5669-7"
xlink:href="#path5669-7"
id="use5831-1" />
<use
height="100%"
width="100%"
x="0"
y="0"
inkscape:tiled-clone-of="#path5669-7"
xlink:href="#path5669-7"
transform="translate(0.8999999)"
id="use5833-1" />
<use
height="100%"
width="100%"
x="0"
y="0"
inkscape:tiled-clone-of="#path5669-7"
xlink:href="#path5669-7"
transform="translate(1.7999999)"
id="use5835-9" />
<use
height="100%"
width="100%"
x="0"
y="0"
inkscape:tiled-clone-of="#path5669-7"
xlink:href="#path5669-7"
transform="translate(2.6999999)"
id="use5837-9" />
<use
height="100%"
width="100%"
x="0"
y="0"
inkscape:tiled-clone-of="#path5669-7"
xlink:href="#path5669-7"
transform="translate(3.5999999)"
id="use5839-6" />
<use
height="100%"
width="100%"
x="0"
y="0"
inkscape:tiled-clone-of="#path5669-7"
xlink:href="#path5669-7"
transform="translate(4.4999999)"
id="use5841-0" />
<use
height="100%"
width="100%"
x="0"
y="0"
inkscape:tiled-clone-of="#path5669-7"
xlink:href="#path5669-7"
transform="translate(5.3999999)"
id="use5843-4" />
<use
height="100%"
width="100%"
x="0"
y="0"
inkscape:tiled-clone-of="#path5669-7"
xlink:href="#path5669-7"
transform="translate(6.3000009)"
id="use5845-3" />
<use
height="100%"
width="100%"
x="0"
y="0"
inkscape:tiled-clone-of="#path5669-7"
xlink:href="#path5669-7"
transform="translate(7.2000009)"
id="use5847-2" />
<use
height="100%"
width="100%"
x="0"
y="0"
inkscape:tiled-clone-of="#path5669-7"
xlink:href="#path5669-7"
transform="translate(8.1000009)"
id="use5849-4" />
<use
height="100%"
width="100%"
x="0"
y="0"
inkscape:tiled-clone-of="#path5669-7"
xlink:href="#path5669-7"
transform="translate(9.0000009)"
id="use5851-6" />
<use
height="100%"
width="100%"
x="0"
y="0"
inkscape:tiled-clone-of="#path5669-7"
xlink:href="#path5669-7"
transform="translate(9.9000009)"
id="use5853-1" />
<use
height="100%"
width="100%"
x="0"
y="0"
inkscape:tiled-clone-of="#path5669-7"
xlink:href="#path5669-7"
transform="translate(10.8)"
id="use5855-9" />
<use
height="100%"
width="100%"
x="0"
y="0"
inkscape:tiled-clone-of="#path5669-7"
xlink:href="#path5669-7"
transform="translate(11.700001)"
id="use5857-3" />
<use
height="100%"
width="100%"
x="0"
y="0"
inkscape:tiled-clone-of="#path5669-7"
xlink:href="#path5669-7"
transform="translate(12.600001)"
id="use5859-9" />
<use
height="100%"
width="100%"
x="0"
y="0"
inkscape:tiled-clone-of="#path5669-7"
xlink:href="#path5669-7"
transform="translate(13.500001)"
id="use5861-8" />
<use
height="100%"
width="100%"
x="0"
y="0"
inkscape:tiled-clone-of="#path5669-7"
xlink:href="#path5669-7"
transform="translate(14.400001)"
id="use5863-8" />
<use
height="100%"
width="100%"
x="0"
y="0"
inkscape:tiled-clone-of="#path5669-7"
xlink:href="#path5669-7"
transform="translate(15.300001)"
id="use5865-7" />
<use
height="100%"
width="100%"
x="0"
y="0"
inkscape:tiled-clone-of="#path5669-7"
xlink:href="#path5669-7"
transform="translate(16.200001)"
id="use5867-5" />
<use
height="100%"
width="100%"
x="0"
y="0"
inkscape:tiled-clone-of="#path5669-7"
xlink:href="#path5669-7"
transform="translate(17.100001)"
id="use5869-0" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.17222214px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="5.6460195"
y="284.85751"
id="text5948"><tspan
sodipodi:role="line"
id="tspan5946"
x="5.6460195"
y="284.85751"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.17222214px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">CPU</tspan><tspan
sodipodi:role="line"
x="5.6460195"
y="296.32278"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.17222214px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
id="tspan5950" /></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -0,0 +1,321 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="extract-image.svg">
<defs
id="defs5285">
<inkscape:path-effect
effect="bspline"
id="path-effect975"
is_visible="true"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect967"
is_visible="true"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect963"
is_visible="true"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect959"
is_visible="true"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect891"
is_visible="true"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect843"
is_visible="true"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 15 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="30 : 15 : 1"
inkscape:persp3d-origin="15 : 10 : 1"
id="perspective5921" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="15.999999"
inkscape:cx="107.4567"
inkscape:cy="-24.152196"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<flowRoot
xml:space="preserve"
id="flowRoot5913"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"><flowRegion
id="flowRegion5915"><rect
id="rect5917"
width="129.22377"
height="91.747108"
x="-13.788582"
y="-33.515606" /></flowRegion><flowPara
id="flowPara5919" /></flowRoot> <rect
style="fill:none;fill-opacity:0;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="rect839"
width="21.44504"
height="17.937128"
x="1.964431"
y="269.59152" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 5.5231773,284.72995 -0.099219,-5.32474"
id="path845"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 8.7643231,284.79609 8.6320314,279.47135"
id="path847"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 11.310938,284.59766 -0.297656,-5.2586"
id="path849"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 5.4239583,279.40521 -0.8598956,1.32291"
id="path851"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 5.2916669,281.42266 -0.7276042,1.12447"
id="path853"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 5.3578127,283.27474 -1.0914062,1.25677"
id="path855"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 5.4239583,279.40521 1.3229169,1.2237"
id="path857"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 5.2916669,281.42266 1.2567708,1.15755"
id="path859"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 5.3578127,283.27474 1.190625,0.89297"
id="path861"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 8.6320314,279.47135 -0.9591146,1.38907"
id="path863"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 8.6320314,279.47135 0.8598961,1.15756"
id="path865"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 8.6320314,281.4888 -0.8929687,0.89297"
id="path867"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 8.6320314,281.4888 0.8598961,0.79375"
id="path869"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 8.4335939,283.14245 -0.6945312,0.99218"
id="path871"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 8.4335939,283.14245 1.289844,1.25677"
id="path873"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 11.013282,279.33906 -0.727605,1.45521"
id="path875"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 11.013282,279.33906 1.058333,1.35599"
id="path877"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 11.211719,281.22422 -0.777213,1.35599"
id="path879"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 11.211719,281.22422 1.223698,1.38906"
id="path881"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 11.261329,283.2582 -0.859896,1.37253"
id="path883"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 11.261329,283.2582 1.637109,1.10795"
id="path885"
inkscape:connector-curvature="0" />
<ellipse
style="fill:none;fill-opacity:0;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="path887"
cx="18.462955"
cy="274.27063"
rx="2.9352217"
ry="2.8194661" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 3.7183874,284.62876 c 0.022905,0.0382 0.046302,0.0772 0.079041,0.0971 0.03274,0.0199 0.071717,0.0199 0.1143279,0.024 0.042611,0.004 0.089399,0.0119 0.1474068,0.0315 0.058007,0.0196 0.1281781,0.0507 0.2068384,0.0661 0.07866,0.0153 0.1644089,0.0153 0.2380693,0.0233 0.07366,0.008 0.1360229,0.0236 0.2142472,0.0352 0.078224,0.0116 0.171785,0.0194 0.34697,0.0507 0.1751849,0.0313 0.4324366,0.0859 0.6860219,0.12081 0.2535852,0.0349 0.5030367,0.0505 0.7758104,0.074 0.2727737,0.0234 0.5690007,0.0546 0.7874224,0.0701 0.2184216,0.0155 0.358738,0.0155 0.5146453,0.0155 0.1559074,0 0.3274052,0 0.8185131,0 0.4911078,0 1.3018252,0 1.8043855,0.0158 0.50256,0.0158 0.697449,0.0469 0.826312,0.0623 0.128862,0.0154 0.191224,0.0154 0.257482,0.0154 0.06626,0 0.136421,0 0.237761,0 0.101339,0 0.23386,0 0.323508,0 0.08965,0 0.136418,0 0.183191,0 0.04677,0 0.09354,0 0.13275,-0.004 0.03921,-0.004 0.07039,-0.0121 0.101338,-0.0156 0.03095,-0.004 0.06213,-0.004 0.09741,-0.008 0.03528,-0.004 0.07425,-0.012 0.116931,-0.0156 0.04268,-0.004 0.08945,-0.004 0.128679,-0.0122 0.03923,-0.009 0.07041,-0.0242 0.132518,-0.0312 0.06211,-0.007 0.155649,-0.007 0.222132,-0.0196 0.06648,-0.0126 0.105462,-0.036 0.155909,-0.0468 0.05045,-0.0108 0.112809,-0.0108 0.171538,-0.0231 0.05873,-0.0124 0.1133,-0.0358 0.15201,-0.0468 0.03871,-0.011 0.0621,-0.011 0.08574,-0.0154 0.02364,-0.004 0.04703,-0.0122 0.07795,-0.0156 0.03092,-0.003 0.0699,-0.003 0.109004,-0.0201 0.0391,-0.0167 0.0781,-0.0479 0.101348,-0.0623 0.02325,-0.0144 0.03105,-0.0144 0.04664,-0.0144 0.01559,0 0.03898,0 0.08186,0 0.04288,0 0.105236,0 0.226064,0 0.120829,0 0.300122,0 0.41705,0 0.116929,0 0.1715,0 0.214376,0 0.04288,0 0.07406,0 0.09744,0 0.02338,0 0.03897,0 0.05482,-0.005 0.01585,-0.005 0.03144,-0.0125 0.07015,-0.0156 0.03872,-0.003 0.101082,-0.003 0.186831,-0.003 0.08575,0 0.194884,0 0.417052,0 0.222168,0 0.557368,0 0.791229,0 0.233861,0 0.366382,0 0.45603,0 0.08965,0 0.136417,0 0.163701,0 0.02728,0 0.03508,0 0.04288,0 0.0078,0 0.0156,0 0.02338,-0.005 0.0078,-0.005 0.01558,-0.013 0.02729,-0.0156 0.01171,-0.003 0.0273,-0.003 0.05068,-0.0195 0.02338,-0.0169 0.05458,-0.0481 0.08205,-0.0712 0.02747,-0.0231 0.05086,-0.0387 0.07431,-0.0499 0.02345,-0.0112 0.04684,-0.019 0.06137,-0.0356 0.01453,-0.0166 0.02233,-0.04 0.03872,-0.0502 0.01639,-0.0101 0.03978,-0.0101 0.05536,-0.0153 0.01558,-0.005 0.02338,-0.013 0.03534,-0.0203 0.01196,-0.007 0.02755,-0.0151 0.05484,-0.0266 0.02729,-0.0115 0.06627,-0.0271 0.10134,-0.0429 0.03507,-0.0157 0.06625,-0.0313 0.08548,-0.0384 0.01923,-0.007 0.02703,-0.007 0.03482,-0.0122 0.0078,-0.005 0.01558,-0.013 0.02729,-0.0156 0.01171,-0.003 0.0273,-0.003 0.05068,-0.003 0.02338,0 0.05457,0 0.09354,0 0.03898,0 0.08575,0 0.116928,0 0.03118,0 0.04677,0 0.06975,0.004 0.02298,0.004 0.05418,0.0119 0.08965,0.0156 0.03547,0.004 0.07445,0.004 0.104601,0.0117 0.03015,0.008 0.05354,0.0236 0.07016,0.0312 0.01662,0.008 0.02442,0.008 0.0435,0.0117 0.01908,0.004 0.05029,0.0119 0.09356,0.0156 0.04327,0.004 0.09784,0.004 0.147707,0.0156 0.04987,0.012 0.09664,0.0354 0.13642,0.0468 0.03978,0.0114 0.07096,0.0114 0.106038,0.0114 0.03507,0 0.07406,0 0.179292,0 0.105238,0 0.276735,0 0.389766,0 0.113031,0 0.167602,0 0.206578,0 0.03898,0 0.06237,0 0.07796,0 0.01559,0 0.02339,0 0.04247,0.004 0.01908,0.004 0.05029,0.0119 0.08106,0.0237 0.03077,0.0117 0.06195,0.0273 0.09783,0.0349 0.03588,0.008 0.07486,0.008 0.09688,0.0114 0.02202,0.004 0.02987,0.0117 0.05365,0.0276 0.02378,0.0158 0.06275,0.0392 0.113976,0.0588 0.05122,0.0195 0.113583,0.0351 0.151644,0.0505 0.03806,0.0154 0.0536,0.0309 0.08893,0.0584 0.03533,0.0275 0.08991,0.0665 0.120809,0.0896 0.03089,0.0232 0.03874,0.031 0.06314,0.039 0.0244,0.008 0.0634,0.0158 0.09333,0.0386 0.02993,0.0228 0.05333,0.0618 0.07437,0.0817 0.02105,0.0199 0.03664,0.0199 0.05557,0.024 0.01893,0.004 0.04235,0.012 0.09201,0.0776 0.04966,0.0656 0.127614,0.19036 0.178267,0.27217 0.05065,0.0818 0.07405,0.1208 0.08598,0.15493 0.01193,0.0341 0.01193,0.0653 0.02391,0.0902 0.01199,0.0249 0.03537,0.0405 0.04677,0.0546 0.0114,0.014 0.0114,0.0297 0.02386,0.043 0.01246,0.0133 0.03588,0.0211 0.0577,0.0284"
id="path889"
inkscape:connector-curvature="0"
inkscape:path-effect="#path-effect891"
inkscape:original-d="m 3.7183874,284.62876 c 0.026032,0.0363 0.049418,0.0753 0.070158,0.11693 0.041623,-0.003 0.0806,-0.003 0.1169305,0 0.049418,0.005 0.09619,0.0129 0.1403164,0.0234 0.072804,0.0285 0.1429624,0.0597 0.2104748,0.0935 0.088395,-0.003 0.1741437,-0.003 0.2572469,0 0.065009,0.0129 0.1273715,0.0285 0.1870888,0.0468 0.09619,0.005 0.1897342,0.013 0.2806329,0.0234 0.2598928,0.0519 0.5171398,0.10649 0.7717406,0.1637 0.2520977,0.0129 0.5015492,0.0285 0.7483549,0.0468 0.2988697,0.0285 0.5950932,0.0597 0.8886711,0.0935 0.1429624,-0.003 0.2832788,-0.003 0.4209495,0 0.174144,-0.003 0.3456418,-0.003 0.5144939,0 0.8133636,-0.003 1.624081,-0.003 2.4321533,0 0.19753,0.0285 0.392414,0.0597 0.584652,0.0935 0.06501,-0.003 0.127372,-0.003 0.187089,0 0.0728,-0.003 0.142962,-0.003 0.210474,0 0.135167,-0.003 0.267688,-0.003 0.397564,0 0.04942,-0.003 0.09619,-0.003 0.140316,0 0.04942,-0.003 0.09619,-0.003 0.140317,0 0.03383,-0.0104 0.06501,-0.0182 0.09354,-0.0234 0.03383,-0.003 0.06501,-0.003 0.09354,0 0.04162,-0.0104 0.0806,-0.0182 0.116931,-0.0234 0.04942,-0.003 0.09619,-0.003 0.140316,0 0.03383,-0.0182 0.06501,-0.0338 0.09354,-0.0468 0.09619,-0.003 0.189734,-0.003 0.280633,0 0.04162,-0.026 0.0806,-0.0494 0.11693,-0.0702 0.06501,-0.003 0.127372,-0.003 0.187089,0 0.05721,-0.026 0.111781,-0.0494 0.163702,-0.0702 0.02603,-0.003 0.04942,-0.003 0.07016,0 0.02603,-0.0104 0.04942,-0.0182 0.07016,-0.0234 0.04162,-0.003 0.0806,-0.003 0.11693,0 0.04162,-0.0338 0.0806,-0.065 0.116931,-0.0935 0.01044,-0.003 0.01824,-0.003 0.02339,0 0.02603,-0.003 0.04942,-0.003 0.07016,0 0.06501,-0.003 0.127371,-0.003 0.187088,0 0.18194,-0.003 0.361233,-0.003 0.53788,0 0.05721,-0.003 0.111781,-0.003 0.163703,0 0.03383,-0.003 0.06501,-0.003 0.09354,0 0.01824,-0.003 0.03383,-0.003 0.04677,0 0.01824,-0.0104 0.03383,-0.0182 0.04677,-0.0234 0.06501,-0.003 0.127372,-0.003 0.187089,0 0.111781,-0.003 0.220916,-0.003 0.327405,0 0.337847,-0.003 0.673047,-0.003 1.005602,0 0.135167,-0.003 0.267688,-0.003 0.397563,0 0.04942,-0.003 0.09619,-0.003 0.140317,0 0.01044,-0.003 0.01824,-0.003 0.02339,0 0.01044,-0.003 0.01824,-0.003 0.02339,0 0.01044,-0.0104 0.01824,-0.0182 0.02339,-0.0234 0.01824,-0.003 0.03383,-0.003 0.04677,0 0.03383,-0.0338 0.06501,-0.065 0.09354,-0.0935 0.02603,-0.0182 0.04942,-0.0338 0.07016,-0.0468 0.02603,-0.0104 0.04942,-0.0182 0.07016,-0.0234 0.01044,-0.026 0.01824,-0.0494 0.02339,-0.0702 0.02603,-0.003 0.04942,-0.003 0.07016,0 0.01044,-0.0104 0.01824,-0.0182 0.02339,-0.0234 0.01824,-0.0104 0.03383,-0.0182 0.04677,-0.0234 0.04162,-0.0182 0.0806,-0.0338 0.11693,-0.0468 0.03383,-0.0182 0.06501,-0.0338 0.09355,-0.0468 0.01044,-0.003 0.01824,-0.003 0.02339,0 0.01044,-0.0104 0.01824,-0.0182 0.02339,-0.0234 0.01824,-0.003 0.03383,-0.003 0.04677,0 0.03383,-0.003 0.06501,-0.003 0.09354,0 0.04942,-0.003 0.09619,-0.003 0.140317,0 0.01824,-0.003 0.03383,-0.003 0.04677,0 0.03383,0.005 0.06501,0.0129 0.09354,0.0234 0.04162,-0.003 0.0806,-0.003 0.116931,0 0.02603,0.0129 0.04942,0.0285 0.07016,0.0468 0.01044,-0.003 0.01824,-0.003 0.02339,0 0.03383,0.005 0.06501,0.0129 0.09355,0.0234 0.05721,-0.003 0.111781,-0.003 0.163702,0 0.04942,0.0207 0.09619,0.0441 0.140317,0.0702 0.03383,-0.003 0.06501,-0.003 0.09354,0 0.04162,-0.003 0.0806,-0.003 0.116931,0 0.174144,-0.003 0.345641,-0.003 0.514493,0 0.05721,-0.003 0.111781,-0.003 0.163703,0 0.02603,-0.003 0.04942,-0.003 0.07016,0 0.01044,-0.003 0.01824,-0.003 0.02339,0 0.03383,0.005 0.06501,0.0129 0.09354,0.0234 0.03383,0.0129 0.06501,0.0285 0.09354,0.0468 0.04162,-0.003 0.0806,-0.003 0.11693,0 0.01044,0.005 0.01824,0.0129 0.02339,0.0234 0.04162,0.0207 0.0806,0.0441 0.11693,0.0702 0.06501,0.0129 0.127372,0.0285 0.187089,0.0468 0.01824,0.013 0.03383,0.0285 0.04677,0.0468 0.05721,0.0363 0.111781,0.0753 0.163703,0.11693 0.01044,0.005 0.01824,0.0129 0.02339,0.0234 0.04162,0.005 0.0806,0.0129 0.116931,0.0234 0.02603,0.0363 0.04942,0.0753 0.07016,0.11693 0.01824,-0.003 0.03383,-0.003 0.04677,0 0.02603,0.005 0.04942,0.0129 0.07016,0.0234 0.0806,0.12208 0.158553,0.2468 0.233861,0.37417 0.02603,0.0363 0.04942,0.0753 0.07016,0.11693 0.0026,0.0285 0.0026,0.0597 0,0.0935 0.02603,0.0129 0.04942,0.0285 0.07016,0.0468 0.0026,0.0129 0.0026,0.0285 0,0.0468 0.02603,0.005 0.04942,0.0129 0.07016,0.0234" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 3.320824,285.08479 c 0.026032,0 0.049418,0 0.071383,0.0135 0.021965,0.0135 0.045367,0.0408 0.075293,0.0626 0.029926,0.0218 0.065005,0.0374 0.099659,0.0587 0.034655,0.0213 0.06975,0.0486 0.1167167,0.0798 0.046967,0.0313 0.1054411,0.0663 0.1579747,0.0994 0.052534,0.0331 0.099321,0.0643 0.1503107,0.0916 0.05099,0.0274 0.1055574,0.0507 0.1659126,0.078 0.060355,0.0273 0.1266289,0.0585 0.1927927,0.0916 0.066164,0.0331 0.1324323,0.0682 0.2088421,0.0974 0.07641,0.0292 0.1621589,0.0526 0.2478304,0.078 0.085672,0.0254 0.1714203,0.0527 0.2981264,0.0917 0.1267061,0.039 0.2943147,0.0897 0.4271924,0.11873 0.1328777,0.0291 0.2303278,0.0369 0.3195583,0.0546 0.08923,0.0177 0.171092,0.045 0.255282,0.0624 0.08419,0.0174 0.1699477,0.0252 0.2498226,0.033 0.079875,0.008 0.1539411,0.0156 0.2119728,0.0275 0.058032,0.0118 0.1009067,0.0274 0.1443693,0.035 0.043463,0.008 0.086338,0.008 0.1487004,0.008 0.062363,0 0.1442141,0 0.1948844,0 0.05067,0 0.070157,0 0.080463,0.002 0.010305,0.002 0.014254,0.006 0.019512,0.008 0.00526,0.002 0.00916,0.002 0.016953,0.002 0.00779,0 0.019489,0 0.035345,-0.005 0.015857,-0.005 0.035345,-0.0123 0.056516,-0.0156 0.021171,-0.003 0.044557,-0.003 0.068159,-0.005 0.023602,-0.002 0.046907,-0.006 0.06622,-0.008 0.019314,-0.002 0.034903,-0.002 0.066084,-0.002 0.031182,0 0.077954,0 0.1851398,0 0.1071863,0 0.2747866,0 0.397679,-0.004 0.1228925,-0.004 0.2008463,-0.0118 0.2552981,-0.0156 0.054452,-0.004 0.085634,-0.004 0.1304572,-0.004 0.044823,0 0.1032886,0 0.1792933,0 0.076005,0 0.1695492,0 0.2358099,0 0.066261,0 0.1052367,0 0.140117,0.002 0.03488,0.002 0.066075,0.006 0.099398,0.008 0.033323,0.002 0.068402,0.002 0.1226414,0.01 0.054239,0.008 0.1282949,0.0236 0.1966402,0.0352 0.068345,0.0116 0.1307201,0.0194 0.193077,0.0272 0.062357,0.008 0.1247318,0.0156 0.1890498,0.0234 0.064318,0.008 0.1305895,0.0156 0.1946801,0.0274 0.064091,0.0118 0.1264546,0.0274 0.1892136,0.035 0.06276,0.008 0.125121,0.008 0.189254,0.0116 0.06413,0.004 0.130401,0.0118 0.183194,0.0156 0.05279,0.004 0.09177,0.004 0.128802,0.004 0.03703,0 0.0721,0 0.120824,0 0.04872,0 0.111085,0 0.157859,0 0.04677,0 0.07795,0 0.110363,0.008 0.03241,0.008 0.06749,0.0237 0.09939,0.0312 0.0319,0.008 0.05918,0.008 0.08382,0.008"
id="path957"
inkscape:connector-curvature="0"
inkscape:path-effect="#path-effect959"
inkscape:original-d="m 3.320824,285.08479 c 0.026032,-0.003 0.049418,-0.003 0.070158,0 0.026032,0.0246 0.049418,0.0519 0.070158,0.0818 0.037725,0.0129 0.072804,0.0285 0.1052375,0.0468 0.037725,0.0246 0.072804,0.0519 0.1052372,0.0818 0.061111,0.0324 0.1195763,0.0675 0.1753957,0.10524 0.049418,0.0285 0.09619,0.0597 0.1403165,0.0935 0.057213,0.0207 0.1117809,0.0441 0.1637025,0.0702 0.068906,0.0285 0.1351671,0.0597 0.1987817,0.0935 0.068907,0.0324 0.1351671,0.0675 0.1987817,0.10524 0.088395,0.0207 0.174144,0.0441 0.257247,0.0702 0.088395,0.0246 0.1741437,0.0519 0.2572469,0.0819 0.1702462,0.048 0.3378465,0.0987 0.502801,0.15201 0.1000876,0.005 0.1975297,0.0129 0.2923259,0.0234 0.084497,0.0246 0.1663486,0.0519 0.245554,0.0818 0.088395,0.005 0.1741437,0.0129 0.257247,0.0234 0.076702,0.005 0.1507577,0.0129 0.2221677,0.0234 0.04552,0.0129 0.088395,0.0285 0.1286234,0.0468 0.04552,-0.003 0.088395,-0.003 0.1286235,0 0.084497,-0.003 0.1663483,-0.003 0.245554,0 0.022135,-0.003 0.041622,-0.003 0.058465,0 0.00654,10e-4 0.01044,0.005 0.011692,0.0117 0.00654,-0.003 0.010441,-0.003 0.011692,0 0.014338,-0.003 0.026032,-0.003 0.035079,0 0.022135,-0.0104 0.041623,-0.0182 0.058465,-0.0234 0.026032,-0.003 0.049418,-0.003 0.070158,0 0.026032,-0.007 0.049418,-0.0104 0.070158,-0.0117 0.018238,-0.003 0.033827,-0.003 0.046772,0 0.049418,-0.003 0.09619,-0.003 0.1403165,0 0.1702461,-0.003 0.3378464,-0.003 0.5028009,0 0.080599,-0.0104 0.1585529,-0.0182 0.2338607,-0.0234 0.033827,-0.003 0.065009,-0.003 0.093545,0 0.061111,-0.003 0.1195761,-0.003 0.1753955,0 0.09619,-0.003 0.1897345,-0.003 0.2806329,0 0.041623,-0.003 0.080599,-0.003 0.1169305,0 0.033827,0.001 0.065009,0.005 0.093545,0.0117 0.037725,-0.003 0.072804,-0.003 0.1052372,0 0.076702,0.0129 0.1507578,0.0285 0.222168,0.0468 0.065009,0.005 0.1273715,0.0129 0.1870885,0.0234 0.065009,0.005 0.1273717,0.0129 0.1870887,0.0234 0.068907,0.005 0.1351669,0.0129 0.1987817,0.0234 0.065008,0.0129 0.1273717,0.0285 0.1870887,0.0468 0.06501,-0.003 0.127372,-0.003 0.187089,0 0.06891,0.005 0.135167,0.0129 0.198782,0.0234 0.04162,-0.003 0.0806,-0.003 0.11693,0 0.03773,-0.003 0.0728,-0.003 0.105238,0 0.06501,-0.003 0.127371,-0.003 0.187088,0 0.03383,-0.003 0.06501,-0.003 0.09354,0 0.03773,0.0129 0.07281,0.0285 0.105238,0.0468 0.02993,-0.003 0.05721,-0.003 0.08185,0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 19.609232,285.59928 c 0.05089,0.0431 0.101573,0.0859 0.132392,0.11663 0.03082,0.0307 0.04251,0.0502 0.08177,0.0916 0.03926,0.0414 0.105527,0.10374 0.183291,0.19316 0.07776,0.0894 0.167412,0.20634 0.261105,0.31372 0.09369,0.10738 0.191133,0.20483 0.259227,0.2768 0.06809,0.072 0.107088,0.11875 0.148059,0.16559 0.04097,0.0468 0.08386,0.0936 0.109031,0.12259 0.02518,0.029 0.03297,0.0407 0.05136,0.053 0.01839,0.0123 0.04566,0.024 0.06055,0.0314 0.01489,0.007 0.01886,0.0114 0.02272,0.0153 0.0039,0.004 0.0078,0.008 0.0118,0.0118"
id="path961"
inkscape:connector-curvature="0"
inkscape:path-effect="#path-effect963"
inkscape:original-d="m 19.609232,285.59928 c 0.05332,0.0402 0.103985,0.0831 0.152009,0.12863 0.01434,0.0168 0.02603,0.0363 0.03508,0.0585 0.06891,0.0597 0.135166,0.12208 0.198781,0.18709 0.09229,0.11429 0.181939,0.23122 0.26894,0.35079 0.100088,0.0948 0.19753,0.19224 0.292326,0.29233 0.04162,0.0441 0.0806,0.0909 0.116931,0.14031 0.04552,0.0441 0.08839,0.0909 0.128623,0.14032 0.01044,0.009 0.01824,0.0207 0.02339,0.0351 0.02993,0.009 0.05721,0.0207 0.08185,0.0351 0.0065,0.001 0.01044,0.005 0.01169,0.0117 0.0065,10e-4 0.01044,0.005 0.01169,0.0117" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 18.007285,285.66944 c 0.05439,0.0622 0.108971,0.12454 0.145896,0.16919 0.03693,0.0446 0.05643,0.0719 0.09159,0.11495 0.03516,0.043 0.08584,0.10148 0.130816,0.14841 0.04497,0.0469 0.08396,0.082 0.120846,0.1189 0.03688,0.0369 0.07197,0.0759 0.111076,0.11498 0.03911,0.0391 0.08199,0.0781 0.116858,0.11488 0.03486,0.0368 0.06216,0.0719 0.08032,0.0918 0.01816,0.0199 0.02599,0.0238 0.03915,0.0353 0.01316,0.0115 0.0326,0.0309 0.04423,0.0426 0.01163,0.0116 0.0156,0.0156 0.01946,0.0195 0.0039,0.004 0.0078,0.008 0.01307,0.01 0.0052,0.002 0.0092,0.002 0.01043,0.002"
id="path965"
inkscape:connector-curvature="0"
inkscape:path-effect="#path-effect967"
inkscape:original-d="m 18.007285,285.66944 c 0.05721,0.0597 0.111781,0.12208 0.163703,0.18709 0.02213,0.0246 0.04162,0.0519 0.05846,0.0818 0.05332,0.0558 0.103985,0.11429 0.152009,0.1754 0.04162,0.0324 0.0806,0.0675 0.116931,0.10523 0.03772,0.0363 0.0728,0.0753 0.105237,0.11694 0.04552,0.0363 0.0884,0.0753 0.128624,0.11693 0.02993,0.0324 0.05721,0.0675 0.08185,0.10523 0.01044,10e-4 0.01823,0.005 0.02339,0.0117 0.02213,0.0169 0.04162,0.0363 0.05847,0.0585 0.0065,10e-4 0.01044,0.005 0.01169,0.0117 0.0065,0.001 0.01044,0.005 0.01169,0.0117 0.0065,-0.003 0.01044,-0.003 0.01169,0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 3.7183874,284.62876 c -0.04622,0.0476 -0.095074,0.0979 -0.1247472,0.1263 -0.029673,0.0284 -0.040496,0.0338 -0.06012,0.0499 -0.019624,0.016 -0.047201,0.0436 -0.063735,0.0587 -0.016535,0.0151 -0.022045,0.0151 -0.027592,0.0166 -0.00555,0.001 -0.010808,0.007 -0.02168,0.0131 -0.010872,0.006 -0.027258,0.0118 -0.049749,0.0302 -0.022491,0.0184 -0.050068,0.0515 -0.068992,0.0714 -0.018924,0.0199 -0.029747,0.0253 -0.038387,0.0304 -0.00864,0.005 -0.013901,0.0103 -0.02279,0.0239 -0.00889,0.0136 -0.0199,0.0356 -0.035569,0.0529 -0.01567,0.0173 -0.037865,0.0284 -0.05271,0.0414 -0.014845,0.013 -0.020347,0.0295 -0.025104,0.0408 -0.00476,0.0113 -0.010019,0.0166 -0.014187,0.0277 -0.00417,0.0111 -0.00417,0.0276 -0.00564,0.0387 -0.00147,0.0111 -0.00673,0.0163 -0.010898,0.0302 -0.00417,0.0139 -0.00417,0.0359 -0.011117,0.0552 -0.00695,0.0193 -0.023468,0.0358 -0.033064,0.0579 -0.0096,0.022 -0.0096,0.0496 -0.011065,0.0662 -0.00147,0.0166 -0.00673,0.0218 -0.010899,0.0357 -0.00417,0.0139 -0.00417,0.036 -0.00667,0.0633 -0.0025,0.0273 -0.00802,0.0604 -0.011027,0.0937 -0.00301,0.0332 -0.00301,0.0663 -0.00696,0.0861 -0.00395,0.0198 -0.014777,0.0252 -0.021948,0.0303 -0.00717,0.005 -0.00717,0.0101 -0.00717,0.0158 0,0.006 0,0.0107 0,0.0247 0,0.014 0,0.036 0,0.0498 0,0.0138 0,0.0188 0,0.0246 0,0.006 0,0.0107 -0.0045,0.0217 -0.0045,0.011 -0.015506,0.0275 -0.022041,0.0388 -0.00653,0.0113 -0.00653,0.0163 -0.00653,0.033 0,0.0167 0,0.0443 0,0.0609 0,0.0166 0,0.0216 0,0.0273 0,0.006 0,0.0108 -0.00147,0.0165 -0.00147,0.006 -0.00673,0.011 -0.010899,0.0276 -0.00417,0.0166 -0.00417,0.0442 -0.00605,0.0631 -0.00189,0.0189 -0.00754,0.0302 -0.011097,0.047 -0.00355,0.0168 -0.00355,0.0388 -0.00765,0.0553 -0.00409,0.0164 -0.0153,0.0277 -0.02214,0.0414 -0.00684,0.0138 -0.00684,0.0303 -0.011561,0.0493 -0.00472,0.019 -0.015731,0.041 -0.022042,0.0577 -0.00631,0.0166 -0.00631,0.028 -0.010404,0.039 -0.00409,0.0109 -0.0153,0.0222 -0.02214,0.0359 -0.00684,0.0138 -0.00684,0.0303 -0.00684,0.0414 0,0.0111 0,0.0161 -0.00147,0.0218 -0.00147,0.006 -0.00673,0.011 -0.013127,0.0218 -0.0064,0.0108 -0.011899,0.0273 -0.016622,0.0372 -0.00472,0.01 -0.010233,0.01 -0.016198,0.0136 -0.00596,0.004 -0.011623,0.0151 -0.018729,0.0293"
id="path973"
inkscape:connector-curvature="0"
inkscape:path-effect="#path-effect975"
inkscape:original-d="m 3.7183874,284.62876 c -0.046192,0.0476 -0.095029,0.0979 -0.1465122,0.1508 -0.00838,0.003 -0.019402,0.008 -0.033073,0.0165 -0.024916,0.0249 -0.052476,0.0525 -0.082682,0.0827 -0.00287,-0.003 -0.00838,-0.003 -0.016536,0 -0.00287,0.003 -0.00838,0.008 -0.016537,0.0165 -0.013891,0.003 -0.030427,0.008 -0.049609,0.0165 -0.024916,0.0304 -0.052476,0.0635 -0.082682,0.0992 -0.00838,0.003 -0.019402,0.008 -0.033073,0.0165 -0.00287,0.003 -0.00838,0.008 -0.016536,0.0165 -0.00838,0.0194 -0.019402,0.0414 -0.033073,0.0661 -0.019402,0.008 -0.041451,0.0194 -0.066146,0.0331 -0.00287,0.0139 -0.00838,0.0304 -0.016536,0.0496 -0.00287,0.003 -0.00838,0.008 -0.016537,0.0165 0.00265,0.0139 0.00265,0.0304 0,0.0496 -0.00287,0.003 -0.00838,0.008 -0.016536,0.0165 0.00265,0.0194 0.00265,0.0414 0,0.0661 -0.013891,0.0139 -0.030427,0.0304 -0.049609,0.0496 0.00265,0.0249 0.00265,0.0525 0,0.0827 -0.00287,0.003 -0.00838,0.008 -0.016536,0.0165 0.00265,0.0194 0.00265,0.0415 0,0.0661 -0.00287,0.0304 -0.00838,0.0635 -0.016536,0.0992 0.00265,0.0304 0.00265,0.0635 0,0.0992 -0.00838,0.003 -0.019402,0.008 -0.033073,0.0165 0.00265,0.003 0.00265,0.008 0,0.0165 0.00265,0.003 0.00265,0.008 0,0.0165 0.00265,0.0194 0.00265,0.0414 0,0.0661 0.00265,0.003 0.00265,0.008 0,0.0165 0.00265,0.003 0.00265,0.008 0,0.0165 -0.00838,0.0139 -0.019402,0.0304 -0.033073,0.0496 0.00265,0.003 0.00265,0.008 0,0.0165 0.00265,0.0249 0.00265,0.0525 0,0.0827 0.00265,0.003 0.00265,0.008 0,0.0165 0.00265,0.003 0.00265,0.008 0,0.0165 -0.00287,0.003 -0.00838,0.008 -0.016536,0.0165 0.00265,0.0249 0.00265,0.0525 0,0.0827 -0.00287,0.008 -0.00838,0.0194 -0.016536,0.0331 0.00265,0.0194 0.00265,0.0414 0,0.0661 -0.00838,0.008 -0.019402,0.0194 -0.033073,0.0331 0.00265,0.0139 0.00265,0.0304 0,0.0496 -0.00838,0.0194 -0.019402,0.0414 -0.033073,0.0661 0.00265,0.008 0.00265,0.0194 0,0.0331 -0.00838,0.008 -0.019402,0.0194 -0.033073,0.0331 0.00265,0.0139 0.00265,0.0304 0,0.0496 0.00265,0.003 0.00265,0.008 0,0.0165 -0.00287,0.003 -0.00838,0.008 -0.016536,0.0165 -0.00287,0.0139 -0.00838,0.0304 -0.016536,0.0496 -0.00287,-0.003 -0.00838,-0.003 -0.016537,0 -0.00287,0.008 -0.00838,0.0194 -0.016536,0.0331" />
<path
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 17.164845,288.93021 6.746875,2.4474 -3.208073,0.76067 -0.529167,2.64584 -3.009635,-5.72162"
id="path981"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="m 20.703647,292.13828 4.57671,3.90289"
id="path983"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 31 KiB

View File

@@ -0,0 +1,135 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="find-advanced.svg">
<defs
id="defs5285">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 15 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="30 : 15 : 1"
inkscape:persp3d-origin="15 : 10 : 1"
id="perspective5921" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.9999996"
inkscape:cx="96.758243"
inkscape:cy="75.073314"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<flowRoot
xml:space="preserve"
id="flowRoot5913"
style="fill:black;fill-opacity:1;stroke:none;font-family:sans-serif;font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;letter-spacing:0px;word-spacing:0px"><flowRegion
id="flowRegion5915"><rect
id="rect5917"
width="129.22377"
height="91.747108"
x="-13.788582"
y="-33.515606" /></flowRegion><flowPara
id="flowPara5919" /></flowRoot> <g
id="g849"
transform="translate(-1.0583333,1.5875)">
<ellipse
ry="4.8121095"
rx="4.8741207"
cy="275.09717"
cx="12.618022"
id="path5985"
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.75;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path5987"
d="m 16.10308,278.8923 4.861718,5.45703"
style="fill:none;stroke:#000000;stroke-width:0.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="3.0603709"
y="293.01346"
id="text845"><tspan
sodipodi:role="line"
id="tspan843"
x="3.0603709"
y="293.01346"
style="stroke-width:0.26458332">abc</tspan></text>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="19.719973"
y="276.62527"
id="text853"><tspan
sodipodi:role="line"
id="tspan851"
x="19.719973"
y="276.62527"
style="stroke-width:0.26458332">+</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

@@ -0,0 +1,129 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="find-next.svg">
<defs
id="defs5285">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 15 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="30 : 15 : 1"
inkscape:persp3d-origin="15 : 10 : 1"
id="perspective5921" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.9999996"
inkscape:cx="55.758238"
inkscape:cy="75.073314"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<flowRoot
xml:space="preserve"
id="flowRoot5913"
style="fill:black;fill-opacity:1;stroke:none;font-family:sans-serif;font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;letter-spacing:0px;word-spacing:0px"><flowRegion
id="flowRegion5915"><rect
id="rect5917"
width="129.22377"
height="91.747108"
x="-13.788582"
y="-33.515606" /></flowRegion><flowPara
id="flowPara5919" /></flowRoot> <g
id="g849"
transform="translate(-1.0583333,1.5875)">
<ellipse
ry="4.8121095"
rx="4.8741207"
cy="275.09717"
cx="12.618022"
id="path5985"
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.75;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path5987"
d="m 16.10308,278.8923 4.861718,5.45703"
style="fill:none;stroke:#000000;stroke-width:0.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="3.0603709"
y="293.01346"
id="text845"><tspan
sodipodi:role="line"
id="tspan843"
x="3.0603709"
y="293.01346"
style="stroke-width:0.26458332">abc</tspan></text>
<path
inkscape:connector-curvature="0"
id="path1452"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:1;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
d="m 20.889681,277.28864 v -7.4104 l 7.410401,3.65352 v 0.10335 z m 5.648234,-3.7052 -4.80074,-2.36679 v 4.73357 z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.9 KiB

View File

@@ -0,0 +1,129 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="find-previous.svg">
<defs
id="defs5285">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 15 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="30 : 15 : 1"
inkscape:persp3d-origin="15 : 10 : 1"
id="perspective5921" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.9999996"
inkscape:cx="82.945743"
inkscape:cy="75.073314"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<flowRoot
xml:space="preserve"
id="flowRoot5913"
style="fill:black;fill-opacity:1;stroke:none;font-family:sans-serif;font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;letter-spacing:0px;word-spacing:0px"><flowRegion
id="flowRegion5915"><rect
id="rect5917"
width="129.22377"
height="91.747108"
x="-13.788582"
y="-33.515606" /></flowRegion><flowPara
id="flowPara5919" /></flowRoot> <g
id="g849"
transform="translate(-1.0583333,1.5875)">
<ellipse
ry="4.8121095"
rx="4.8741207"
cy="275.09717"
cx="12.618022"
id="path5985"
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.75;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path5987"
d="m 16.10308,278.8923 4.861718,5.45703"
style="fill:none;stroke:#000000;stroke-width:0.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="3.0603709"
y="293.01346"
id="text845"><tspan
sodipodi:role="line"
id="tspan843"
x="3.0603709"
y="293.01346"
style="stroke-width:0.26458332">abc</tspan></text>
<path
inkscape:connector-curvature="0"
id="path863"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
d="m 20.546549,273.40342 v -0.10335 l 7.410401,-3.65352 v 7.4104 z m 6.562907,2.31511 v -4.73356 l -4.80074,2.36678 z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.9 KiB

View File

@@ -0,0 +1,124 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="find.svg">
<defs
id="defs5285">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 15 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="30 : 15 : 1"
inkscape:persp3d-origin="15 : 10 : 1"
id="perspective5921" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.313708"
inkscape:cx="92.712655"
inkscape:cy="75.073314"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<flowRoot
xml:space="preserve"
id="flowRoot5913"
style="fill:black;fill-opacity:1;stroke:none;font-family:sans-serif;font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;letter-spacing:0px;word-spacing:0px"><flowRegion
id="flowRegion5915"><rect
id="rect5917"
width="129.22377"
height="91.747108"
x="-13.788582"
y="-33.515606" /></flowRegion><flowPara
id="flowPara5919" /></flowRoot> <g
id="g849"
transform="translate(-1.0583333,1.5875)">
<ellipse
ry="4.8121095"
rx="4.8741207"
cy="275.09717"
cx="12.618022"
id="path5985"
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.75;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path5987"
d="m 16.10308,278.8923 4.861718,5.45703"
style="fill:none;stroke:#000000;stroke-width:0.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="3.0603709"
y="293.01346"
id="text845"><tspan
sodipodi:role="line"
id="tspan843"
x="3.0603709"
y="293.01346"
style="stroke-width:0.26458332">abc</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

@@ -0,0 +1,179 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="form-settings.svg">
<defs
id="defs5285">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 15 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="30 : 15 : 1"
inkscape:persp3d-origin="15 : 10 : 1"
id="perspective5921" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.35355338"
inkscape:cx="-1690.1311"
inkscape:cy="379.57968"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<flowRoot
xml:space="preserve"
id="flowRoot5913"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"><flowRegion
id="flowRegion5915"><rect
id="rect5917"
width="129.22377"
height="91.747108"
x="-13.788582"
y="-33.515606" /></flowRegion><flowPara
id="flowPara5919" /></flowRoot> <flowRoot
xml:space="preserve"
id="flowRoot843"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"><flowRegion
id="flowRegion845"><rect
id="rect847"
width="159.09903"
height="129.04698"
x="-37.123108"
y="-35.460152" /></flowRegion><flowPara
id="flowPara849" /></flowRoot> <rect
style="fill:none;fill-opacity:0;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="rect4554"
width="27.455263"
height="25.116655"
x="1.4499372"
y="269.49796" />
<rect
style="fill:none;fill-opacity:0;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="rect4556"
width="12.160765"
height="4.0457926"
x="14.686461"
y="271.22855" />
<rect
style="fill:none;fill-opacity:0;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="rect4558"
width="12.230922"
height="3.3675961"
x="14.639688"
y="277.92294" />
<rect
style="fill:none;fill-opacity:0;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="rect4560"
width="12.511556"
height="8.5827026"
x="14.546144"
y="284.09088" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="2.8998747"
y="273.9881"
id="text4568"><tspan
sodipodi:role="line"
id="tspan4566"
x="2.8998747"
y="273.9881"
style="stroke-width:0.26458332">lorem i</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="2.9466467"
y="278.38467"
id="text4572"><tspan
sodipodi:role="line"
id="tspan4570"
x="2.9466467"
y="278.38467"
style="stroke-width:0.26458332">dolor</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="3.0427084"
y="282.5802"
id="text4576"><tspan
sodipodi:role="line"
id="tspan4574"
x="3.0427084"
y="282.5802"
style="stroke-width:0.26458332">sil </tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="6.5153646"
y="282.44794"
id="text4580"><tspan
sodipodi:role="line"
id="tspan4578"
x="6.5153646"
y="282.44794"
style="stroke-width:0.26458332">amet</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.2 KiB

View File

@@ -0,0 +1,109 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="highlight.svg">
<defs
id="defs5285">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 15 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="30 : 15 : 1"
inkscape:persp3d-origin="15 : 10 : 1"
id="perspective5921" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.9999996"
inkscape:cx="51.633241"
inkscape:cy="75.073314"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<g
aria-label="ab"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.39999962px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
id="text972">
<path
d="M 12.265918,291.11298 H 9.9466794 v -1.47588 q -0.3100586,0.21084 -0.8433593,0.59531 -0.5208985,0.37207 -1.0169922,0.59531 -0.5829102,0.28526 -1.3394531,0.47129 -0.756543,0.19844 -1.7735352,0.19844 -1.8727538,0 -3.1749999,-1.24024 -1.30224608,-1.24023 -1.30224608,-3.16259 0,-1.5751 0.66972658,-2.54248 0.6821289,-0.97979 1.9347656,-1.53789 1.265039,-0.55811 3.0385741,-0.75655 1.7735352,-0.19843 3.8075195,-0.29765 v -0.35967 q 0,-0.79375 -0.2852539,-1.31465 -0.2728515,-0.5209 -0.79375,-0.81855 -0.4960937,-0.28526 -1.190625,-0.38448 -0.6945312,-0.0992 -1.4510742,-0.0992 -0.9177734,0 -2.0463866,0.24805 -1.1286133,0.23565 -2.3316406,0.69453 H 1.7239256 v -2.36885 q 0.6821289,-0.18603 1.9719727,-0.40927 1.2898437,-0.22324 2.5424804,-0.22324 1.4634765,0 2.5424804,0.24804 1.0914063,0.23565 1.8851559,0.81856 0.781348,0.5705 1.190625,1.47588 0.409278,0.90537 0.409278,2.24482 z m -2.3192386,-3.41065 v -3.85713 q -1.0666015,0.062 -2.5176757,0.18604 -1.4386719,0.12402 -2.2820312,0.35967 -1.0045899,0.28525 -1.624707,0.89296 -0.6201172,0.59532 -0.6201172,1.64952 0,1.19062 0.7193359,1.79834 0.7193359,0.59531 2.1952148,0.59531 1.227832,0 2.2448242,-0.47129 1.0169922,-0.48369 1.8851562,-1.15342 z"
style="stroke-width:0.26458332"
id="path2227"
inkscape:connector-curvature="0" />
<path
d="m 28.971874,284.08085 q 0,1.73633 -0.496094,3.12539 -0.483691,1.38906 -1.314648,2.33164 -0.880566,0.97978 -1.934766,1.47588 -1.054199,0.48369 -2.319238,0.48369 -1.178223,0 -2.058789,-0.28526 -0.880566,-0.27285 -1.736328,-0.74414 l -0.148828,0.64493 H 16.78037 v -19.29805 h 2.331641 v 6.8957 q 0.979785,-0.80615 2.083594,-1.31465 1.103808,-0.52089 2.480468,-0.52089 2.455664,0 3.869532,1.88515 1.426269,1.88516 1.426269,5.32061 z m -2.406055,0.062 q 0,-2.48047 -0.818554,-3.75791 -0.818555,-1.28984 -2.641699,-1.28984 -1.016993,0 -2.058789,0.44648 -1.041797,0.43408 -1.934766,1.12861 v 7.9375 q 0.992187,0.44649 1.699121,0.62012 0.719336,0.17363 1.624707,0.17363 1.934766,0 3.026172,-1.26504 1.103808,-1.27744 1.103808,-3.99355 z"
style="stroke-width:0.26458332"
id="path2229"
inkscape:connector-curvature="0" />
</g>
<rect
style="opacity:1;fill:#ffff00;fill-opacity:0.25490198;stroke:none;stroke-width:1.89999998;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="rect2232"
width="28.442711"
height="19.744532"
x="0.52916664"
y="271.76535" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.6 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.2 KiB

View File

@@ -0,0 +1,126 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="info.svg">
<defs
id="defs5285">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 15 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="30 : 15 : 1"
inkscape:persp3d-origin="15 : 10 : 1"
id="perspective5921" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.313708"
inkscape:cx="99.193261"
inkscape:cy="59.167828"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<flowRoot
xml:space="preserve"
id="flowRoot5913"
style="fill:black;fill-opacity:1;stroke:none;font-family:sans-serif;font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;letter-spacing:0px;word-spacing:0px"><flowRegion
id="flowRegion5915"><rect
id="rect5917"
width="129.22377"
height="91.747108"
x="-13.788582"
y="-33.515606" /></flowRegion><flowPara
id="flowPara5919" /></flowRoot> <g
aria-label="i"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.39999962px;line-height:1.25;font-family:'Palatino Linotype';-inkscape-font-specification:'Palatino Linotype Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
id="text841">
<path
d="m 14.342202,274.30462 q 0,-0.65732 0.409277,-1.15342 0.42168,-0.50849 1.016992,-0.50849 0.42168,0 0.682129,0.26045 0.260449,0.26044 0.260449,0.74414 0,0.66972 -0.384472,1.20302 -0.384473,0.5209 -0.967383,0.5209 -0.434082,0 -0.731738,-0.29765 -0.285254,-0.29766 -0.285254,-0.76895 z m -3.237012,6.92051 -0.124023,-0.28526 0.03721,-0.16123 q 1.686718,-1.21543 2.592089,-1.69912 0.917774,-0.49609 1.438672,-0.49609 0.508496,0 0.508496,0.73174 0,0.33486 -0.136425,0.95498 -0.124024,0.60771 -0.620118,2.46806 -1.351855,5.01055 -1.351855,5.92832 0,0.4961 0.347266,0.4961 0.5333,0 1.934765,-1.0542 l 0.124024,0.0372 0.136425,0.32246 -0.0248,0.14883 q -0.868164,0.66972 -1.785938,1.28984 -0.917773,0.62012 -1.314648,0.78135 -0.384473,0.17363 -0.644922,0.17363 -0.37207,0 -0.58291,-0.32246 -0.21084,-0.32246 -0.21084,-0.75654 0,-0.55811 0.148828,-1.19063 0.161231,-0.64492 0.384473,-1.42627 0.806152,-2.87734 1.141015,-4.48965 0.347266,-1.6123 0.347266,-1.97197 0,-0.42168 -0.285254,-0.42168 -0.186035,0 -0.359668,0.0992 -0.173633,0.0868 -1.562695,0.89297 z m 1.314648,10.5916 z"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.39999962px;font-family:'Palatino Linotype';-inkscape-font-specification:'Palatino Linotype Italic';stroke-width:0.26458332"
id="path870" />
</g>
<flowRoot
xml:space="preserve"
id="flowRoot843"
style="fill:black;fill-opacity:1;stroke:none;font-family:sans-serif;font-style:italic;font-weight:normal;font-size:40px;line-height:1.25;letter-spacing:0px;word-spacing:0px;-inkscape-font-specification:'sans-serif Italic';font-stretch:normal;font-variant:normal"><flowRegion
id="flowRegion845"><rect
id="rect847"
width="159.09903"
height="129.04698"
x="-37.123108"
y="-35.460152" /></flowRegion><flowPara
id="flowPara849"></flowPara></flowRoot> <path
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="m 20.06526,273.38006 5.238482,-0.0234"
id="path853"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="m 22.626029,270.62098 0.0234,5.23848"
id="path853-4"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.0 KiB

View File

@@ -0,0 +1,109 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="magnifier.svg">
<defs
id="defs5285">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 15 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="30 : 15 : 1"
inkscape:persp3d-origin="15 : 10 : 1"
id="perspective5921" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.313708"
inkscape:cx="96.866908"
inkscape:cy="75.073314"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<flowRoot
xml:space="preserve"
id="flowRoot5913"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"><flowRegion
id="flowRegion5915"><rect
id="rect5917"
width="129.22377"
height="91.747108"
x="-13.788582"
y="-33.515606" /></flowRegion><flowPara
id="flowPara5919" /></flowRoot> <ellipse
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path5985"
cx="10.996745"
cy="278.08231"
rx="6.4988279"
ry="6.4161458" />
<path
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 15.64349,283.14245 6.482291,7.27604"
id="path5987"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@@ -0,0 +1,91 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="next-end.svg">
<defs
id="defs5285" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.2"
inkscape:cx="39.058699"
inkscape:cy="60.048176"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<path
style="fill:#000000;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
d="M 9.6856398,269.90383 9.9218749,293.97619 20.174479,281.5266 Z"
id="path5295"
inkscape:connector-curvature="0" />
<rect
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.30000001;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
id="rect5305"
width="2.0316212"
height="24.592079"
x="22.064362"
y="269.80933" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -0,0 +1,90 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="next-page.svg">
<defs
id="defs5285" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.2"
inkscape:cx="39.058699"
inkscape:cy="60.048176"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1"
showguides="false" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<path
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 15.756322,269.90383 0.236235,24.07236 10.252601,-12.44959 z"
id="path5295"
inkscape:connector-curvature="0" />
<path
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 4.4366768,269.86011 0.236235,24.07236 10.2526032,-12.44959 z"
id="path5295-7"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -0,0 +1,84 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="next.svg">
<defs
id="defs5285" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.2"
inkscape:cx="39.058699"
inkscape:cy="60.048176"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<path
style="fill:#000000;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
d="M 9.6856398,269.90383 9.9218749,293.97619 20.174479,281.5266 Z"
id="path5295"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -0,0 +1,103 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="open.svg">
<defs
id="defs5285" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.2"
inkscape:cx="61.228354"
inkscape:cy="24.722037"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<rect
style="fill:#dcdcdc;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5901"
width="23.147377"
height="20.895622"
x="2.3088903"
y="274.57504"
ry="0" />
<rect
style="fill:#dcdcdc;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5903"
width="5.1026788"
height="2.0788691"
x="2.3151042"
y="272.50241" />
<rect
style="fill:#dcdcdc;fill-opacity:1;stroke:#000000;stroke-width:0.44556388;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5901-2"
width="23.204285"
height="16.552702"
x="46.932369"
y="282.22354"
ry="0"
transform="matrix(1,0,-0.14834045,0.98893635,0,0)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@@ -0,0 +1,89 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="options.svg">
<defs
id="defs5285" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6568542"
inkscape:cx="101.46447"
inkscape:cy="10.379569"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<flowRoot
xml:space="preserve"
id="flowRoot5913"
style="fill:black;fill-opacity:1;stroke:none;font-family:sans-serif;font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;letter-spacing:0px;word-spacing:0px"><flowRegion
id="flowRegion5915"><rect
id="rect5917"
width="129.22377"
height="91.747108"
x="-13.788582"
y="-33.515606" /></flowRegion><flowPara
id="flowPara5919"></flowPara></flowRoot> </g>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -0,0 +1,93 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="pause.svg">
<defs
id="defs5285" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.2"
inkscape:cx="40.308699"
inkscape:cy="60.048176"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<rect
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.36963582;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="rect4530"
width="4.6841955"
height="23.677502"
x="6.920681"
y="269.88867" />
<rect
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.36963594;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="rect4530-3"
width="4.6841955"
height="23.677502"
x="18.016645"
y="269.91937" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -0,0 +1,84 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="play.svg">
<defs
id="defs5285" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.2"
inkscape:cx="39.058699"
inkscape:cy="60.048176"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<path
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 9.6856398,269.90383 9.9218749,293.97619 20.174479,281.5266 Z"
id="path5295"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -0,0 +1,99 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg8"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="plugins.svg">
<defs
id="defs2">
<inkscape:path-effect
effect="spiro"
id="path-effect831"
is_visible="true" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="142.64708"
inkscape:cy="113.44001"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 11.646391,283.58184 v 0 0"
id="path837"
inkscape:connector-curvature="0" />
<g
aria-label="🔌"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.39999962px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
id="text4540">
<path
d="m 23.50126,284.47675 q 1.016992,0.95498 1.835547,2.05879 0.830957,1.10381 1.413867,2.34404 0.58291,1.22784 0.892969,2.56729 0.310058,1.33945 0.310058,2.75332 v 1.78594 h -6.238379 v -1.78594 q 0,-1.5751 -0.669726,-2.92695 -0.657324,-1.33946 -1.785938,-2.41846 h -1.302246 q -0.347265,0.24805 -0.756543,0.38447 -0.396875,0.13643 -0.830957,0.13643 -0.545703,0 -1.029394,-0.19844 -0.483692,-0.19844 -0.868164,-0.58291 l -4.254004,-4.254 q -0.148828,0.0248 -0.3100587,0.0496 -0.1488281,0.0124 -0.2976563,0.0124 -0.6325195,0 -1.1906249,-0.23565 -0.5457032,-0.24804 -0.9673828,-0.65732 -0.4092774,-0.40928 -0.6449219,-0.96738 -0.2356445,-0.55811 -0.2356445,-1.19063 0,-0.47129 0.1364258,-0.90537 0.1364257,-0.44648 0.4092773,-0.83096 l -5.0105468,-5.02295 7.1313475,-7.13134 5.0105473,5.01054 q 0.384472,-0.26045 0.830957,-0.40927 0.446484,-0.14883 0.917773,-0.14883 0.63252,0 1.178223,0.24804 0.558105,0.23565 0.967382,0.64493 0.409278,0.40927 0.644922,0.96738 0.248047,0.5457 0.248047,1.17822 0,0.16123 -0.02481,0.32246 -0.0124,0.14883 -0.03721,0.29766 l 4.266407,4.26641 q 0.781347,0.78134 0.781347,1.88515 0,0.43408 -0.136426,0.84336 -0.136425,0.39688 -0.384472,0.74414 z m -7.094141,3.13779 q 0.248047,0 0.446485,-0.16123 0.173632,-0.13642 0.396875,-0.34726 0.223242,-0.21084 0.446484,-0.44649 0.235645,-0.23564 0.446484,-0.45888 0.21084,-0.22324 0.372071,-0.38448 l 3.199804,-3.1998 q 0.21084,-0.21084 0.359668,-0.38447 0.161231,-0.18604 0.161231,-0.5085 0,-0.37207 -0.260449,-0.63252 l -5.159375,-5.15937 q 0.198437,-0.19844 0.322461,-0.42168 0.124023,-0.23565 0.124023,-0.5209 0,-0.26045 -0.09922,-0.49609 -0.09922,-0.23565 -0.272851,-0.40928 -0.161231,-0.18604 -0.396875,-0.28526 -0.223242,-0.0992 -0.496094,-0.0992 -0.520898,0 -0.892969,0.37207 -1.612304,1.6123 -3.187402,3.1998 -1.575098,1.5875 -3.1998047,3.1874 -0.3720703,0.37207 -0.3720703,0.90537 0,0.26045 0.099219,0.48369 0.099219,0.22325 0.2728515,0.39688 0.1736328,0.17363 0.396875,0.27285 0.2356445,0.0992 0.4960937,0.0992 0.285254,0 0.5333008,-0.11162 0.260449,-0.12402 0.434082,-0.33486 l 5.159375,5.15937 q 0.285254,0.28525 0.669726,0.28525 z m 7.094141,6.58565 h 2.678906 q 0,-1.32705 -0.322461,-2.57969 -0.310058,-1.24023 -0.905371,-2.36885 -0.58291,-1.12861 -1.413867,-2.1208 -0.818555,-1.00459 -1.823145,-1.83554 l -1.785937,1.77353 q 0.806152,0.66973 1.463476,1.47588 0.657325,0.79375 1.128614,1.69912 0.471289,0.90537 0.719336,1.89756 0.260449,1.00459 0.260449,2.05879 z m -18.7151366,-19.60811 4.2664062,4.27881 0.8929687,-0.89297 -4.2788085,-4.2788 z m 4.4524413,-4.45244 -0.8929687,0.89297 4.278809,4.26641 0.880566,-0.89297 z m 8.2847653,8.90489 q 0.260449,0 0.446485,0.18603 0.186035,0.18604 0.186035,0.44648 0,0.26045 -0.186035,0.44649 l -3.199805,3.1998 q -0.186035,0.18604 -0.446484,0.18604 -0.26045,0 -0.446485,-0.18604 -0.186035,-0.18603 -0.186035,-0.44648 0,-0.26045 0.186035,-0.44648 l 3.199805,-3.19981 q 0.186035,-0.18603 0.446484,-0.18603 z m -2.046386,5.61826 q 0,-0.26045 0.186035,-0.44649 l 3.199804,-3.1998 q 0.186036,-0.18604 0.446485,-0.18604 0.260449,0 0.434082,0.18604 0.186035,0.18603 0.186035,0.44648 0,0.27285 -0.173633,0.44649 l -3.199805,3.1998 q -0.186035,0.18604 -0.446484,0.18604 -0.260449,0 -0.446484,-0.18604 -0.186035,-0.18603 -0.186035,-0.44648 z"
style="stroke-width:0.26458332"
id="path4545"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

@@ -0,0 +1,90 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="previous-page.svg">
<defs
id="defs5285" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.2"
inkscape:cx="39.058699"
inkscape:cy="60.048176"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1"
showguides="false" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<path
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 14.964432,269.90383 14.728197,293.97619 4.4755963,281.5266 Z"
id="path5295"
inkscape:connector-curvature="0" />
<path
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 26.284077,269.86011 26.047842,293.93247 15.795239,281.48288 Z"
id="path5295-7"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="previous-start.svg">
<defs
id="defs5285" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.2"
inkscape:cx="39.058699"
inkscape:cy="60.048176"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<path
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 23.960271,269.90383 23.724036,293.97619 13.471432,281.5266 Z"
id="path5295"
inkscape:connector-curvature="0" />
<rect
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.30000001;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
id="rect5305"
width="2.0316212"
height="24.592079"
x="-11.58155"
y="269.80933"
transform="scale(-1,1)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -0,0 +1,84 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="previous.svg">
<defs
id="defs5285" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.2"
inkscape:cx="39.058699"
inkscape:cy="60.048176"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<path
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 19.197768,269.90383 18.961533,293.97619 8.7089299,281.5266 Z"
id="path5295"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -0,0 +1,114 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="print.svg">
<defs
id="defs5285" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="15.839192"
inkscape:cx="43.479195"
inkscape:cy="22.801583"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<rect
style="fill:#000000;fill-opacity:0.9948007;stroke:#000000;stroke-width:0.37699473;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="rect831"
width="23.085983"
height="7.656455"
x="4.1268063"
y="279.67856" />
<rect
style="fill:none;fill-opacity:0.9948007;stroke:#000000;stroke-width:0.7492165;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="rect833"
width="14.933595"
height="2.2713938"
x="8.1247196"
y="287.44482" />
<rect
style="fill:none;fill-opacity:0.9948007;stroke:#000000;stroke-width:0.72756678;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="rect837"
width="17.304916"
height="5.3208041"
x="6.9582481"
y="274.62485" />
<rect
style="fill:#ffffff;fill-opacity:0.9948007;stroke:none;stroke-width:1.1373328;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="rect841"
width="1.508518"
height="1.3341492"
x="4.8337612"
y="280.19043" />
<rect
style="fill:#ffffff;fill-opacity:0.9948007;stroke:none;stroke-width:1.1373328;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="rect841-0"
width="1.508518"
height="1.3341492"
x="6.8714461"
y="280.19043" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

@@ -0,0 +1,112 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="quit.svg">
<defs
id="defs5285">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 15 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="30 : 15 : 1"
inkscape:persp3d-origin="15 : 10 : 1"
id="perspective5921" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.8284271"
inkscape:cx="63.141871"
inkscape:cy="206.73552"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<flowRoot
xml:space="preserve"
id="flowRoot5913"
style="fill:black;fill-opacity:1;stroke:none;font-family:sans-serif;font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;letter-spacing:0px;word-spacing:0px"><flowRegion
id="flowRegion5915"><rect
id="rect5917"
width="129.22377"
height="91.747108"
x="-13.788582"
y="-33.515606" /></flowRegion><flowPara
id="flowPara5919"></flowPara></flowRoot> <ellipse
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path5981"
cx="14.861856"
cy="281.98615"
rx="11.143468"
ry="10.897915" />
<rect
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.30000001;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5983"
width="4.3264256"
height="15.22434"
x="12.722029"
y="274.36227"
ry="1.9176588" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@@ -0,0 +1,108 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="redo.svg">
<defs
id="defs5285">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 15 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="30 : 15 : 1"
inkscape:persp3d-origin="15 : 10 : 1"
id="perspective5921" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.313708"
inkscape:cx="82.017664"
inkscape:cy="53.86011"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<flowRoot
xml:space="preserve"
id="flowRoot5913"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"><flowRegion
id="flowRegion5915"><rect
id="rect5917"
width="129.22377"
height="91.747108"
x="-13.788582"
y="-33.515606" /></flowRegion><flowPara
id="flowPara5919" /></flowRoot> <g
aria-label="⎌"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:38.09999847px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
id="text847"
transform="matrix(-1,0,0,1,29.656982,0)">
<path
d="m 11.014771,277.24364 -4.7252931,3.75791 -1.1348144,-5.93452 2.0835937,0.76274 q 1.1534179,-1.54409 2.8463378,-2.49287 2.195215,-1.24643 4.743896,-1.24643 2.548682,0 4.725293,1.22783 2.195215,1.20923 3.423047,3.36724 1.246435,2.158 1.246435,4.85551 v 0.11162 q 0.706934,0.14883 1.339453,0.5023 1.097608,0.61391 1.711524,1.69292 0.632519,1.079 0.632519,2.41846 0,1.33945 -0.613916,2.41845 -0.613916,1.0604 -1.711523,1.69292 -1.079004,0.61392 -2.38125,0.61392 -1.265039,0 -2.38125,-0.61392 -1.116211,-0.61391 -1.730127,-1.69292 -0.595312,-1.079 -0.595312,-2.41845 0,-1.30225 0.613916,-2.38125 0.632519,-1.09761 1.730127,-1.71153 0.799951,-0.46509 1.674316,-0.57671 v -0.0558 q 0,-2.26963 -1.023193,-4.05556 -1.00459,-1.78594 -2.771924,-2.73472 -1.767334,-0.96738 -3.888135,-0.96738 -2.046386,0 -3.81372,0.96738 -1.2092287,0.65112 -2.0649904,1.71152 z m -4.5578614,4.29741 q 1.2836425,0 2.3626464,0.61392 1.0976073,0.61391 1.711523,1.69292 0.63252,1.079 0.63252,2.41846 0,1.33945 -0.613916,2.41845 -0.6139161,1.0604 -1.7115235,1.69292 -1.0790039,0.61392 -2.3812499,0.61392 -1.265039,0 -2.3812499,-0.61392 -1.1162109,-0.61391 -1.7301269,-1.69292 -0.5953125,-1.079 -0.5953125,-2.41845 0,-1.30225 0.613916,-2.38125 0.6325195,-1.09761 1.7301269,-1.71153 1.0976074,-0.63252 2.3626464,-0.63252 z m 0,1.39527 q -0.8557617,0 -1.6185058,0.40927 -0.7627441,0.40928 -1.2092285,1.19063 -0.4278808,0.76274 -0.4278808,1.73013 0,0.93017 0.4092773,1.73012 0.4278808,0.79995 1.2092285,1.20923 0.7813476,0.40928 1.6371093,0.40928 0.9301757,0 1.6743163,-0.40928 0.7441406,-0.40928 1.190625,-1.20923 0.4464843,-0.79995 0.4464843,-1.73012 0,-0.96739 -0.4464843,-1.73013 -0.4464844,-0.78135 -1.2092285,-1.19063 -0.7441406,-0.40927 -1.6557128,-0.40927 z m 16.7431634,0 q -0.855762,0 -1.618506,0.40927 -0.762744,0.40928 -1.209228,1.19063 -0.427881,0.76274 -0.427881,1.73013 0,0.93017 0.409277,1.73012 0.427881,0.79995 1.209229,1.20923 0.781347,0.40928 1.637109,0.40928 0.930176,0 1.674316,-0.40928 0.744141,-0.40928 1.190625,-1.20923 0.446485,-0.79995 0.446485,-1.73012 0,-0.96739 -0.446485,-1.73013 -0.446484,-0.78135 -1.209228,-1.19063 -0.744141,-0.40927 -1.655713,-0.40927 z"
style="stroke-width:0.39687496"
id="path4552"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

@@ -0,0 +1,100 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="rendering-errors.svg">
<defs
id="defs5285" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6568542"
inkscape:cx="101.46447"
inkscape:cy="10.379569"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.39999962px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="9.9129448"
y="290.49152"
id="text5911"><tspan
sodipodi:role="line"
id="tspan5909"
x="9.9129448"
y="290.49152"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.39999962px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">!</tspan></text>
<flowRoot
xml:space="preserve"
id="flowRoot5913"
style="fill:black;fill-opacity:1;stroke:none;font-family:sans-serif;font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;letter-spacing:0px;word-spacing:0px"><flowRegion
id="flowRegion5915"><rect
id="rect5917"
width="129.22377"
height="91.747108"
x="-13.788582"
y="-33.515606" /></flowRegion><flowPara
id="flowPara5919"></flowPara></flowRoot> </g>
</svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@@ -0,0 +1,180 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg8"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="rendering.svg">
<defs
id="defs2">
<inkscape:path-effect
effect="spiro"
id="path-effect831"
is_visible="true" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.49497475"
inkscape:cx="694.55995"
inkscape:cy="-932.70025"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 10.455023,281.11018 -2.4568452,2.59858 5.7168902,5.43341 2.362351,-2.69308 z"
id="path833"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 11.646391,283.58184 v 0 0"
id="path837"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 12.746504,283.28353 8.398159,-9.68564 1.700893,1.6064 -8.480841,9.47303"
id="path841"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.30000001;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
id="path865"
d="m 8.3713382,284.05314 c -0.018034,0.0193 -0.036502,0.0382 -0.054101,0.0579 -0.049186,0.055 -0.096139,0.11201 -0.1452859,0.16707 -0.1103434,0.12361 -0.2237144,0.2445 -0.3368714,0.36552 -0.2850933,0.31034 -0.6018538,0.58865 -0.9201179,0.86397 -0.2626638,0.22143 -0.5302364,0.43692 -0.7867095,0.66559 -0.1238009,0.11023 -0.2323883,0.23579 -0.3370228,0.36392 -0.067753,0.0837 -0.125794,0.17481 -0.1849006,0.26472 -0.08191,0.1179 -0.1738633,0.22877 -0.2630763,0.34126 -0.085684,0.10448 -0.1734288,0.20793 -0.2704441,0.30213 -0.050004,0.047 -0.024738,0.0243 -0.075737,0.0681 0,0 -0.2283777,0.0922 -0.2283777,0.0922 v 0 c 0.052077,-0.0423 0.02644,-0.02 0.076795,-0.0669 0.099577,-0.0916 0.186691,-0.19605 0.2734503,-0.29963 0.048223,-0.0604 0.095661,-0.12145 0.1436299,-0.18207 0.028413,-0.0359 0.058147,-0.0708 0.085416,-0.10759 0.01174,-0.0158 0.022265,-0.0325 0.033396,-0.0488 0.058628,-0.0908 0.1171953,-0.18222 0.1840407,-0.26724 0.1062736,-0.12969 0.2156241,-0.25765 0.340863,-0.36966 0.2583407,-0.22973 0.5282123,-0.44572 0.7925908,-0.66837 0.3181959,-0.2742 0.63567,-0.5507 0.9196864,-0.86106 0.1116182,-0.12 0.2233358,-0.23998 0.3320497,-0.36263 0.1567236,-0.17683 0.00534,-0.008 0.1417119,-0.16622 0.016632,-0.0193 0.034068,-0.0379 0.051102,-0.0568 0,0 0.2279134,-0.0953 0.2279134,-0.0953 z"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.30000001;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
id="path877"
d="m 8.6488388,284.44136 c -0.1229037,0.25431 -0.2648902,0.49839 -0.4153024,0.73723 -0.1559656,0.23826 -0.3171897,0.47306 -0.4809215,0.70604 -0.077636,0.11473 -0.1604039,0.22551 -0.2529216,0.32864 -0.062753,0.0649 -0.1278966,0.12748 -0.2007438,0.181 -0.1292241,0.0886 -0.5009716,0.28443 -0.1096346,0.0661 0.015552,-0.009 -0.030457,0.0185 -0.04542,0.0281 -0.2211146,0.14269 0.1208122,-0.075 -0.1079396,0.0703 -0.2088521,0.13083 -0.4204237,0.2576 -0.641843,0.36614 -0.073968,0.0426 -0.1528402,0.0756 -0.2289524,0.11385 -0.016518,0.008 -0.064778,0.0357 -0.048841,0.0263 0.055113,-0.0324 0.1109284,-0.0636 0.1663925,-0.0955 -0.073165,0.0375 -0.1323573,0.0933 -0.1830978,0.157 -0.04722,0.0652 -0.084482,0.13728 -0.1240165,0.20737 -0.044747,0.082 -0.1009383,0.15511 -0.1637332,0.22375 -0.052159,0.0628 -0.1154287,0.11327 -0.1797222,0.16277 -0.070298,0.0531 -0.1442701,0.1014 -0.2170983,0.15104 -0.064265,0.0435 -0.1237223,0.0936 -0.1863526,0.13939 0,0 -0.2303243,0.091 -0.2303243,0.091 v 0 c 0.063862,-0.0449 0.1234895,-0.0953 0.1871041,-0.14041 0.038204,-0.0257 0.075759,-0.0523 0.1138166,-0.0782 0.023791,-0.0162 0.04882,-0.0306 0.072385,-0.0471 0.010753,-0.008 0.020696,-0.0162 0.031044,-0.0242 0.064088,-0.0491 0.1296784,-0.0966 0.1817659,-0.15903 0.021198,-0.0229 0.043366,-0.0449 0.063647,-0.0685 0.039338,-0.0459 0.069411,-0.0991 0.1020683,-0.14969 0.019558,-0.0358 0.040502,-0.0706 0.060299,-0.10623 0.00309,-0.006 0.03704,-0.0682 0.040254,-0.0734 0.00659,-0.0107 0.014301,-0.0206 0.02145,-0.031 0.04967,-0.066 0.106304,-0.12778 0.1806996,-0.16636 0.085015,-0.0489 0.1696664,-0.0985 0.2550451,-0.14673 0.089713,-0.0507 0.1874784,-0.0866 0.276674,-0.13843 0.060792,-0.0302 0.3060401,-0.16253 0.014192,0.003 -0.025336,0.0144 0.049956,-0.03 0.074746,-0.0453 0.02409,-0.0149 0.04783,-0.0303 0.07189,-0.0452 0.020616,-0.0128 0.041422,-0.0253 0.062133,-0.0379 0.051293,-0.0316 0.09972,-0.0679 0.1516126,-0.0984 0.2795812,-0.16448 0.3557183,-0.20447 0.076566,-0.0434 -0.011203,0.006 0.022042,-0.0135 0.033063,-0.0203 0.015047,-0.0105 0.048722,-0.0336 0.06241,-0.0447 0.050276,-0.0408 0.094536,-0.0885 0.1420416,-0.13227 0.094877,-0.10189 0.1783606,-0.21281 0.257447,-0.32731 0.1670785,-0.23269 0.3300087,-0.46843 0.4877035,-0.70758 0.1486866,-0.23528 0.2887737,-0.47597 0.4060174,-0.72871 0,0 0.2243982,-0.10329 0.2243982,-0.10329 z"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.30000001;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
id="path879"
d="m 9.2123547,285.11917 c -0.1370039,0.16252 -0.2840207,0.31628 -0.4313671,0.46937 -0.1344798,0.13935 -0.2725185,0.27526 -0.4025032,0.41887 -0.085394,0.0892 -0.1536076,0.19226 -0.2283148,0.2902 -0.080316,0.10295 -0.1588651,0.20726 -0.23851,0.31074 -0.093866,0.12655 -0.1768244,0.26064 -0.2693823,0.38817 -0.1116552,0.16075 -0.227402,0.31838 -0.346192,0.47391 -0.091072,0.12702 -0.1990201,0.23836 -0.3232258,0.33272 -0.1133718,0.0769 -0.2348103,0.14151 -0.353382,0.20962 -0.014452,0.008 -0.057941,0.033 -0.04351,0.0246 0.2042827,-0.11801 0.224903,-0.13091 0.1349658,-0.0764 -0.1357363,0.0881 -0.2699035,0.18575 -0.4242461,0.23762 -0.069129,0.0195 -0.1343433,0.0499 -0.2040877,0.0678 -0.060068,0.0138 -0.11552,0.0403 -0.174838,0.0564 -0.052873,0.0251 -0.1096483,0.0391 -0.1646393,0.0581 -0.044526,0.0197 -0.091395,0.0344 -0.1346444,0.0571 -0.010933,0.006 -0.042555,0.025 -0.031799,0.019 0.060863,-0.0342 0.1214192,-0.069 0.1821286,-0.10349 -0.031646,0.0199 -0.062017,0.0417 -0.091582,0.0646 0,0 -0.2305182,0.0925 -0.2305182,0.0925 v 0 c 0.029211,-0.0241 0.059245,-0.0471 0.091476,-0.0671 0.1352341,-0.0796 0.2617348,-0.16535 0.410614,-0.21445 0.055802,-0.0177 0.1107331,-0.0373 0.1655836,-0.0577 0.058269,-0.0182 0.1146191,-0.0422 0.1743806,-0.0557 0.068543,-0.0206 0.1343646,-0.0488 0.2029457,-0.0693 0.083145,-0.0326 0.2107364,-0.11349 -0.1079008,0.0735 -0.011721,0.007 0.023699,-0.0133 0.035176,-0.0206 0.00257,-0.002 0.069721,-0.0477 0.07178,-0.0491 0.1171011,-0.0726 0.037045,-0.0235 0.2867469,-0.16748 0.01434,-0.008 0.057511,-0.0328 0.043239,-0.0244 -0.054369,0.0319 -0.1088967,0.0636 -0.1635382,0.0951 -0.033092,0.0191 0.1386134,-0.0814 0.097811,-0.0597 0.1286864,-0.093 0.2350026,-0.19854 0.3285649,-0.32752 0.1186362,-0.15532 0.2356212,-0.31174 0.3458786,-0.47319 0.092882,-0.1267 0.1753156,-0.26042 0.2670741,-0.38785 0.079583,-0.10355 0.1583349,-0.20769 0.2386418,-0.31065 0.025567,-0.0337 0.052075,-0.0668 0.0772,-0.10086 0.024445,-0.0331 0.045189,-0.069 0.070601,-0.10142 0.024733,-0.0316 0.055507,-0.0581 0.079912,-0.0899 0.1307187,-0.14515 0.2712749,-0.28088 0.4067918,-0.42149 0.1454161,-0.15119 0.2912073,-0.3025 0.4251471,-0.4641 0,0 0.2275231,-0.0974 0.2275231,-0.0974 z"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.30000001;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
id="path881"
d="m 9.6548862,285.44678 c -0.026806,0.0342 -0.1111887,0.1425 -0.1336386,0.16858 -0.044007,0.0511 -0.1841387,0.20036 -0.2272975,0.24636 -0.2804795,0.29895 0.011766,-0.0141 -0.2663873,0.28432 -0.2080177,0.22957 -0.3964656,0.4754 -0.588764,0.71794 -0.08516,0.11386 -0.1853166,0.21662 -0.2586355,0.33885 -0.052961,0.096 -0.090706,0.19922 -0.1350058,0.29933 -0.028955,0.061 -0.049157,0.12612 -0.087432,0.18216 -0.019825,0.0219 -0.028649,0.0331 -0.051823,0.0522 -0.1003702,0.0827 -0.2876767,0.17879 -0.3754456,0.22945 -0.086459,0.0482 -0.1799468,0.0823 -0.2723282,0.11727 -0.084004,0.0372 -0.1677104,0.0751 -0.2555433,0.1025 -0.031759,0.0142 -0.023868,0.01 -0.052739,0.0264 -0.00802,0.005 -0.031912,0.0189 -0.02385,0.0143 0.339916,-0.19329 0.2162116,-0.1272 0.1425924,-0.0775 -0.044408,0.0368 -0.091767,0.0692 -0.1410899,0.099 -0.078988,0.0452 -0.1579758,0.0904 -0.2369637,0.13554 -0.00825,0.005 -0.032911,0.0182 -0.024752,0.0135 0.062601,-0.0358 0.1248019,-0.0723 0.1880748,-0.10697 0.00833,-0.005 -0.015467,0.011 -0.023082,0.0167 -0.08483,0.0633 0.035723,-0.0254 -0.046184,0.0347 -0.078654,0.0456 -0.1570757,0.0916 -0.2359605,0.13678 -0.015161,0.009 -0.031021,0.0161 -0.046307,0.0246 -0.00777,0.004 -0.031006,0.0173 -0.023323,0.0128 0.2087177,-0.12069 0.2494495,-0.1473 0.1651114,-0.0933 -0.059889,0.0478 -0.1208942,0.0941 -0.1826749,0.13944 -0.069593,0.0501 -0.1323885,0.10861 -0.199558,0.16171 -0.076797,0.0524 -0.1545601,0.10334 -0.2345788,0.15073 0,0 -0.2303307,0.0886 -0.2303307,0.0886 v 0 c 0.08036,-0.0464 0.1575846,-0.0974 0.2353863,-0.14784 0.069183,-0.0506 0.1299308,-0.11173 0.1995414,-0.16196 0.060924,-0.0461 0.1245886,-0.0886 0.181271,-0.14007 0.00788,-0.006 0.01529,-0.0121 0.023646,-0.017 0.07805,-0.0461 0.1568836,-0.0909 0.2354656,-0.13609 0.011105,-0.006 0.034696,-0.0188 0.046141,-0.0249 0.00779,-0.004 0.030958,-0.017 0.023357,-0.0125 -0.062491,0.037 -0.1253623,0.0734 -0.1880431,0.11014 0.026803,-0.0182 0.020608,-0.0133 0.04659,-0.0338 0.00757,-0.006 0.014269,-0.0132 0.022513,-0.0182 0.078071,-0.0475 0.1572988,-0.093 0.2361912,-0.13911 0.054513,-0.0319 0.2965039,-0.14158 -0.1632683,0.096 0.049203,-0.0295 0.1000691,-0.0576 0.1418658,-0.0976 0.1129787,-0.0798 0.2321672,-0.15419 0.3605906,-0.20578 0.08659,-0.0291 0.1693463,-0.0675 0.253583,-0.10261 0.091889,-0.0355 0.1845829,-0.0704 0.2699994,-0.12008 -0.3393956,0.19846 -0.1153803,0.0706 -0.044979,0.0184 0.020823,-0.0154 0.034526,-0.0299 0.052892,-0.0478 0.00628,-0.007 0.013396,-0.0133 0.018836,-0.0209 0.033301,-0.0468 0.043824,-0.10702 0.072396,-0.15634 0.045471,-0.1005 0.084226,-0.20389 0.1346697,-0.30198 0.00917,-0.0164 0.017547,-0.0333 0.027519,-0.0493 0.025551,-0.0409 0.042284,-0.0592 0.073245,-0.0969 0.054011,-0.0657 0.1081889,-0.1313 0.1609699,-0.19802 0.1956546,-0.24281 0.3857413,-0.49026 0.5944319,-0.72228 0.4075142,-0.43749 -0.1426048,0.15288 0.264844,-0.28369 0.031047,-0.0333 0.1898938,-0.20325 0.2238028,-0.24284 0.039025,-0.0456 0.090581,-0.11601 0.1279173,-0.16605 0,0 0.2265365,-0.097 0.2265365,-0.097 z"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.30000001;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
id="path883"
d="m 9.1311433,284.66441 c -0.1152766,0.13154 -0.2182424,0.27303 -0.329429,0.40792 -0.1944662,0.22715 -0.4002517,0.44421 -0.5922566,0.67347 -0.1330299,0.16788 -0.2590906,0.34112 -0.3882459,0.51197 -0.094027,0.1197 -0.1845638,0.24143 -0.2668323,0.36955 -0.05529,0.0894 -0.094994,0.18802 -0.1538086,0.27533 -0.011941,0.0177 -0.025096,0.0346 -0.037643,0.0519 -0.046917,0.0587 -0.093467,0.11901 -0.1493105,0.16976 -0.030456,0.0277 -0.050975,0.0409 -0.084092,0.0646 -0.1302245,0.0869 -0.5128144,0.29644 -0.1150281,0.0701 0.012467,-0.007 -0.02471,0.0146 -0.037005,0.022 -0.012782,0.008 -0.025321,0.0158 -0.038223,0.0232 -0.0829,0.048 -0.1661176,0.0955 -0.2491764,0.14323 -0.092667,0.0492 -0.1904926,0.0865 -0.2873264,0.12632 -0.08306,0.039 -0.1645433,0.0816 -0.250268,0.11453 -0.043658,0.0182 -0.090577,0.0242 -0.1361573,0.0347 -0.029068,0.007 -0.039459,0.0123 -0.067304,0.0237 0.3371392,-0.18948 0.1861621,-0.11609 0.1224171,-0.0579 -0.025773,0.0235 -0.048051,0.0501 -0.070052,0.077 -0.039862,0.0597 -0.092008,0.10785 -0.1498331,0.14952 -0.034483,0.0207 -0.067448,0.0437 -0.1011766,0.0655 0,0 -0.2311265,0.0894 -0.2311265,0.0894 v 0 c 0.034962,-0.02 0.065656,-0.046 0.1016926,-0.0643 0.058769,-0.0386 0.114295,-0.0832 0.1531961,-0.14266 0.1029274,-0.13927 0.196982,-0.18049 0.369665,-0.26909 0.066863,-0.0228 0.137523,-0.0317 0.2031375,-0.0588 0.08445,-0.0347 0.1655287,-0.0768 0.2489658,-0.1138 0.097092,-0.0394 0.1941968,-0.0787 0.2862294,-0.12923 -0.057664,0.0336 -0.1150802,0.0676 -0.1729912,0.10082 -0.012914,0.007 0.02527,-0.0157 0.037985,-0.0235 0.012282,-0.007 0.024564,-0.015 0.037001,-0.0222 0.082961,-0.0481 0.1653034,-0.0974 0.249188,-0.14391 0.044529,-0.0247 -0.2819897,0.16923 -0.1328552,0.0754 0.02227,-0.0151 0.065475,-0.0434 0.085775,-0.0607 0.057264,-0.0487 0.1035815,-0.10949 0.1516229,-0.1667 0.034383,-0.0454 0.039784,-0.05 0.06846,-0.0974 0.044963,-0.0742 0.080849,-0.1536 0.1243454,-0.22863 0.039887,-0.0626 0.079908,-0.12505 0.1238038,-0.185 0.048545,-0.0663 0.044434,-0.0571 0.095417,-0.12312 0.016282,-0.0211 0.032073,-0.0425 0.048109,-0.0638 0.1309171,-0.1715 0.2584931,-0.34557 0.392267,-0.51489 0.1908302,-0.22938 0.3969634,-0.44531 0.5903439,-0.67253 0.025416,-0.0306 0.051495,-0.0607 0.076252,-0.0919 0.082528,-0.10392 0.1581095,-0.21355 0.2461197,-0.31312 0,0 0.2281476,-0.0969 0.2281476,-0.0969 z"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.30000001;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
id="path889"
d="m 8.6926787,284.21764 c -0.1191242,0.14151 -0.2281304,0.29123 -0.3379904,0.43996 -0.075188,0.0927 -0.1444506,0.18961 -0.2135772,0.28682 -0.042247,0.0519 -0.084273,0.10395 -0.1255885,0.15661 -0.048178,0.0601 -0.097094,0.11962 -0.1521335,0.17356 -0.093132,0.0753 -0.2053675,0.12835 -0.30812,0.18575 -0.010546,0.006 -0.022148,0.01 -0.03287,0.0153 -0.010284,0.005 -0.040154,0.0232 -0.030082,0.0174 0.061382,-0.035 0.1226762,-0.0701 0.1840142,-0.1051 -0.043805,0.0244 -0.082942,0.0543 -0.1192749,0.0885 -0.039683,0.0432 -0.085394,0.0796 -0.1302462,0.11716 -0.051579,0.0379 -0.1005747,0.0786 -0.1489604,0.12045 -0.042327,0.0353 -0.083634,0.0719 -0.1254871,0.10779 -0.1316249,0.0888 -0.4832564,0.27808 -0.083933,0.0528 0.011525,-0.007 -0.022677,0.0136 -0.034005,0.0205 -0.041202,0.0249 -0.024955,0.0149 -0.06453,0.0399 -0.065727,0.0353 -0.1056391,0.0954 -0.1474147,0.15467 -0.032442,0.0519 -0.067228,0.10201 -0.1043004,0.15075 -0.035305,0.0513 -0.074673,0.0996 -0.1115732,0.14971 -0.037365,0.0506 -0.086169,0.0914 -0.1383771,0.12588 -0.1002408,0.0213 -0.1716024,0.1105 -0.2650669,0.15024 -0.01724,0.01 -0.037438,0.0112 -0.055521,0.0186 -0.0181,0.007 -0.034724,0.0179 -0.052142,0.0267 -0.032965,0.014 -0.066125,0.0277 -0.098499,0.043 0,0 0.1945812,-0.15451 0.1945812,-0.15451 v 0 c 0.032646,-0.0143 0.06546,-0.0282 0.097716,-0.0434 0.026525,-0.0127 0.053348,-0.0225 0.080558,-0.0334 0.080018,-0.0322 0.2082649,-0.12402 -0.1325867,0.0825 0.00615,-0.004 0.048967,-0.0297 0.054685,-0.0341 0.031676,-0.0241 0.060872,-0.0539 0.087308,-0.0833 0.036641,-0.0505 0.076545,-0.0982 0.1110364,-0.15016 0.037677,-0.0483 0.074184,-0.0971 0.1052174,-0.15003 0.026151,-0.037 0.059574,-0.0934 0.090259,-0.12446 0.00618,-0.006 0.047381,-0.0347 0.053585,-0.039 0.1105401,-0.0722 0.2276203,-0.13588 0.3410408,-0.20243 0.060702,-0.0356 -0.1218388,0.0705 -0.1824466,0.10627 -0.00792,0.005 0.016248,-0.009 0.024371,-0.013 0.040278,-0.0379 0.084355,-0.072 0.1258398,-0.10868 0.049083,-0.041 0.095031,-0.0857 0.1489704,-0.12059 0.044342,-0.0375 0.091995,-0.0715 0.1298464,-0.11583 0.037616,-0.0337 0.072,-0.0705 0.1183826,-0.0931 0.079881,-0.0467 0.1595347,-0.0937 0.2396429,-0.13998 0.010075,-0.006 0.020524,-0.011 0.03088,-0.0163 0.1121664,-0.0574 -0.062189,0.0394 -0.1466419,0.0887 -0.011314,0.007 0.022773,-0.013 0.033846,-0.02 0.01071,-0.007 0.020981,-0.0142 0.031473,-0.0213 0.056143,-0.0521 0.1053176,-0.11027 0.153235,-0.16997 0.040615,-0.0533 0.082332,-0.10579 0.1265632,-0.15612 0.071174,-0.0974 0.1395624,-0.19678 0.2176996,-0.28895 0.1095484,-0.14756 0.2183376,-0.2958 0.3327792,-0.43962 0,0 0.2278367,-0.0964 0.2278367,-0.0964 z"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.30000001;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
id="path891"
d="m 9.9320267,285.70663 c -0.1449242,0.25246 -0.3140581,0.48963 -0.4788167,0.72923 -0.2604895,0.37423 -0.5265047,0.74469 -0.7949875,1.11322 -0.1323909,0.17925 -0.2683764,0.35585 -0.4069432,0.53035 -0.061749,0.0798 -0.127178,0.15672 -0.1880714,0.23717 -0.055362,0.0853 -0.1066024,0.17289 -0.1516623,0.26405 -0.028986,0.076 -0.073194,0.14205 -0.1272342,0.20214 -0.047696,0.0467 -0.1038016,0.083 -0.1612799,0.11636 -0.239531,0.1389 -0.1710298,0.10092 -0.2940587,0.16843 -0.016169,0.007 -0.032126,0.0152 -0.048508,0.022 -0.054721,0.0229 -0.1108464,0.042 -0.1647984,0.0668 -0.040571,0.0187 -0.080107,0.0395 -0.1202902,0.0591 -0.0875,0.0465 -0.1748565,0.0924 -0.2700882,0.12066 -0.054193,0.0229 -0.1109829,0.0373 -0.1622925,0.0665 -0.034649,0.0197 -0.075748,0.0251 -0.1096386,0.0458 0,0 0.1948133,-0.15564 0.1948133,-0.15564 v 0 c 0.0367,-0.014 0.073993,-0.0268 0.1085913,-0.0457 0.052935,-0.0251 0.1093494,-0.0415 0.163985,-0.0624 0.09289,-0.0313 0.1788406,-0.0776 0.2659775,-0.12197 0.024037,-0.0117 0.096692,-0.0472 0.1210685,-0.0581 0.070572,-0.0316 0.1444652,-0.0556 0.212946,-0.0918 0.1055819,-0.059 0.031802,-0.0181 -0.1275247,0.0746 -0.014594,0.008 0.0295,-0.0164 0.044011,-0.0251 0.042001,-0.025 0.082311,-0.0525 0.1193379,-0.0845 0.056012,-0.0562 0.1023406,-0.12027 0.129983,-0.19536 0.045972,-0.0921 0.096727,-0.18084 0.1507958,-0.26844 0.059677,-0.082 0.1261181,-0.15874 0.1888397,-0.23841 0.1410327,-0.17663 0.2829878,-0.35261 0.4179157,-0.53403 0.2707392,-0.36695 0.5364226,-0.73779 0.7959003,-1.11278 0.1610294,-0.23684 0.3291096,-0.47018 0.465732,-0.72241 0,0 0.2262971,-0.0998 0.2262971,-0.0998 z"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.30000001;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
id="path893"
d="m 10.321589,286.12254 c -0.100161,0.19926 -0.208419,0.39429 -0.320277,0.5872 -0.100929,0.18438 -0.2080447,0.36556 -0.3221577,0.54211 -0.051968,0.0804 -0.1062249,0.15931 -0.1588793,0.23927 -0.1163736,0.16699 -0.2300526,0.33587 -0.3417891,0.506 -0.065507,0.10884 -0.1301334,0.21789 -0.2051121,0.32052 -0.070592,0.0904 -0.1371478,0.18378 -0.2022613,0.27818 -0.049337,0.0722 -0.086646,0.15162 -0.1326694,0.22581 -0.029059,0.0468 -0.042225,0.0634 -0.074975,0.10877 -0.01452,0.0176 -0.027936,0.0361 -0.043558,0.0527 -0.04077,0.0433 -0.082511,0.0764 -0.1293289,0.11328 -0.070125,0.0552 -0.1428072,0.1043 -0.2184164,0.15154 -0.1613212,0.13074 -0.3625715,0.18358 -0.5381826,0.28633 0.4159866,-0.23981 0.010345,-0.006 -0.06823,0.0383 -0.041797,0.0234 -0.089821,0.0365 -0.1356312,0.0493 -0.057757,0.0237 -0.1113621,0.0564 -0.169322,0.0797 -0.069429,0.0358 -0.1828511,0.0946 0.1636234,-0.0941 0.00794,-0.004 -0.014952,0.0102 -0.021786,0.0162 -0.00647,0.006 -0.011999,0.0122 -0.018,0.0183 0,0 -0.2285622,0.097 -0.2285622,0.097 v 0 c 0.070764,-0.0972 0.1925865,-0.14026 0.2995285,-0.19127 0.056627,-0.0261 0.1114224,-0.0568 0.1705893,-0.0769 0.034718,-0.0108 0.068638,-0.0224 0.1016465,-0.0378 0.010366,-0.005 0.04045,-0.0214 0.030617,-0.0156 -0.059027,0.0352 -0.5194869,0.30039 0.067154,-0.0379 0.062619,-0.0345 0.1278369,-0.0611 0.1921399,-0.092 0.021415,-0.0103 0.083392,-0.0454 0.063636,-0.0322 -0.043756,0.0292 -0.090585,0.0536 -0.1358773,0.0804 0.076337,-0.0461 0.1489747,-0.0945 0.2197589,-0.14883 0.04051,-0.0311 0.092758,-0.0714 0.1293292,-0.10818 0.015886,-0.016 0.029519,-0.0341 0.044278,-0.0511 0.029102,-0.0396 0.049178,-0.0655 0.075508,-0.10652 0.047337,-0.0738 0.083907,-0.15389 0.1320628,-0.22722 0.064281,-0.095 0.1302089,-0.18891 0.2014149,-0.27885 0.076643,-0.1018 0.1425763,-0.21038 0.20741,-0.32001 0.1126533,-0.17121 0.228136,-0.34061 0.3463044,-0.50805 0.053118,-0.0801 0.108218,-0.15896 0.1607749,-0.23947 0.1146812,-0.17568 0.2215494,-0.35674 0.3217494,-0.541 0.109809,-0.1905 0.2162174,-0.38295 0.3124544,-0.58069 0,0 0.225033,-0.10321 0.225033,-0.10321 z"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.30000001;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
id="path895"
d="m 10.677728,286.38604 c -0.0059,0.0181 -0.01082,0.0366 -0.01774,0.0544 -0.02637,0.0677 -0.05386,0.12143 -0.08741,0.18677 -0.07336,0.14287 -0.154884,0.27984 -0.238133,0.41712 -0.186122,0.31575 -0.3891005,0.62103 -0.5941729,0.92465 -0.1193962,0.16807 -0.237375,0.33725 -0.3612142,0.5021 -0.081595,0.10497 -0.1640642,0.20922 -0.2430862,0.31616 -0.058768,0.09 -0.1160145,0.18086 -0.1778897,0.26888 -0.054318,0.0689 -0.1079569,0.13852 -0.1642698,0.20588 -0.055203,0.0642 -0.1218041,0.11708 -0.1885312,0.16864 -0.070217,0.0533 -0.1473324,0.0963 -0.21883,0.14766 -0.053239,0.035 -0.083783,0.0901 -0.1172874,0.1423 -0.020365,0.0274 -0.040879,0.0547 -0.061063,0.0823 0,0 -0.2273641,0.0983 -0.2273641,0.0983 v 0 c 0.02001,-0.0273 0.038896,-0.0556 0.061486,-0.0809 0.034531,-0.0527 0.062414,-0.11231 0.1141182,-0.15064 0.07046,-0.0533 0.1480849,-0.0955 0.2194703,-0.14753 0.06715,-0.0501 0.133509,-0.10235 0.1908503,-0.16372 0.056867,-0.0667 0.1092589,-0.13693 0.1655617,-0.20412 0.062545,-0.0882 0.1217367,-0.17758 0.1783961,-0.26963 0.079003,-0.10764 0.1617914,-0.21233 0.2444629,-0.31714 0.1264025,-0.165 0.2453772,-0.33557 0.3677329,-0.50357 0.2073305,-0.30254 0.411335,-0.60764 0.5966381,-0.92434 0.08193,-0.13597 0.16184,-0.27144 0.233713,-0.41302 0.03139,-0.0618 0.0599,-0.11697 0.08451,-0.18132 0.0065,-0.0171 0.01087,-0.0349 0.01631,-0.0524 0,0 0.22374,-0.10675 0.22374,-0.10675 z"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.30000001;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
id="path897"
d="m 11.215728,286.75016 c -0.03577,0.18265 -0.114717,0.35322 -0.195267,0.51973 -0.127275,0.27038 -0.290002,0.52098 -0.455457,0.76898 -0.133831,0.20959 -0.281564,0.40955 -0.417092,0.61799 -0.101467,0.17732 -0.203983,0.35349 -0.3160256,0.52439 -0.097823,0.15068 -0.2061636,0.29442 -0.2973086,0.44933 -0.069988,0.11631 -0.1290852,0.23875 -0.1973225,0.35599 -0.042988,0.0728 -0.091469,0.14211 -0.1457521,0.20691 -0.02817,0.027 -0.052567,0.0587 -0.082625,0.0837 -0.021802,0.0181 -0.038882,0.0274 -0.063186,0.0424 -0.1233435,0.0728 -0.2461329,0.15197 -0.3810455,0.20284 0,0 0.1949656,-0.15319 0.1949656,-0.15319 v 0 c 0.087683,-0.0364 0.3135294,-0.15909 -0.044471,0.0394 0.02132,-0.0126 0.044,-0.0231 0.06423,-0.0374 0.031785,-0.0225 0.053079,-0.0574 0.083781,-0.0811 0.055961,-0.0634 0.1061447,-0.13147 0.1497528,-0.20399 0.070759,-0.11619 0.1280779,-0.24019 0.1989786,-0.3564 0.089329,-0.15692 0.2003906,-0.29984 0.2983423,-0.45135 0.1133636,-0.17032 0.2163352,-0.3465 0.3169618,-0.52459 0.038747,-0.0598 0.082426,-0.1283 0.1229542,-0.18691 0.09949,-0.14388 0.204811,-0.28372 0.296914,-0.43268 0.165702,-0.24637 0.329131,-0.49514 0.454785,-0.76505 0.07922,-0.16293 0.157968,-0.33013 0.191218,-0.50945 0,0 0.22267,-0.10951 0.22267,-0.10951 z"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.30000001;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
id="path899"
d="m 11.738978,287.51678 c -0.116043,0.2908 -0.262243,0.5676 -0.411125,0.84253 -0.236074,0.41266 -0.506681,0.80362 -0.767927,1.20033 -0.153522,0.21942 -0.291627,0.44881 -0.434471,0.67513 -0.06127,0.10513 -0.1371488,0.20066 -0.2083458,0.29906 -0.043584,0.0575 -0.080872,0.11957 -0.125117,0.17658 -0.033027,0.0428 -0.073229,0.0785 -0.116863,0.10998 -0.1110355,0.0705 -0.2189424,0.1556 -0.3476466,0.18803 -0.065441,0.0265 -0.1225595,0.053 -0.1920068,0.0688 -0.060733,0.0155 -0.1186754,0.0269 -0.1735272,0.0584 -0.00574,0.004 -0.011475,0.007 -0.017214,0.0106 0,0 0.1934382,-0.15656 0.1934382,-0.15656 v 0 c 0.00579,-0.003 0.011591,-0.006 0.017386,-0.009 0.056364,-0.0255 0.1167321,-0.0385 0.1765202,-0.0536 0.066012,-0.0182 0.1269799,-0.0485 0.1918497,-0.07 0.088537,-0.0304 0.1845715,-0.0984 -0.1427948,0.0934 -0.00668,0.004 0.013552,-0.007 0.020116,-0.0116 0.014409,-0.009 0.027777,-0.0196 0.042735,-0.0277 0.04503,-0.0281 0.085672,-0.0623 0.1197954,-0.10314 0.04667,-0.0556 0.083387,-0.11836 0.1273712,-0.17608 0.071243,-0.0991 0.149189,-0.19385 0.2115796,-0.29896 0.1467849,-0.22761 0.2881759,-0.45874 0.4446259,-0.68 0.262401,-0.39556 0.533727,-0.78569 0.768918,-1.1985 0.145853,-0.27148 0.290932,-0.54441 0.398633,-0.83384 0,0 0.224068,-0.10363 0.224068,-0.10363 z"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.30000001;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
id="path901"
d="m 12.237683,287.82377 c -0.01799,0.23063 -0.07854,0.45587 -0.171189,0.66759 -0.02963,0.0677 -0.06413,0.13318 -0.0962,0.19978 -0.107908,0.20766 -0.22965,0.40796 -0.355227,0.60532 -0.03911,0.0615 -0.08042,0.1215 -0.119489,0.18299 -0.06951,0.10939 -0.136304,0.22048 -0.204856,0.33047 -0.13059,0.21687 -0.256682,0.43636 -0.389176,0.65208 -0.06024,0.0874 -0.110481,0.18457 -0.182876,0.26319 -0.0395,0.0429 -0.06453,0.0593 -0.110063,0.0944 -0.117124,0.0814 -0.244297,0.14805 -0.367732,0.21873 -0.01479,0.008 -0.05935,0.0335 -0.04453,0.0251 0.18604,-0.10556 0.227179,-0.13313 0.13963,-0.0764 -0.0938,0.0596 -0.190384,0.11419 -0.28821,0.16714 -0.02383,0.0129 -0.059428,0.014 -0.085685,0.0177 -0.00973,8.2e-4 -0.019606,6.1e-4 -0.029188,0.002 -0.090054,0.0177 -0.3226017,0.15935 0.049092,-0.0501 -0.063693,0.0412 -0.1205384,0.0895 -0.1709645,0.14602 -0.030567,0.0351 -0.015433,0.0184 -0.045284,0.0502 0,0 -0.2288881,0.0951 -0.2288881,0.0951 v 0 c 0.031124,-0.0304 0.015547,-0.0142 0.04649,-0.049 0.02454,-0.0295 0.04954,-0.0598 0.078691,-0.085 0.028325,-0.0245 0.061704,-0.0427 0.089377,-0.0681 0.12831,-0.0741 0.2566126,-0.17295 0.4089796,-0.19074 0.02192,-0.004 0.0344,-0.006 0.05565,-0.0132 0.0087,-0.003 0.03325,-0.0155 0.0254,-0.0107 -0.3456701,0.21048 -0.211765,0.12252 -0.135773,0.078 0.111595,-0.0727 0.03794,-0.0254 0.282199,-0.16809 0.01457,-0.009 0.05867,-0.0333 0.04415,-0.0247 -0.0533,0.0315 -0.107045,0.0622 -0.160484,0.0935 -0.03711,0.0217 0.158341,-0.0906 0.109878,-0.0675 0.0403,-0.0291 0.07722,-0.0533 0.112432,-0.089 0.07513,-0.0761 0.124512,-0.17465 0.185868,-0.26102 0.135384,-0.21649 0.263771,-0.43715 0.396309,-0.65537 0.06965,-0.11033 0.137058,-0.22208 0.207285,-0.33205 0.03926,-0.0615 0.08093,-0.12139 0.120334,-0.18278 0.126018,-0.19634 0.248296,-0.3956 0.355754,-0.60282 0.03171,-0.0658 0.0659,-0.13038 0.09513,-0.19728 0.09033,-0.20679 0.150554,-0.42761 0.162515,-0.65345 0,0 0.220657,-0.11243 0.220657,-0.11243 z"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.30000001;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
id="path905"
d="m 12.661771,288.32871 c -0.02702,0.084 -0.02383,0.0757 -0.05776,0.17207 -0.01518,0.0431 -0.02933,0.0866 -0.04618,0.12909 -0.06712,0.16915 -0.150523,0.3319 -0.228991,0.49591 -0.156102,0.3233 -0.313898,0.6461 -0.488705,0.95978 -0.100972,0.17355 -0.19289,0.35366 -0.309243,0.51783 -0.02039,0.0288 -0.04262,0.0562 -0.06392,0.0843 -0.122285,0.15061 -0.271956,0.27525 -0.418628,0.40101 -0.08653,0.0775 -0.174575,0.15411 -0.244072,0.2477 -0.03363,0.0504 -0.05641,0.10703 -0.08242,0.16153 -0.03167,0.0581 -0.06568,0.11519 -0.101187,0.1711 -0.08127,0.12492 -0.171403,0.1457 -0.318169,0.22988 -0.03017,0.009 -0.0761,0.0135 -0.09436,-0.0197 -0.0033,-0.006 -0.0043,-0.0129 -0.0065,-0.0193 0,0 0.219445,-0.11843 0.219445,-0.11843 v 0 c 3.17e-4,0.0319 0.06092,0.01 0.07547,0.002 -0.06457,0.0378 -0.129129,0.0756 -0.193721,0.11341 -0.0066,0.004 0.01352,-0.007 0.01986,-0.0117 0.02915,-0.02 0.05087,-0.0476 0.0708,-0.0763 0.03663,-0.0546 0.06895,-0.11202 0.102875,-0.16828 0.02661,-0.0555 0.04982,-0.11281 0.08102,-0.16582 0.01565,-0.022 0.03361,-0.0483 0.05119,-0.0685 0.05883,-0.0678 0.130091,-0.12404 0.194544,-0.18609 0.146588,-0.1256 0.29742,-0.24847 0.421923,-0.39697 0.0215,-0.0276 0.04401,-0.0544 0.06451,-0.0827 0.11845,-0.16371 0.211538,-0.3442 0.313834,-0.5179 0.177134,-0.313 0.336903,-0.63551 0.492381,-0.95973 0.122273,-0.25657 0.252385,-0.51182 0.321813,-0.78912 0,0 0.224185,-0.1048 0.224185,-0.1048 z"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.30000001;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
id="path907"
d="m 13.242889,288.74748 c -0.08448,0.19705 -0.175763,0.39095 -0.274289,0.58135 -0.111781,0.22576 -0.219413,0.45349 -0.332495,0.67862 -0.09247,0.17751 -0.193469,0.35017 -0.300876,0.51898 -0.08449,0.13007 -0.170122,0.25943 -0.261873,0.38452 -0.09523,0.12022 -0.194766,0.23689 -0.288721,0.35815 -0.04998,0.0677 -0.103,0.13292 -0.15657,0.19774 -0.04375,0.0488 -0.08847,0.097 -0.136235,0.14189 -0.125218,0.0974 -0.260216,0.19113 -0.407992,0.24949 -0.05822,0.0151 -0.112008,0.0425 -0.165919,0.0686 0,0 0.193356,-0.154 0.193356,-0.154 v 0 c 0.05463,-0.0254 0.10953,-0.0498 0.166896,-0.0684 0.08987,-0.0428 0.05013,-0.0249 -0.152077,0.0918 -0.01149,0.007 0.02281,-0.0135 0.03395,-0.0208 0.03524,-0.0228 0.06851,-0.0484 0.102419,-0.0731 0.04925,-0.0426 0.09191,-0.0919 0.137548,-0.13831 0.05312,-0.0661 0.109922,-0.12932 0.159502,-0.1983 0.09386,-0.12184 0.193754,-0.2387 0.290379,-0.3583 0.0925,-0.12432 0.176934,-0.25414 0.262703,-0.38314 0.108907,-0.1682 0.210457,-0.34072 0.304398,-0.51777 0.03549,-0.0705 0.07162,-0.1407 0.106608,-0.21147 0.05749,-0.11629 0.111345,-0.23431 0.168095,-0.35093 0.01914,-0.0393 0.03941,-0.0781 0.05911,-0.11715 0.09772,-0.1881 0.189116,-0.37979 0.266973,-0.57701 0,0 0.225108,-0.10249 0.225108,-0.10249 z"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.30000001;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
id="path909"
d="m 21.134779,275.66652 c -0.05752,-0.0144 -0.116902,-0.0192 -0.175037,-0.03 -0.01381,-0.003 -0.06311,-0.0149 -0.07776,-0.0185 -0.04882,-0.0156 -0.102734,-0.0173 -0.149971,-0.038 -0.01127,-0.005 -0.02169,-0.0116 -0.03253,-0.0175 -0.06454,-0.0354 -0.118413,-0.0842 -0.159065,-0.14522 -0.0402,-0.0513 -0.07056,-0.10718 -0.09046,-0.16914 -0.01413,-0.0576 -0.01751,-0.097 0.0027,-0.15311 0.0199,-0.0523 0.05904,-0.0889 0.103346,-0.12086 0.04646,-0.03 0.0905,-0.0634 0.13516,-0.0959 0.113195,-0.0717 0.221947,-0.16144 0.350122,-0.2023 0.05385,-0.0145 0.11022,-0.0149 0.165629,-0.0162 0.03496,-0.004 0.07114,0.004 0.105999,-1.5e-4 0.0164,-0.002 0.03212,-0.008 0.04819,-0.0114 0.05577,-0.0118 0.112784,-0.0167 0.169617,-0.02 0.04851,-0.005 0.0863,0.0238 0.114658,0.06 0.02536,0.042 0.04661,0.0864 0.06887,0.13012 0.02902,0.0518 0.05853,0.1037 0.07781,0.16003 0.01413,0.0492 0.01667,0.10031 0.01789,0.15113 -4.5e-4,0.0345 0.0038,0.0693 -0.0047,0.10316 -0.0047,0.0186 -0.01339,0.0379 -0.02069,0.0555 -0.02365,0.057 -0.06481,0.10307 -0.105613,0.14831 -0.0386,0.0466 -0.0829,0.0857 -0.132976,0.11932 -0.120124,0.0919 -0.242225,0.1405 -0.376462,0.19161 -0.0344,0.007 -0.06627,0.0207 -0.0981,0.0349 0,0 0.194112,-0.15316 0.194112,-0.15316 v 0 c 0.03269,-0.0128 0.06563,-0.0244 0.09916,-0.0349 0.02664,-0.0106 0.05391,-0.0198 0.08043,-0.0306 0.08022,-0.0327 0.210067,-0.12069 -0.13019,0.082 0.05157,-0.0304 0.09741,-0.0666 0.135403,-0.11322 0.0405,-0.0433 0.08261,-0.0867 0.108742,-0.14061 0.01076,-0.0239 0.02588,-0.0496 0.02978,-0.0759 0.0035,-0.0238 -0.0025,-0.0491 -3.9e-5,-0.073 -8.47e-4,-0.0485 -0.002,-0.0974 -0.01428,-0.1446 -0.01785,-0.0555 -0.04688,-0.10636 -0.07593,-0.15668 -0.02191,-0.042 -0.042,-0.085 -0.06648,-0.12556 -0.02724,-0.0319 -0.05894,-0.0464 -0.101463,-0.0404 -0.05621,0.004 -0.112381,0.01 -0.167353,0.0228 -0.05195,0.01 -0.10418,0.007 -0.156866,0.008 -0.0541,0.002 -0.109343,0.003 -0.160528,0.0231 -0.0885,0.0415 -0.03873,0.019 0.169225,-0.10074 0.0074,-0.004 -0.01456,0.009 -0.02192,0.0135 -0.04837,0.0291 0.002,-0.003 -0.0472,0.0296 -0.0079,0.005 -0.01597,0.0102 -0.02396,0.0153 -0.04542,0.0317 -0.08806,0.067 -0.135123,0.0963 -0.04365,0.0289 -0.08593,0.0579 -0.108618,0.10716 -0.0027,0.006 -0.01459,0.0331 -0.01645,0.0397 -0.0092,0.0323 0.001,0.0664 0.0059,0.0986 0.01781,0.0603 0.04747,0.11361 0.08634,0.16313 0.03891,0.0573 0.09024,0.10277 0.152189,0.13444 0.05699,0.0261 0.118823,0.0353 0.179221,0.051 0.08357,0.0201 0.168801,0.0307 0.253063,0.0475 0,0 -0.203758,0.14156 -0.203758,0.14156 z"
inkscape:connector-curvature="0" />
<path
style="fill:#000000;stroke:#000000;stroke-width:0.10123735;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;fill-opacity:0.42897728"
d="m 51.236435,82.363248 c -0.303735,-0.306459 -0.552244,-0.601654 -0.552244,-0.655989 0,-0.05434 -0.0783,-0.119267 -0.173992,-0.144291 -0.09569,-0.02502 -1.819841,-1.60672 -3.831437,-3.514879 -3.284227,-3.115349 -3.658247,-3.498438 -3.665295,-3.754166 -0.0071,-0.257575 -0.03709,-0.287437 -0.313843,-0.3125 -0.266439,-0.02413 -0.774314,-0.472013 -3.928572,-3.464523 -3.091671,-2.93313 -3.622576,-3.473491 -3.622576,-3.687094 0,-0.351224 -0.384589,-0.721233 -0.68914,-0.663014 -0.183232,0.03503 -0.319318,-0.03727 -0.646863,-0.34365 -0.363794,-0.340286 -0.410452,-0.425352 -0.379365,-0.691639 0.02913,-0.24951 -0.0095,-0.339017 -0.216933,-0.502154 -0.171947,-0.135253 -0.326932,-0.183612 -0.486305,-0.151737 -0.289362,0.05787 -0.438537,-0.08086 -0.438537,-0.407829 0,-0.223259 -0.03149,-0.25 -0.294379,-0.25 -0.22538,0 -0.375434,-0.08301 -0.640188,-0.35414 l -0.345809,-0.35414 0.707153,-0.740337 c 0.388933,-0.407185 2.292288,-2.418846 4.229677,-4.470357 1.937389,-2.051511 3.567088,-3.718595 3.621554,-3.70463 0.108608,0.02785 20.401188,19.28124 20.399556,19.354892 -5.55e-4,0.02502 -1.71254,1.994159 -3.804413,4.375855 -2.091872,2.381697 -3.932194,4.479569 -4.089604,4.661938 l -0.2862,0.331581 z"
id="path911"
inkscape:connector-curvature="0"
transform="matrix(0.26458333,0,0,0.26458333,0,267)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 36 KiB

View File

@@ -0,0 +1,101 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg8"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="result-error.svg">
<defs
id="defs2">
<inkscape:path-effect
effect="spiro"
id="path-effect831"
is_visible="true" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="102.28993"
inkscape:cy="113.44001"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<ellipse
style="fill:#c80000;fill-opacity:1;stroke:none;stroke-width:1.13353121;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="path837"
cx="14.991481"
cy="282.01321"
rx="14.859186"
ry="14.835566" />
<g
aria-label="❌"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.39999962px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
id="text841">
<path
d="m 26.184298,273.67792 -8.458399,8.4708 8.458399,8.47081 -2.666504,2.6665 -8.470801,-8.4584 -8.4708004,8.4584 -2.6665038,-2.6665 8.4583982,-8.47081 -8.4583982,-8.4708 2.6665038,-2.6665 8.4708004,8.4584 8.470801,-8.4584 z"
style="font-size:25.39999962px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332"
id="path2020"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@@ -0,0 +1,101 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg8"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="result-information.svg">
<defs
id="defs2">
<inkscape:path-effect
effect="spiro"
id="path-effect831"
is_visible="true" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="142.64708"
inkscape:cy="113.44001"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<ellipse
style="fill:#0064e6;fill-opacity:1;stroke:none;stroke-width:1.13353121;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="path837"
cx="14.991481"
cy="282.01321"
rx="14.859186"
ry="14.835566" />
<g
aria-label=""
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.39999962px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
id="text841">
<path
d="m 17.549903,291.45343 h -5.333008 v -13.30771 h 5.333008 z m 0.124023,-15.29209 h -5.581054 v -4.00596 h 5.581054 z"
style="font-size:25.39999962px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332"
id="path843"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@@ -0,0 +1,101 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg8"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="result-ok.svg">
<defs
id="defs2">
<inkscape:path-effect
effect="spiro"
id="path-effect831"
is_visible="true" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="102.28993"
inkscape:cy="113.44001"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<ellipse
style="fill:#00c800;fill-opacity:1;stroke:none;stroke-width:1.13353121;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="path837"
cx="14.991481"
cy="282.01321"
rx="14.859186"
ry="14.835566" />
<g
aria-label="✓"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.39999962px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
id="text841">
<path
d="m 6.6240342,286.2373 q 0,-0.39687 -0.099219,-0.69453 0,-0.89297 1.190625,-1.5875 0.79375,-0.39687 1.190625,-0.39687 0.4960937,0.0992 0.6945312,0.59531 0.5953126,1.38906 0.7937506,1.88516 0.198437,0.39687 0.396875,0.39687 0.198437,0 0.396875,-0.29765 3.373437,-5.95313 6.052343,-9.22735 2.083594,-2.48047 2.579688,-2.87734 1.5875,-1.19063 3.770312,-1.28985 l 0.09922,0.4961 q -1.686719,1.68672 -5.853906,7.54062 -4.067969,5.85391 -5.853906,9.22735 -0.396875,0.89297 -0.992188,1.0914 -0.297656,0.29766 -1.2898438,0.19844 -0.6945313,0.0992 -0.9921875,-0.19844 -0.2976563,-0.19843 -0.5953125,-0.79375 -0.9921875,-2.38125 -1.488282,-4.06797 z"
style="font-size:25.39999962px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332"
id="path2605"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@@ -0,0 +1,101 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg8"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="result-warning.svg">
<defs
id="defs2">
<inkscape:path-effect
effect="spiro"
id="path-effect831"
is_visible="true" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="102.28993"
inkscape:cy="113.44001"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<ellipse
style="fill:#dcaf00;fill-opacity:1;stroke:none;stroke-width:1.13353121;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="path837"
cx="14.991481"
cy="282.01321"
rx="14.859186"
ry="14.835566" />
<g
aria-label="⚠"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.39999962px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
id="text841">
<path
d="M 25.20215,290.10568 H 5.0359398 q -0.2108399,0 -0.3844727,-0.12403 -0.1612304,-0.12402 -0.2604492,-0.29765 -0.099219,-0.17364 -0.099219,-0.37207 0,-0.18604 0.099219,-0.38448 L 14.461721,271.04327 q 0.09922,-0.17363 0.272851,-0.26045 0.173633,-0.0868 0.372071,-0.0868 0.198437,0 0.37207,0.0868 0.173633,0.0868 0.272852,0.26045 l 10.095507,17.88418 q 0.09922,0.19844 0.09922,0.38448 0,0.19843 -0.09922,0.37207 -0.09922,0.17363 -0.272851,0.29765 -0.161231,0.12403 -0.372071,0.12403 z M 6.3257835,288.51818 H 23.887502 l -8.780859,-15.55254 z m 9.9342775,-4.51446 h -2.306836 v -6.8833 h 2.306836 z m 0.347265,2.25723 q 0,0.32246 -0.124023,0.59531 -0.111621,0.27285 -0.322461,0.48369 -0.198438,0.19844 -0.471289,0.32246 -0.272852,0.11163 -0.58291,0.11163 -0.310059,0 -0.58291,-0.11163 -0.272852,-0.12402 -0.471289,-0.32246 -0.198438,-0.21084 -0.310059,-0.48369 -0.111621,-0.27285 -0.111621,-0.59531 0,-0.31006 0.111621,-0.59531 0.111621,-0.28526 0.310059,-0.48369 0.198437,-0.21084 0.471289,-0.33487 0.272851,-0.12402 0.58291,-0.12402 0.310058,0 0.58291,0.12402 0.272851,0.12403 0.471289,0.33487 0.21084,0.19843 0.322461,0.48369 0.124023,0.28525 0.124023,0.59531 z"
style="font-size:25.39999962px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332"
id="path1445"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

@@ -0,0 +1,84 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="rotate-left.svg">
<defs
id="defs5285" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.2"
inkscape:cx="25.205349"
inkscape:cy="65.2238"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<path
inkscape:connector-curvature="0"
id="path1378"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.39999962px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
d="m 19.216545,279.12842 -1.5875,-5.90352 5.903515,1.5751 -2.59209,0.86816 q 2.691309,2.86495 2.691309,6.49883 0,3.80752 -2.691309,6.49883 -2.691308,2.67891 -6.486425,2.67891 -3.807519,0 -6.4864255,-2.67891 -2.691309,-2.69131 -2.691309,-6.48643 0,-3.65869 2.678906,-6.51123 l 0.868164,0.86817 q -2.33164,2.46806 -2.33164,5.63066 0,3.29903 2.33164,5.63067 2.3316415,2.31923 5.6306645,2.31923 3.286621,0 5.618261,-2.31923 2.331641,-2.33164 2.331641,-5.60586 0,-2.77813 -1.79834,-5.07256 l -0.533301,-0.58291 q -0.347265,0.49609 -0.855761,2.59209 z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@@ -0,0 +1,84 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="rotate-right.svg">
<defs
id="defs5285" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.2"
inkscape:cx="13.151778"
inkscape:cy="65.2238"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<path
inkscape:connector-curvature="0"
id="path1378"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.39999962px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
d="m 9.6915448,279.12842 q -0.5084961,-2.096 -0.8557617,-2.59209 l -0.5333008,0.58291 q -1.7983398,2.29443 -1.7983398,5.07256 0,3.27422 2.3316406,5.60586 2.3316409,2.31923 5.6182619,2.31923 3.299023,0 5.630664,-2.31923 2.33164,-2.33164 2.33164,-5.63067 0,-3.1626 -2.33164,-5.63066 l 0.868164,-0.86817 q 2.678906,2.85254 2.678906,6.51123 0,3.79512 -2.691309,6.48643 -2.678906,2.67891 -6.486425,2.67891 -3.795117,0 -6.4864259,-2.67891 -2.6913086,-2.69131 -2.6913086,-6.49883 0,-3.63388 2.6913086,-6.49883 L 5.3755292,274.8 11.279045,273.2249 Z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@@ -0,0 +1,135 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="screenshot-tool.svg">
<defs
id="defs5285">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 15 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="30 : 15 : 1"
inkscape:persp3d-origin="15 : 10 : 1"
id="perspective5921" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.35355338"
inkscape:cx="813.01344"
inkscape:cy="-622.0065"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<flowRoot
xml:space="preserve"
id="flowRoot5913"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"><flowRegion
id="flowRegion5915"><rect
id="rect5917"
width="129.22377"
height="91.747108"
x="-13.788582"
y="-33.515606" /></flowRegion><flowPara
id="flowPara5919" /></flowRoot> <flowRoot
xml:space="preserve"
id="flowRoot843"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"><flowRegion
id="flowRegion845"><rect
id="rect847"
width="159.09903"
height="129.04698"
x="-37.123108"
y="-35.460152" /></flowRegion><flowPara
id="flowPara849" /></flowRoot> <rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.39999998;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="rect851"
width="24.789249"
height="16.884754"
x="2.5958552"
y="275.43802" />
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.78122473;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="rect853"
width="2.7173724"
height="1.2168522"
x="4.1575332"
y="273.02496" />
<ellipse
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.39999998;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="path855"
cx="14.84974"
cy="283.91141"
rx="5.589323"
ry="5.4322267" />
<ellipse
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.39999998;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="path857"
cx="14.896935"
cy="283.81024"
rx="3.0401912"
ry="2.9934189" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

@@ -0,0 +1,122 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="security.svg">
<defs
id="defs5285">
<inkscape:path-effect
effect="bspline"
id="path-effect831"
is_visible="true"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.35"
inkscape:cx="-887.45193"
inkscape:cy="248.19877"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<rect
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect827"
width="22.395088"
height="12.425969"
x="4.2049851"
y="280.18005"
ry="1.3063761"
rx="0.80319941" />
<path
style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="m 8.8351933,280.08557 c -0.015751,-1.9059 -0.0315,-3.81153 0.2362696,-5.37063 0.2677698,-1.55909 0.8190596,-2.77193 2.8738961,-3.37025 2.054836,-0.59831 5.615048,-0.58257 7.670115,0.0158 2.055068,0.59836 2.606322,1.77962 2.889831,3.29942 0.283509,1.51979 0.299258,3.37799 0.31501,5.23664"
id="path829"
inkscape:connector-curvature="0"
inkscape:path-effect="#path-effect831"
inkscape:original-d="m 8.8351933,280.08557 c -0.015483,-1.9059 -0.031233,-3.81153 -0.047247,-5.71689 0.5514038,-1.21278 1.1026949,-2.42562 1.6536457,-3.63803 3.558604,0.0155 7.118816,0.0312 10.677827,0.0472 0.55144,1.18083 1.102695,2.36209 1.653646,3.54353 0.01602,1.8583 0.03176,3.7165 0.04725,5.57515" />
<ellipse
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path839"
cx="15.56845"
cy="285.39047"
rx="2.5390604"
ry="2.4555387" />
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect845"
width="2.5513394"
height="4.9136906"
x="14.315848"
y="286.88913"
rx="0.80319828"
ry="1.1575521" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

@@ -0,0 +1,226 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="select-text.svg">
<defs
id="defs5285">
<marker
inkscape:stockid="Arrow1Lstart"
orient="auto"
refY="0.0"
refX="0.0"
id="marker1935"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1933"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
transform="scale(0.8) translate(12.5,0)" />
</marker>
<marker
inkscape:stockid="Club"
orient="auto"
refY="0.0"
refX="0.0"
id="Club"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1637"
d="M -1.5971367,-7.0977635 C -3.4863874,-7.0977635 -5.0235187,-5.5606321 -5.0235187,-3.6713813 C -5.0235187,-3.0147015 -4.7851656,-2.4444556 -4.4641095,-1.9232271 C -4.5028609,-1.8911157 -4.5437814,-1.8647646 -4.5806531,-1.8299921 C -5.2030765,-2.6849849 -6.1700514,-3.2751330 -7.3077730,-3.2751330 C -9.1970245,-3.2751331 -10.734155,-1.7380016 -10.734155,0.15124914 C -10.734155,2.0404999 -9.1970245,3.5776313 -7.3077730,3.5776313 C -6.3143268,3.5776313 -5.4391540,3.1355702 -4.8137404,2.4588126 C -4.9384274,2.8137041 -5.0235187,3.1803000 -5.0235187,3.5776313 C -5.0235187,5.4668819 -3.4863874,7.0040135 -1.5971367,7.0040135 C 0.29211394,7.0040135 1.8292454,5.4668819 1.8292454,3.5776313 C 1.8292454,2.7842354 1.5136868,2.0838028 1.0600576,1.5031550 C 2.4152718,1.7663868 3.7718375,2.2973711 4.7661444,3.8340272 C 4.0279463,3.0958289 3.5540908,1.7534117 3.5540908,-0.058529361 L 2.9247554,-0.10514681 L 3.5074733,-0.12845553 C 3.5074733,-1.9403966 3.9580199,-3.2828138 4.6962183,-4.0210121 C 3.7371277,-2.5387813 2.4390549,-1.9946496 1.1299838,-1.7134486 C 1.5341802,-2.2753578 1.8292454,-2.9268556 1.8292454,-3.6713813 C 1.8292454,-5.5606319 0.29211394,-7.0977635 -1.5971367,-7.0977635 z "
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.74587913pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
transform="scale(0.6)" />
</marker>
<marker
inkscape:stockid="Torso"
orient="auto"
refY="0.0"
refX="0.0"
id="Torso"
style="overflow:visible"
inkscape:isstock="true">
<g
id="g1634"
transform="scale(0.7)"
style="stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1">
<path
id="path1620"
d="M -4.7792281,-3.2395420 C -2.4288541,-2.8736027 0.52103922,-1.3019943 0.25792722,0.38794346 C -0.0051877922,2.0778819 -2.2126741,2.6176539 -4.5630471,2.2517169 C -6.9134221,1.8857769 -8.5210350,0.75201414 -8.2579220,-0.93792336 C -7.9948090,-2.6278615 -7.1296041,-3.6054813 -4.7792281,-3.2395420 z "
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.25;stroke-opacity:1" />
<path
id="path1622"
d="M 4.4598789,0.088665736 C -2.5564571,-4.3783320 5.2248769,-3.9061806 -0.84829578,-8.7197331"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
<path
id="path1624"
d="M 4.9298719,0.057520736 C -1.3872731,1.7494689 1.8027579,5.4782079 -4.9448731,7.5462725"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
<rect
id="rect1626"
transform="matrix(0.527536,-0.849533,0.887668,0.460484,0,0)"
y="-1.7408575"
x="-10.391706"
height="2.7608147"
width="2.6366582"
style="fill-rule:evenodd;stroke-width:1pt;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1" />
<rect
id="rect1628"
transform="matrix(0.671205,-0.741272,0.790802,0.612072,0,0)"
y="-7.9629307"
x="4.9587269"
height="2.8614161"
width="2.7327356"
style="fill-rule:evenodd;stroke-width:1pt;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1" />
<path
id="path1630"
transform="matrix(0,-1.109517,1.109517,0,25.96648,19.71619)"
d="M 16.779951 -28.685045 A 0.60731727 0.60731727 0 1 0 15.565317,-28.685045 A 0.60731727 0.60731727 0 1 0 16.779951 -28.685045 z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
<path
id="path1632"
transform="matrix(0,-1.109517,1.109517,0,26.82450,16.99126)"
d="M 16.779951 -28.685045 A 0.60731727 0.60731727 0 1 0 15.565317,-28.685045 A 0.60731727 0.60731727 0 1 0 16.779951 -28.685045 z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
</g>
</marker>
<marker
inkscape:stockid="Arrow2Lstart"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow2Lstart"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1426"
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
transform="scale(1.1) translate(1,0)" />
</marker>
<marker
inkscape:stockid="TriangleInL"
orient="auto"
refY="0.0"
refX="0.0"
id="TriangleInL"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1541"
d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
transform="scale(-0.8)" />
</marker>
<marker
inkscape:stockid="Arrow1Lstart"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow1Lstart"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1408"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
transform="scale(0.8) translate(12.5,0)" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.979899"
inkscape:cx="-0.15372919"
inkscape:cy="4.1302353"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.28888893px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="2.0528727"
y="290.79916"
id="text1404"><tspan
sodipodi:role="line"
id="tspan1402"
x="2.0528727"
y="290.79916"
style="font-size:11.28888893px;stroke-width:0.26458332">abc</tspan></text>
<g
id="g2058">
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 12.566406,271.99023 -0.533203,0.59571 13.763672,12.29492 0.533203,-0.5957 z"
id="path1406"
inkscape:connector-curvature="0" />
<path
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.64000006pt;stroke-opacity:1"
d="m 18.266245,277.61759 4.518301,-0.25488 -10.484776,-5.0744 6.221355,9.84758 z"
id="path2064"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -0,0 +1,102 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="send-mail.svg">
<defs
id="defs5285" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.4"
inkscape:cx="30.416613"
inkscape:cy="-20.999376"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<rect
style="fill:#c8c8c8;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="rect831"
width="26.647322"
height="19.135044"
x="1.7008928"
y="272.33707"
ry="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.8;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="M 1.7008928,272.33707 15.308036,284.45591 28.348215,272.33707"
id="path833"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.8;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="M 1.7008928,291.47211 12.425967,281.85733"
id="path837"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.8;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="m 28.348215,291.47211 -10.299852,-9.6384"
id="path839"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@@ -0,0 +1,161 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="settings.svg">
<defs
id="defs5285">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 15 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="30 : 15 : 1"
inkscape:persp3d-origin="15 : 10 : 1"
id="perspective5921" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.35355339"
inkscape:cx="-1059.6544"
inkscape:cy="526.71211"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<flowRoot
xml:space="preserve"
id="flowRoot5913"
style="fill:black;fill-opacity:1;stroke:none;font-family:sans-serif;font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;letter-spacing:0px;word-spacing:0px"><flowRegion
id="flowRegion5915"><rect
id="rect5917"
width="129.22377"
height="91.747108"
x="-13.788582"
y="-33.515606" /></flowRegion><flowPara
id="flowPara5919"></flowPara></flowRoot> <ellipse
style="fill:#f0f0f0;fill-opacity:1;stroke:#000000;stroke-width:0.30000001;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path5947"
cx="14.59865"
cy="282.54169"
rx="8.6879292"
ry="8.7347021" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
d="m 11.22532,274.4792 0.467722,-2.22168 1.800728,-0.35079 0.865285,1.82412 z"
id="path5949"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
d="m 16.503385,274.01432 v -0.13229 l 1.025261,-1.65364 1.951302,0.79375 -0.165365,2.21588"
id="path5955"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
d="m 20.736718,276.23021 2.116667,-0.82682 1.058333,1.81901 -1.488281,1.48828"
id="path5957"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
d="m 23.25026,280.43047 1.620573,0.26458 0.23151,2.11667 -1.752864,0.76068"
id="path5959"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
d="m 22.853385,285.55677 1.488281,1.75287 -1.289843,1.91822 -1.852084,-0.79375"
id="path5961"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
d="m 19.667696,289.61 -0.257247,2.22168 -2.361994,0.81851 -1.286235,-1.35639"
id="path5963"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
d="m 13.423612,291.34057 -1.07576,1.66041 -2.315222,-0.98222 v -1.94104"
id="path5965"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
d="m 8.5125345,289.04873 -2.5023112,0.30402 -1.3563928,-2.0112 1.5200956,-2.24507"
id="path5967"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
d="m 5.8699069,283.08528 -0.1169303,-0.0234 -2.3619946,-0.81851 0.4209497,-2.89987 2.6893996,-0.32741"
id="path5969"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
d="m 7.2262996,278.1742 -1.4967092,-2.29183 1.9176589,-2.22168 2.7595577,1.23946"
id="path5971"
inkscape:connector-curvature="0" />
<ellipse
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.30000001;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path5975"
cx="14.816667"
cy="282.87787"
rx="2.0835936"
ry="2.0505209" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.7 KiB

View File

@@ -0,0 +1,111 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg871"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="shading.svg">
<defs
id="defs865">
<linearGradient
inkscape:collect="always"
id="linearGradient1422">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop1418" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop1420" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient1422"
id="radialGradient1424"
cx="14.950389"
cy="281.9661"
fx="14.950389"
fy="281.9661"
r="13.931085"
gradientTransform="matrix(1,0,0,1.0083935,0,-2.3666712)"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.9195959"
inkscape:cx="47.362246"
inkscape:cy="32.247958"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata868">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<rect
style="fill:url(#radialGradient1424);stroke:none;stroke-width:0.3;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;fill-opacity:1"
id="rect1416"
width="27.56217"
height="27.79603"
x="1.1693041"
y="268.06808" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 23 KiB

View File

@@ -0,0 +1,94 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg8"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="signature.svg">
<defs
id="defs2">
<inkscape:path-effect
effect="spiro"
id="path-effect831"
is_visible="true" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="166.75422"
inkscape:cy="113.44001"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<g
aria-label="✍"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.39999962px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
id="text837">
<path
d="m 24.320405,282.11063 h 4.7625 v 12.47675 H 2.7899365 q -0.471289,0 -0.8805664,-0.17363 -0.396875,-0.17363 -0.7069336,-0.48369 -0.29765621,-0.29766 -0.47128902,-0.70693 -0.17363281,-0.39688 -0.17363281,-0.86817 0,-0.59531 0.24804687,-1.00459 0.24804686,-0.40928 0.64492186,-0.80615 v -1.15342 l 1.5875,-1.5875 q -0.3348633,-0.47129 -0.5208984,-1.00459 -0.1736329,-0.5457 -0.1736329,-1.12861 0,-0.70693 0.2604493,-1.35186 0.2728515,-0.65732 0.7813476,-1.16582 l 5.3454101,-5.34541 q 0.5084961,-0.50849 1.1534179,-0.76894 0.657324,-0.27285 1.364258,-0.27285 h 2.827734 l 6.98252,-6.98252 4.303613,4.30361 -4.526856,4.52686 z m -0.744141,1.78593 -4.638476,-4.65088 q -0.111621,0.11163 -0.496094,0.4961 -0.37207,0.38447 -0.880566,0.89297 -0.496094,0.50849 -1.066602,1.079 -0.558105,0.57051 -1.041797,1.0542 -0.483691,0.48369 -0.818554,0.81856 -0.334864,0.32246 -0.396875,0.35966 0.384472,0.13643 0.483691,0.47129 0.111621,0.32246 0.111621,0.68213 0,0.14883 -0.0124,0.29766 0,0.13642 0,0.27285 0,0.74414 -0.285254,1.40146 -0.272852,0.64493 -0.756543,1.12862 -0.483691,0.48369 -1.141016,0.76894 -0.644922,0.27285 -1.389062,0.27285 H 7.6888622 q -0.3720703,0 -0.6945312,0.13643 -0.322461,0.14883 -0.5705078,0.38447 -0.2356446,0.24805 -0.3844727,0.57051 -0.1364258,0.32246 -0.1364258,0.69453 0,0.33486 0.1364258,0.68213 0.062012,0.0992 0.1116211,0.18604 0.049609,0.0992 0.1116211,0.19843 0.2480469,0.32246 0.6325195,0.5085 0.396875,0.19844 0.79375,0.19844 H 27.296967 v -8.90489 z m -18.566308,8.01192 0.1240234,-0.11162 q -0.1240234,-0.35967 -0.1240234,-0.76895 0,-0.5581 0.2108398,-1.0418 0.2108399,-0.48369 0.5705079,-0.84335 0.3720703,-0.37208 0.8557617,-0.58292 0.4836914,-0.21083 1.0417968,-0.21083 H 8.581831 q 3.150195,-3.1254 6.238379,-6.22598 3.100586,-3.11299 6.238379,-6.25078 l -1.785938,-1.78594 q -4.005957,4.00596 -8.024316,8.01191 -4.0183595,4.00596 -8.0119141,8.03672 v 1.77354 z m 6.238379,-13.36973 q -0.731738,0 -1.2526369,0.5209 l -5.3454101,5.35781 q -0.2480468,0.24805 -0.396875,0.58291 -0.1364257,0.32246 -0.1364257,0.68213 0,0.48369 0.2232422,0.84336 0.2356445,0.35967 0.5953124,0.64492 l 8.6196291,-8.63203 z m 9.810254,-6.23838 -1.153418,1.15342 1.785937,1.78594 1.153418,-1.15342 z"
style="stroke-width:0.26458332"
id="path839"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

@@ -0,0 +1,178 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="speech.svg">
<defs
id="defs5285" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.49497475"
inkscape:cx="-720.23371"
inkscape:cy="504.12186"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<rect
style="fill:#ffffff;fill-opacity:0.9948007;stroke:#000000;stroke-width:1.39999998;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="rect827"
width="7.0398064"
height="7.2760415"
x="5.5562501"
y="278.05869" />
<path
style="fill:none;stroke:#000000;stroke-width:0.69999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 12.596056,278.05869 5.87753,-5.69801"
id="path831"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.69999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 12.596056,285.33472 5.69801,5.87753"
id="path831-3"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.69999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 18.473586,272.36068 -0.17952,18.85157"
id="path848"
inkscape:connector-curvature="0" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="21.426525"
y="275.73883"
id="text854"><tspan
sodipodi:role="line"
id="tspan852"
x="21.426525"
y="285.39432"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332" /></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="25.962238"
y="272.19531"
id="text858"><tspan
sodipodi:role="line"
id="tspan856"
x="25.962238"
y="281.8508"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332" /></text>
<g
id="g4572">
<g
id="text862"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
aria-label="~">
<path
inkscape:connector-curvature="0"
id="path864"
style="stroke-width:0.26458332"
d="m 27.160395,274.77545 q -0.01034,0.5116 -0.118856,1.00769 -0.103353,0.4961 -0.335897,0.88367 -0.237711,0.39791 -0.573608,0.62528 -0.335897,0.22738 -0.852661,0.22738 -0.485758,0 -0.862996,-0.20154 -0.377238,-0.2067 -0.81132,-0.7338 -0.5271,-0.64596 -0.764812,-0.81132 -0.237711,-0.16537 -0.496093,-0.16537 -0.485759,0 -0.744141,0.45475 -0.258382,0.44959 -0.304891,1.46245 h -0.862996 q 0.01033,-0.51677 0.113688,-1.00252 0.10852,-0.49093 0.335897,-0.88884 0.222208,-0.38241 0.578776,-0.61495 0.356567,-0.23771 0.852661,-0.23771 0.480591,0 0.857829,0.20154 0.382405,0.19637 0.821655,0.7338 0.413411,0.50643 0.676961,0.74414 0.26355,0.23255 0.578776,0.23255 0.532267,0 0.780314,-0.52193 0.253215,-0.52194 0.268718,-1.39527 z" />
</g>
</g>
<g
transform="translate(-0.03100652,3.6756618)"
id="g4572-2">
<g
id="text862-6"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
aria-label="~">
<path
inkscape:connector-curvature="0"
id="path864-3"
style="stroke-width:0.26458332"
d="m 27.160395,274.77545 q -0.01034,0.5116 -0.118856,1.00769 -0.103353,0.4961 -0.335897,0.88367 -0.237711,0.39791 -0.573608,0.62528 -0.335897,0.22738 -0.852661,0.22738 -0.485758,0 -0.862996,-0.20154 -0.377238,-0.2067 -0.81132,-0.7338 -0.5271,-0.64596 -0.764812,-0.81132 -0.237711,-0.16537 -0.496093,-0.16537 -0.485759,0 -0.744141,0.45475 -0.258382,0.44959 -0.304891,1.46245 h -0.862996 q 0.01033,-0.51677 0.113688,-1.00252 0.10852,-0.49093 0.335897,-0.88884 0.222208,-0.38241 0.578776,-0.61495 0.356567,-0.23771 0.852661,-0.23771 0.480591,0 0.857829,0.20154 0.382405,0.19637 0.821655,0.7338 0.413411,0.50643 0.676961,0.74414 0.26355,0.23255 0.578776,0.23255 0.532267,0 0.780314,-0.52193 0.253215,-0.52194 0.268718,-1.39527 z" />
</g>
</g>
<g
transform="translate(-0.08637403,6.8460108)"
id="g4572-5">
<g
id="text862-1"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
aria-label="~">
<path
inkscape:connector-curvature="0"
id="path864-0"
style="stroke-width:0.26458332"
d="m 27.160395,274.77545 q -0.01034,0.5116 -0.118856,1.00769 -0.103353,0.4961 -0.335897,0.88367 -0.237711,0.39791 -0.573608,0.62528 -0.335897,0.22738 -0.852661,0.22738 -0.485758,0 -0.862996,-0.20154 -0.377238,-0.2067 -0.81132,-0.7338 -0.5271,-0.64596 -0.764812,-0.81132 -0.237711,-0.16537 -0.496093,-0.16537 -0.485759,0 -0.744141,0.45475 -0.258382,0.44959 -0.304891,1.46245 h -0.862996 q 0.01033,-0.51677 0.113688,-1.00252 0.10852,-0.49093 0.335897,-0.88884 0.222208,-0.38241 0.578776,-0.61495 0.356567,-0.23771 0.852661,-0.23771 0.480591,0 0.857829,0.20154 0.382405,0.19637 0.821655,0.7338 0.413411,0.50643 0.676961,0.74414 0.26355,0.23255 0.578776,0.23255 0.532267,0 0.780314,-0.52193 0.253215,-0.52194 0.268718,-1.39527 z" />
</g>
</g>
<g
transform="translate(-0.11738003,10.521682)"
id="g4572-2-8">
<g
id="text862-6-6"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
aria-label="~">
<path
inkscape:connector-curvature="0"
id="path864-3-3"
style="stroke-width:0.26458332"
d="m 27.160395,274.77545 q -0.01034,0.5116 -0.118856,1.00769 -0.103353,0.4961 -0.335897,0.88367 -0.237711,0.39791 -0.573608,0.62528 -0.335897,0.22738 -0.852661,0.22738 -0.485758,0 -0.862996,-0.20154 -0.377238,-0.2067 -0.81132,-0.7338 -0.5271,-0.64596 -0.764812,-0.81132 -0.237711,-0.16537 -0.496093,-0.16537 -0.485759,0 -0.744141,0.45475 -0.258382,0.44959 -0.304891,1.46245 h -0.862996 q 0.01033,-0.51677 0.113688,-1.00252 0.10852,-0.49093 0.335897,-0.88884 0.222208,-0.38241 0.578776,-0.61495 0.356567,-0.23771 0.852661,-0.23771 0.480591,0 0.857829,0.20154 0.382405,0.19637 0.821655,0.7338 0.413411,0.50643 0.676961,0.74414 0.26355,0.23255 0.578776,0.23255 0.532267,0 0.780314,-0.52193 0.253215,-0.52194 0.268718,-1.39527 z" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -0,0 +1,143 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="squiggly.svg">
<defs
id="defs5285">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 15 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="30 : 15 : 1"
inkscape:persp3d-origin="15 : 10 : 1"
id="perspective5921" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.313708"
inkscape:cx="89.028194"
inkscape:cy="37.937149"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.39999962px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="-0.79375011"
y="291.11298"
id="text972"><tspan
sodipodi:role="line"
id="tspan970"
x="-0.79375011"
y="291.11298"
style="stroke-width:0.26458332">ab</tspan></text>
<path
style="fill:none;stroke:#ff0000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 1.4221355,293.99037 1.5213542,-1.55443 1.3890626,1.52135"
id="path2905"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#ff0000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 4.3325523,293.95729 1.5213542,-1.55443 1.3890626,1.52135"
id="path2905-8"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#ff0000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 7.2429691,293.92421 1.5213542,-1.55443 1.3890627,1.52135"
id="path2905-8-3"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#ff0000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 10.153386,293.89113 1.521354,-1.55443 1.389063,1.52135"
id="path2905-8-5"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#ff0000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 13.063803,293.85805 1.521354,-1.55443 1.389063,1.52135"
id="path2905-8-2"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#ff0000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 15.97422,293.82497 1.521354,-1.55443 1.389062,1.52135"
id="path2905-8-0"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#ff0000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 18.884636,293.79189 1.521354,-1.55443 1.389063,1.52135"
id="path2905-8-29"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#ff0000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 21.795053,293.75881 1.521355,-1.55443 1.389062,1.52135"
id="path2905-8-6"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#ff0000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 24.70547,293.72573 1.521354,-1.55443 1.389062,1.52135"
id="path2905-8-7"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.9 KiB

View File

@@ -0,0 +1,93 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="stop.svg">
<defs
id="defs5285" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.2"
inkscape:cx="41.558699"
inkscape:cy="60.048176"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<rect
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:2.7220552;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="rect4530"
width="19.48431"
height="22.483788"
x="5.4143338"
y="270.4855" />
<rect
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.36963594;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="rect4530-3"
width="4.6841955"
height="23.677502"
x="18.016645"
y="269.91937" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -0,0 +1,107 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="strikeout.svg">
<defs
id="defs5285">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 15 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="30 : 15 : 1"
inkscape:persp3d-origin="15 : 10 : 1"
id="perspective5921" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="3.9999998"
inkscape:cx="253.27643"
inkscape:cy="-27.618099"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<g
aria-label="ab"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.39999962px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
id="text972">
<path
d="M 12.265918,291.11298 H 9.9466794 v -1.47588 q -0.3100586,0.21084 -0.8433593,0.59531 -0.5208985,0.37207 -1.0169922,0.59531 -0.5829102,0.28526 -1.3394531,0.47129 -0.756543,0.19844 -1.7735352,0.19844 -1.8727538,0 -3.1749999,-1.24024 -1.30224608,-1.24023 -1.30224608,-3.16259 0,-1.5751 0.66972658,-2.54248 0.6821289,-0.97979 1.9347656,-1.53789 1.265039,-0.55811 3.0385741,-0.75655 1.7735352,-0.19843 3.8075195,-0.29765 v -0.35967 q 0,-0.79375 -0.2852539,-1.31465 -0.2728515,-0.5209 -0.79375,-0.81855 -0.4960937,-0.28526 -1.190625,-0.38448 -0.6945312,-0.0992 -1.4510742,-0.0992 -0.9177734,0 -2.0463866,0.24805 -1.1286133,0.23565 -2.3316406,0.69453 H 1.7239256 v -2.36885 q 0.6821289,-0.18603 1.9719727,-0.40927 1.2898437,-0.22324 2.5424804,-0.22324 1.4634765,0 2.5424804,0.24804 1.0914063,0.23565 1.8851559,0.81856 0.781348,0.5705 1.190625,1.47588 0.409278,0.90537 0.409278,2.24482 z m -2.3192386,-3.41065 v -3.85713 q -1.0666015,0.062 -2.5176757,0.18604 -1.4386719,0.12402 -2.2820312,0.35967 -1.0045899,0.28525 -1.624707,0.89296 -0.6201172,0.59532 -0.6201172,1.64952 0,1.19062 0.7193359,1.79834 0.7193359,0.59531 2.1952148,0.59531 1.227832,0 2.2448242,-0.47129 1.0169922,-0.48369 1.8851562,-1.15342 z"
style="stroke-width:0.26458332"
id="path974"
inkscape:connector-curvature="0" />
<path
d="m 28.971874,284.08085 q 0,1.73633 -0.496094,3.12539 -0.483691,1.38906 -1.314648,2.33164 -0.880566,0.97978 -1.934766,1.47588 -1.054199,0.48369 -2.319238,0.48369 -1.178223,0 -2.058789,-0.28526 -0.880566,-0.27285 -1.736328,-0.74414 l -0.148828,0.64493 H 16.78037 v -19.29805 h 2.331641 v 6.8957 q 0.979785,-0.80615 2.083594,-1.31465 1.103808,-0.52089 2.480468,-0.52089 2.455664,0 3.869532,1.88515 1.426269,1.88516 1.426269,5.32061 z m -2.406055,0.062 q 0,-2.48047 -0.818554,-3.75791 -0.818555,-1.28984 -2.641699,-1.28984 -1.016993,0 -2.058789,0.44648 -1.041797,0.43408 -1.934766,1.12861 v 7.9375 q 0.992187,0.44649 1.699121,0.62012 0.719336,0.17363 1.624707,0.17363 1.934766,0 3.026172,-1.26504 1.103808,-1.27744 1.103808,-3.99355 z"
style="stroke-width:0.26458332"
id="path976"
inkscape:connector-curvature="0" />
</g>
<path
style="fill:none;stroke:#ff0000;stroke-width:1.89999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 0.5622396,284.10158 28.905731,283.96929"
id="path979"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.5 KiB

View File

@@ -0,0 +1,270 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="synchronize.svg">
<defs
id="defs5285">
<inkscape:path-effect
effect="bspline"
id="path-effect1207"
is_visible="true"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<marker
inkscape:stockid="Arrow2Lend"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow2Lend"
style="overflow:visible;"
inkscape:isstock="true">
<path
id="path898"
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
transform="scale(1.1) rotate(180) translate(1,0)" />
</marker>
<inkscape:path-effect
effect="bspline"
id="path-effect1183"
is_visible="true"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect1179"
is_visible="true"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<marker
inkscape:stockid="TriangleOutL"
orient="auto"
refY="0.0"
refX="0.0"
id="TriangleOutL"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1019"
d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
transform="scale(0.8)" />
</marker>
<inkscape:path-effect
effect="bspline"
id="path-effect875"
is_visible="true"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect861"
is_visible="true"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect857"
is_visible="true"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect853"
is_visible="true"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect849"
is_visible="true"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="bspline"
id="path-effect845"
is_visible="true"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="skeletal"
id="path-effect837"
is_visible="true"
pattern="M 0,5 C 0,2.24 2.24,0 5,0 7.76,0 10,2.24 10,5 10,7.76 7.76,10 5,10 2.24,10 0,7.76 0,5 Z"
copytype="single_stretched"
prop_scale="0.26458333"
scale_y_rel="false"
spacing="0"
normal_offset="0"
tang_offset="0"
prop_units="false"
vertical_pattern="false"
fuse_tolerance="0" />
<marker
inkscape:stockid="Arrow2Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow2Lend-5"
style="overflow:visible"
inkscape:isstock="true">
<path
inkscape:connector-curvature="0"
id="path898-1"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
</marker>
<inkscape:path-effect
effect="bspline"
id="path-effect1183-5"
is_visible="true"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.2"
inkscape:cx="120.53309"
inkscape:cy="11.77171"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<ellipse
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path867"
cx="15.270238"
cy="282.03217"
rx="11.670015"
ry="11.292038" />
<g
id="g8785">
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 15.901303,286.40781 -0.01563,0.80078 3.474608,0.0664 0.01563,-0.80078 z"
id="path1181"
inkscape:connector-curvature="0" />
<path
d="m 10.884926,283.16137 9.545034,3.71976 -9.680958,3.35013 c 1.575879,-2.05751 1.621928,-4.91309 0.135924,-7.06989 z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.55000001;stroke-linejoin:round;stroke-opacity:1"
id="path8791"
inkscape:connector-curvature="0" />
</g>
<g
id="g8752">
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 14.787663,278.32079 0.01563,-0.80078 -3.474609,-0.0664 -0.01563,0.80078 z"
id="path1181-5"
inkscape:connector-curvature="0" />
<path
d="m 19.804039,281.56723 -9.545033,-3.71976 9.680958,-3.35013 c -1.57588,2.0575 -1.621928,4.91309 -0.135925,7.06989 z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.55000001;stroke-linejoin:round;stroke-opacity:1"
id="path8758"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -0,0 +1,138 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="ui.svg">
<defs
id="defs5285">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 15 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="30 : 15 : 1"
inkscape:persp3d-origin="15 : 10 : 1"
id="perspective5921" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.49999998"
inkscape:cx="-709.86288"
inkscape:cy="-498.71696"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<flowRoot
xml:space="preserve"
id="flowRoot5913"
style="fill:black;fill-opacity:1;stroke:none;font-family:sans-serif;font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;letter-spacing:0px;word-spacing:0px"><flowRegion
id="flowRegion5915"><rect
id="rect5917"
width="129.22377"
height="91.747108"
x="-13.788582"
y="-33.515606" /></flowRegion><flowPara
id="flowPara5919" /></flowRoot> <rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="rect845"
width="27.735897"
height="26.309353"
x="1.403165"
y="269.40442" />
<rect
style="fill:#000000;fill-opacity:0.34117648;stroke:#000000;stroke-width:0.5;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="rect847"
width="27.665739"
height="2.4087679"
x="1.403165"
y="269.40442" />
<rect
style="fill:none;fill-opacity:0.34117647;stroke:#000000;stroke-width:0.5;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="rect849"
width="8.8633251"
height="20.462824"
x="2.3386083"
y="273.73083" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 4.1671877,276.32943 5.4570315,0.0331"
id="path855"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 4.1837241,277.58619 5.4570312,0.0331"
id="path855-1"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 3.9604819,278.9091 5.4570297,0.0331"
id="path855-5"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 3.9770183,280.16586 5.4570293,0.0331"
id="path855-1-5"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

@@ -0,0 +1,107 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="underline.svg">
<defs
id="defs5285">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 15 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="30 : 15 : 1"
inkscape:persp3d-origin="15 : 10 : 1"
id="perspective5921" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.9999996"
inkscape:cx="51.633241"
inkscape:cy="75.073314"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<g
aria-label="ab"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.39999962px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
id="text972">
<path
d="M 12.265918,291.11298 H 9.9466794 v -1.47588 q -0.3100586,0.21084 -0.8433593,0.59531 -0.5208985,0.37207 -1.0169922,0.59531 -0.5829102,0.28526 -1.3394531,0.47129 -0.756543,0.19844 -1.7735352,0.19844 -1.8727538,0 -3.1749999,-1.24024 -1.30224608,-1.24023 -1.30224608,-3.16259 0,-1.5751 0.66972658,-2.54248 0.6821289,-0.97979 1.9347656,-1.53789 1.265039,-0.55811 3.0385741,-0.75655 1.7735352,-0.19843 3.8075195,-0.29765 v -0.35967 q 0,-0.79375 -0.2852539,-1.31465 -0.2728515,-0.5209 -0.79375,-0.81855 -0.4960937,-0.28526 -1.190625,-0.38448 -0.6945312,-0.0992 -1.4510742,-0.0992 -0.9177734,0 -2.0463866,0.24805 -1.1286133,0.23565 -2.3316406,0.69453 H 1.7239256 v -2.36885 q 0.6821289,-0.18603 1.9719727,-0.40927 1.2898437,-0.22324 2.5424804,-0.22324 1.4634765,0 2.5424804,0.24804 1.0914063,0.23565 1.8851559,0.81856 0.781348,0.5705 1.190625,1.47588 0.409278,0.90537 0.409278,2.24482 z m -2.3192386,-3.41065 v -3.85713 q -1.0666015,0.062 -2.5176757,0.18604 -1.4386719,0.12402 -2.2820312,0.35967 -1.0045899,0.28525 -1.624707,0.89296 -0.6201172,0.59532 -0.6201172,1.64952 0,1.19062 0.7193359,1.79834 0.7193359,0.59531 2.1952148,0.59531 1.227832,0 2.2448242,-0.47129 1.0169922,-0.48369 1.8851562,-1.15342 z"
style="stroke-width:0.26458332"
id="path1651"
inkscape:connector-curvature="0" />
<path
d="m 28.971874,284.08085 q 0,1.73633 -0.496094,3.12539 -0.483691,1.38906 -1.314648,2.33164 -0.880566,0.97978 -1.934766,1.47588 -1.054199,0.48369 -2.319238,0.48369 -1.178223,0 -2.058789,-0.28526 -0.880566,-0.27285 -1.736328,-0.74414 l -0.148828,0.64493 H 16.78037 v -19.29805 h 2.331641 v 6.8957 q 0.979785,-0.80615 2.083594,-1.31465 1.103808,-0.52089 2.480468,-0.52089 2.455664,0 3.869532,1.88515 1.426269,1.88516 1.426269,5.32061 z m -2.406055,0.062 q 0,-2.48047 -0.818554,-3.75791 -0.818555,-1.28984 -2.641699,-1.28984 -1.016993,0 -2.058789,0.44648 -1.041797,0.43408 -1.934766,1.12861 v 7.9375 q 0.992187,0.44649 1.699121,0.62012 0.719336,0.17363 1.624707,0.17363 1.934766,0 3.026172,-1.26504 1.103808,-1.27744 1.103808,-3.99355 z"
style="stroke-width:0.26458332"
id="path1653"
inkscape:connector-curvature="0" />
</g>
<path
style="fill:none;stroke:#000000;stroke-width:1.89999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 0.66145835,293.29584 29.137242,293.16354"
id="path1656"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.5 KiB

View File

@@ -0,0 +1,107 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="undo.svg">
<defs
id="defs5285">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 15 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="30 : 15 : 1"
inkscape:persp3d-origin="15 : 10 : 1"
id="perspective5921" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.313708"
inkscape:cx="82.017664"
inkscape:cy="53.86011"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<flowRoot
xml:space="preserve"
id="flowRoot5913"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"><flowRegion
id="flowRegion5915"><rect
id="rect5917"
width="129.22377"
height="91.747108"
x="-13.788582"
y="-33.515606" /></flowRegion><flowPara
id="flowPara5919" /></flowRoot> <g
aria-label="⎌"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:38.09999847px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
id="text847">
<path
d="m 11.014771,277.24364 -4.7252931,3.75791 -1.1348144,-5.93452 2.0835937,0.76274 q 1.1534179,-1.54409 2.8463378,-2.49287 2.195215,-1.24643 4.743896,-1.24643 2.548682,0 4.725293,1.22783 2.195215,1.20923 3.423047,3.36724 1.246435,2.158 1.246435,4.85551 v 0.11162 q 0.706934,0.14883 1.339453,0.5023 1.097608,0.61391 1.711524,1.69292 0.632519,1.079 0.632519,2.41846 0,1.33945 -0.613916,2.41845 -0.613916,1.0604 -1.711523,1.69292 -1.079004,0.61392 -2.38125,0.61392 -1.265039,0 -2.38125,-0.61392 -1.116211,-0.61391 -1.730127,-1.69292 -0.595312,-1.079 -0.595312,-2.41845 0,-1.30225 0.613916,-2.38125 0.632519,-1.09761 1.730127,-1.71153 0.799951,-0.46509 1.674316,-0.57671 v -0.0558 q 0,-2.26963 -1.023193,-4.05556 -1.00459,-1.78594 -2.771924,-2.73472 -1.767334,-0.96738 -3.888135,-0.96738 -2.046386,0 -3.81372,0.96738 -1.2092287,0.65112 -2.0649904,1.71152 z m -4.5578614,4.29741 q 1.2836425,0 2.3626464,0.61392 1.0976073,0.61391 1.711523,1.69292 0.63252,1.079 0.63252,2.41846 0,1.33945 -0.613916,2.41845 -0.6139161,1.0604 -1.7115235,1.69292 -1.0790039,0.61392 -2.3812499,0.61392 -1.265039,0 -2.3812499,-0.61392 -1.1162109,-0.61391 -1.7301269,-1.69292 -0.5953125,-1.079 -0.5953125,-2.41845 0,-1.30225 0.613916,-2.38125 0.6325195,-1.09761 1.7301269,-1.71153 1.0976074,-0.63252 2.3626464,-0.63252 z m 0,1.39527 q -0.8557617,0 -1.6185058,0.40927 -0.7627441,0.40928 -1.2092285,1.19063 -0.4278808,0.76274 -0.4278808,1.73013 0,0.93017 0.4092773,1.73012 0.4278808,0.79995 1.2092285,1.20923 0.7813476,0.40928 1.6371093,0.40928 0.9301757,0 1.6743163,-0.40928 0.7441406,-0.40928 1.190625,-1.20923 0.4464843,-0.79995 0.4464843,-1.73012 0,-0.96739 -0.4464843,-1.73013 -0.4464844,-0.78135 -1.2092285,-1.19063 -0.7441406,-0.40927 -1.6557128,-0.40927 z m 16.7431634,0 q -0.855762,0 -1.618506,0.40927 -0.762744,0.40928 -1.209228,1.19063 -0.427881,0.76274 -0.427881,1.73013 0,0.93017 0.409277,1.73012 0.427881,0.79995 1.209229,1.20923 0.781347,0.40928 1.637109,0.40928 0.930176,0 1.674316,-0.40928 0.744141,-0.40928 1.190625,-1.20923 0.446485,-0.79995 0.446485,-1.73012 0,-0.96739 -0.446485,-1.73013 -0.446484,-0.78135 -1.209228,-1.19063 -0.744141,-0.40927 -1.655713,-0.40927 z"
style="stroke-width:0.39687496"
id="path4552"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

@@ -0,0 +1,196 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="zoom-fit-horizontal.svg">
<defs
id="defs5285">
<marker
inkscape:stockid="Arrow2Lend"
orient="auto"
refY="0.0"
refX="0.0"
id="marker1403"
style="overflow:visible;"
inkscape:isstock="true">
<path
id="path1401"
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
transform="scale(1.1) rotate(180) translate(1,0)" />
</marker>
<marker
inkscape:stockid="Arrow2Lstart"
orient="auto"
refY="0.0"
refX="0.0"
id="marker1233"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1231"
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
transform="scale(1.1) translate(1,0)" />
</marker>
<marker
inkscape:stockid="Arrow2Lend"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow2Lend"
style="overflow:visible;"
inkscape:isstock="true">
<path
id="path890"
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
transform="scale(1.1) rotate(180) translate(1,0)" />
</marker>
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow1Lend"
style="overflow:visible;"
inkscape:isstock="true">
<path
id="path872"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
transform="scale(0.8) rotate(180) translate(12.5,0)" />
</marker>
<marker
inkscape:stockid="Arrow1Lstart"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow1Lstart"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path869"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
transform="scale(0.8) translate(12.5,0)" />
</marker>
<marker
inkscape:stockid="Arrow2Lstart"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow2Lstart"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path887"
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
transform="scale(1.1) translate(1,0)" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="94.655376"
inkscape:cy="15.192979"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<rect
style="fill:#b2b2b2;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1"
id="rect837"
width="21.504547"
height="23.793741"
x="6.3917084"
y="271.76974" />
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.98188132;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="rect849"
width="20.901302"
height="23.074667"
x="5.2826071"
y="270.86334" />
<g
id="g874">
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="M 25.589844,282.17773 5.8125,282.2793 l 0.00195,0.5 19.7773439,-0.10157 z"
id="path867"
inkscape:connector-curvature="0" />
<path
d="m 11.16951,284.72011 -6.0203539,-2.17927 5.9979569,-2.24017 c -0.9534,1.30948 -0.938823,3.0944 0.0224,4.41944 z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.34375;stroke-linejoin:round;stroke-opacity:1"
id="path880"
inkscape:connector-curvature="0" />
<path
d="m 20.234659,280.237 6.020354,2.17927 -5.997957,2.24017 c 0.9534,-1.30948 0.938823,-3.0944 -0.0224,-4.41944 z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.34375;stroke-linejoin:round;stroke-opacity:1"
id="path882"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.3 KiB

View File

@@ -0,0 +1,193 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="zoom-fit-vertical.svg">
<defs
id="defs5285">
<marker
inkscape:stockid="Arrow2Lend"
orient="auto"
refY="0.0"
refX="0.0"
id="marker1403"
style="overflow:visible;"
inkscape:isstock="true">
<path
id="path1401"
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
transform="scale(1.1) rotate(180) translate(1,0)" />
</marker>
<marker
inkscape:stockid="Arrow2Lstart"
orient="auto"
refY="0.0"
refX="0.0"
id="marker1233"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1231"
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
transform="scale(1.1) translate(1,0)" />
</marker>
<marker
inkscape:stockid="Arrow2Lend"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow2Lend"
style="overflow:visible;"
inkscape:isstock="true">
<path
id="path890"
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
transform="scale(1.1) rotate(180) translate(1,0)" />
</marker>
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow1Lend"
style="overflow:visible;"
inkscape:isstock="true">
<path
id="path872"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
transform="scale(0.8) rotate(180) translate(12.5,0)" />
</marker>
<marker
inkscape:stockid="Arrow1Lstart"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow1Lstart"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path869"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
transform="scale(0.8) translate(12.5,0)" />
</marker>
<marker
inkscape:stockid="Arrow2Lstart"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow2Lstart"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path887"
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
transform="scale(1.1) translate(1,0)" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="55.81609"
inkscape:cy="15.192979"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<rect
style="fill:#b2b2b2;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1"
id="rect837"
width="21.504547"
height="23.793741"
x="6.3917084"
y="271.76974" />
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.98188132;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="rect849"
width="20.901302"
height="23.074667"
x="5.2826071"
y="270.86334" />
<path
inkscape:connector-curvature="0"
id="path1229"
d="m 16.21875,271.39062 -0.5,0.004 0.189453,21.96875 0.5,-0.004 z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
<path
inkscape:connector-curvature="0"
id="path866"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.34375;stroke-linejoin:round;stroke-opacity:1"
d="m 13.797,276.75622 2.157975,-6.02802 2.261356,5.99 c -1.312844,-0.94876 -3.097695,-0.92788 -4.419331,0.038 z" />
<path
inkscape:connector-curvature="0"
id="path868"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.34375;stroke-linejoin:round;stroke-opacity:1"
d="m 18.330976,287.99787 -2.157975,6.02802 -2.261356,-5.99 c 1.312844,0.94876 3.097695,0.92788 4.419331,-0.038 z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.3 KiB

View File

@@ -0,0 +1,211 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="zoom-fit.svg">
<defs
id="defs5285">
<marker
inkscape:stockid="Arrow2Lend"
orient="auto"
refY="0.0"
refX="0.0"
id="marker1403"
style="overflow:visible;"
inkscape:isstock="true">
<path
id="path1401"
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
transform="scale(1.1) rotate(180) translate(1,0)" />
</marker>
<marker
inkscape:stockid="Arrow2Lstart"
orient="auto"
refY="0.0"
refX="0.0"
id="marker1233"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1231"
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
transform="scale(1.1) translate(1,0)" />
</marker>
<marker
inkscape:stockid="Arrow2Lend"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow2Lend"
style="overflow:visible;"
inkscape:isstock="true">
<path
id="path890"
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
transform="scale(1.1) rotate(180) translate(1,0)" />
</marker>
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow1Lend"
style="overflow:visible;"
inkscape:isstock="true">
<path
id="path872"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
transform="scale(0.8) rotate(180) translate(12.5,0)" />
</marker>
<marker
inkscape:stockid="Arrow1Lstart"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow1Lstart"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path869"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
transform="scale(0.8) translate(12.5,0)" />
</marker>
<marker
inkscape:stockid="Arrow2Lstart"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow2Lstart"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path887"
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
transform="scale(1.1) translate(1,0)" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="94.655376"
inkscape:cy="15.192979"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<rect
style="fill:#b2b2b2;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1"
id="rect837"
width="21.504547"
height="23.793741"
x="6.3917084"
y="271.76974" />
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.98188132;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="rect849"
width="20.901302"
height="23.074667"
x="5.2826071"
y="270.86334" />
<g
id="g874">
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="M 25.589844,282.17773 5.8125,282.2793 l 0.00195,0.5 19.7773439,-0.10157 z"
id="path867"
inkscape:connector-curvature="0" />
<path
d="m 11.16951,284.72011 -6.0203539,-2.17927 5.9979569,-2.24017 c -0.9534,1.30948 -0.938823,3.0944 0.0224,4.41944 z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.34375;stroke-linejoin:round;stroke-opacity:1"
id="path880"
inkscape:connector-curvature="0" />
<path
d="m 20.234659,280.237 6.020354,2.17927 -5.997957,2.24017 c 0.9534,-1.30948 0.938823,-3.0944 -0.0224,-4.41944 z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.34375;stroke-linejoin:round;stroke-opacity:1"
id="path882"
inkscape:connector-curvature="0" />
</g>
<path
inkscape:connector-curvature="0"
id="path1229"
d="m 16.21875,271.39062 -0.5,0.004 0.189453,21.96875 0.5,-0.004 z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
<path
inkscape:connector-curvature="0"
id="path866"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.34375;stroke-linejoin:round;stroke-opacity:1"
d="m 13.797,276.75622 2.157975,-6.02802 2.261356,5.99 c -1.312844,-0.94876 -3.097695,-0.92788 -4.419331,0.038 z" />
<path
inkscape:connector-curvature="0"
id="path868"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.34375;stroke-linejoin:round;stroke-opacity:1"
d="m 18.330976,287.99787 -2.157975,6.02802 -2.261356,-5.99 c 1.312844,0.94876 3.097695,0.92788 4.419331,-0.038 z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -0,0 +1,119 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="zoom-in.svg">
<defs
id="defs5285">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 15 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="30 : 15 : 1"
inkscape:persp3d-origin="15 : 10 : 1"
id="perspective5921" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.313708"
inkscape:cx="95.629471"
inkscape:cy="75.073314"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<flowRoot
xml:space="preserve"
id="flowRoot5913"
style="fill:black;fill-opacity:1;stroke:none;font-family:sans-serif;font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;letter-spacing:0px;word-spacing:0px"><flowRegion
id="flowRegion5915"><rect
id="rect5917"
width="129.22377"
height="91.747108"
x="-13.788582"
y="-33.515606" /></flowRegion><flowPara
id="flowPara5919"></flowPara></flowRoot> <ellipse
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path5985"
cx="10.996745"
cy="278.08231"
rx="6.4988279"
ry="6.4161458" />
<path
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 15.64349,283.14245 6.482291,7.27604"
id="path5987"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="m 6.8988947,278.38468 8.1617433,-0.0935"
id="path5991"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="m 10.944687,274.38566 0.07016,7.90449"
id="path5993"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@@ -0,0 +1,114 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="zoom-out.svg">
<defs
id="defs5285">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 15 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="30 : 15 : 1"
inkscape:persp3d-origin="15 : 10 : 1"
id="perspective5921" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.313708"
inkscape:cx="95.629471"
inkscape:cy="75.073314"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<flowRoot
xml:space="preserve"
id="flowRoot5913"
style="fill:black;fill-opacity:1;stroke:none;font-family:sans-serif;font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;letter-spacing:0px;word-spacing:0px"><flowRegion
id="flowRegion5915"><rect
id="rect5917"
width="129.22377"
height="91.747108"
x="-13.788582"
y="-33.515606" /></flowRegion><flowPara
id="flowPara5919"></flowPara></flowRoot> <ellipse
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path5985"
cx="10.996745"
cy="278.08231"
rx="6.4988279"
ry="6.4161458" />
<path
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 15.64349,283.14245 6.482291,7.27604"
id="path5987"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="m 6.8988947,278.38468 8.1617433,-0.0935"
id="path5991"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.0 KiB